大家好,又见面了,我是你们的朋友全栈君。
描述
lcd1602显示程序代码
前些天弄了最小系统板后就想着学习1602的显示程序,可惜坛子里的或网上的,都没有简单的1602显示程序,无柰在网上下载了一段经过反复修改测试,终于有了下面一段代码:
// – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
// – – 初始化接口
# define LCD_DB P0 // – – P0 = DB0~DB7
sbit LCD_RS=P2^0; // – – p2.0 = RS
sbit LCD_RW=P2^1; // – – p2.1 = RW
sbit LCD_E=P2^2; // – – p2.2 = E
// – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
// – – 定义函数
# define uchar unsigned char
# define uint unsigned int
// – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
// – – 定义子程序函数
void LCD_init(void); // – – 初始化LCD1602函数
void LCD_write_command(uchar command); // – – 向LCD1602写指令函数
void LCD_write_data(uchar dat); // – – 向LCD1602写数据函数
void LCD_set_xy(uchar x,uchar y); // – – 设置LCD1602显示位置 X(0-16),y(1-2)
void LCD_disp_char(uchar x,uchar y,uchar dat); // – – 在LCD1602上显示一个字符
void LCD_disp_string(uchar X,uchar Y,uchar *s); // – – 在LCD1602上显示一个字符串
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
void LCD_delay_10us(uint n); // – – 10微秒的延时子程序
void LCD_delay_50us(uint n); // – – 50微秒的延时子程序
// – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
// – – 初始化LCD1602
void LCD_init(void)
{
LCD_delay_10us(20);
LCD_write_command(0x38); // – – 设置8位格式,2行,5×7
LCD_delay_10us(5);
LCD_write_command(0x0c); // – – 整体显示,关光标,不闪烁
LCD_delay_10us(5);
LCD_write_command(0x06); // – – 设定输入方式,增量不移位
LCD_delay_10us(5);
LCD_write_command(0x01); // – – 清除屏幕显示
LCD_delay_50us(40);
}
//********************************
// – – 向LCD1602写指令
void LCD_write_command(uchar dat)
{
LCD_delay_10us(5);
LCD_RS=0; // – – 指令
LCD_RW=0; // – – 写入
LCD_DB=dat;
LCD_delay_10us(5);
LCD_E=1; // – – 允许
LCD_delay_10us(5);
LCD_E=0;
}
// – – 向LCD1602写数据
void LCD_write_data(uchar dat)
{
LCD_delay_10us(5);
LCD_RS=1;// – – 数据
LCD_RW=0;// – – 写入
LCD_DB=dat;
LCD_delay_10us(5);
LCD_E=1;// – – 允许
LCD_delay_10us(5);
LCD_E=0;
}
// – – 设置显示位置
void LCD_set_xy(uchar x,uchar y)
{
uchar address;
if(y==1)
{
address=0x80+x; // – – 第一行位置
} else {
address=0xc0+x; // – – 第二行位置
}
LCD_delay_10us(5);
LCD_write_command(address);
}
// – – 显示一个字符函数
void LCD_disp_char(uchar x,uchar y,uchar dat) // – – LCD_disp_char(0,1,0x38); // – – 显示8
{
LCD_set_xy(x,y);
LCD_delay_10us(5);
LCD_write_data(dat);
}
// – – 显示一个字符串函数
void LCD_disp_string(uchar x,uchar y,uchar *s)
{
LCD_set_xy(x,y);
LCD_delay_10us(5);
while(*s!=‘\0’)
{
LCD_write_data(*s);
s++;
}
}
//********************************
/*******检查忙函数*************
void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{ //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
do //用了延时的方法,延时还是非常好用的。我试了一下,用
{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令
LCD_RS=0; //要用200次循环便能完成。
LCD_RW=1;
LCD_DB=0xff;
LCD_E=1;
}while(LCD_DB^7==1);
}
******************************/
void LCD_delay_10us(uint n) // – – 10微秒的延时子程序
{
uint i,j;
for(i=n;i》0;i–)
for(j=2;j》0;j–);
}
void LCD_delay_50us(uint n) // – – 50微秒的延时子程序
{
uint i,j;
for(i=n;i》0;i–)
for(j=22;j》0;j–);
}
LCD1602显示程序流程图及句解
让LCD1602显示字符前要输入字符所在的地址,这也是每显示一个字符地址要加一的原因,在下面的一段代码里你会明白怎么设置地址,怎么让地址自动加一,怎么清屏,怎么显示字符,希望你能看懂哦
sbit LCD_E=P2^0; //lcd1602控制置位
sbit LCD_RW=P2^1; //lcd1602控制置位
sbit LCD_RS=P2^2; //lcd1602控制置位
void LCD_command(unsigned char com)
{
LCD_E=0;
LCD_RW=0;
LCD_RS=0;
P1=com;
delay_us(100);
LCD_E=1;
delay_us(100);
LCD_E=0;
}
void LCD_date(unsigned char dat)
{
LCD_E=0;
LCD_RW=0;
LCD_RS=1;
P1=dat;
delay_us(100);
LCD_E=1;
delay_us(100);
LCD_E=0;
}
LCD_command(0x38); //设置LCD为16*2显示,5*7点阵,8位数据接口
LCD_command(0x0c); //设置LCD显示开,光标显示关
LCD_command(0x06); //写一个数据后地址加1
LCD_command(0x01); //显示清屏
LCD_command(0x80); //数据指针设置为第一行第一位
LCD_date(‘pi’);
LCD_date(‘l’);
LCD_date(‘e’);
LCD_date(‘a’);
LCD_date(‘s’);
LCD_date(‘e’);
LCD_date(‘ ’);
LCD_date(‘c’);
LCD_date(‘h’);
LCD_date(‘e’);
LCD_date(‘c’);
LCD_date(‘k’);
LCD_date(‘ ’);
LCD_date(‘t’);
LCD_date(‘h’);
LCD_date(‘e’);
LCD_command(0x80+0x40); //LCD地址指针指向第二行第一个位置
LCD_date(‘c’);
LCD_date(‘o’);
LCD_date(‘n’);
LCD_date(‘n’);
LCD_date(‘e’);
LCD_date(‘c’);
LCD_date(‘t’);
LCD_date(‘i’);
LCD_date(‘o’);
LCD_date(‘n’);
LCD_date(‘!’);
LCD_date(‘!’);
打开APP阅读更多精彩内容
点击阅读全文
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160128.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...