1、 P1 sbit LCD_RS=P20; sbit LCD_RW=P21; sbit LCD_E=P22; /*定义函数*/ # define ucharunsigned char # define uint unsigned int void LCD_init(void);/声明初始化函数 void LCD_write_command(uchar command);/写指令函数 void LCD_write_data(uchar dat);/写数据函数 void LCD_disp_char(uchar x,uchar y,uchar dat);/在某个屏幕位置上显示一 个字符,X(0-16)
2、,y(1-2) /void LCD_check_busy(void);/检查忙函数。我没用到此函数,因为通过率极 低。 void delay_n40us(uint n);/延时函数 /* /*初始化函数* void LCD_init(void) LCD_write_command(0x38);/设置8位格式,2行,5x7 LCD_write_command(0x0c);/整体显示,关光标,不闪烁 /LCD_write_command(0x06);/设定输入方式,增量不移位 /LCD_write_command(0x01);/清除屏幕显示 delay_n40us(100);/实践证明,我的LCD
3、1602上,用for 循环200 次就能可靠 完成清屏指令。 /*写指令函数*设置先向1602写入的数据为地址* void LCD_write_command(uchar dat) LCD_DB=dat; LCD_RS=0;/指令 LCD_RW=0;/写入 LCD_E=1;/允许 LCD_E=0;/产生下降沿 delay_n40us(1);/实践证明,我的LCD1602 上,用for 循环1 次就能完成普通 写指令。 /* /*再写数据函数*向1602中写入数据* LCD_write_data(uchar dat) LCD_RS=1;/数据 /*显示一个字符函数* void LCD_disp_
4、char(uchar x,uchar y,uchar dat) uchar address; if(y=1) address=0x80+x; else address=0xc0+x; LCD_write_command(address); LCD_write_data(dat); /*检查忙函数* voidLCD_check_busy() /实践证明,在我的LCD1602 上,检查忙指令通 LCD_E=0; /for 循环作延时,普通指令只要1次循就可完成。清屏指令 /要用200次循环便能完成。 LCD_RW=1; LCD_DB=0xff; while(LCD_DB7=1); */ /*延时函数* void delay_n40us(uint n) uint i; uchar j; for(i=n;i;0;i-) for(j=0;j2;j+); /在这个延时循环函数中我只做了 2次循环, /实践证明我的LCD1602 上普 通的指令只需1次循环就能可靠完成。 /*主函数* void main(void) LCD_init(); LCD_disp_char(0,1,"A&); while(1); 过率极低,以至于不能正常使用LCD。因此我没有再用检查忙函数。而使 do/用了延时的方法,延时还是非常好用的。我试了一下,用/