1.LCD1602的操作主要由三位引脚决定,RS、R/W、E。其中,RS寄存器控制显示的位置或者显示的内容,RS=0(位置),RS=1(内容),R/W寄存器控制读写操作。E引脚的主要功能是使能信号,E端由高电平跳变成低电平时,液晶模块才会执行命令。
2.除了以上提到的三个引脚,数据总线由DB0-DB7组成。主要用来传输数据以及相关的操作信号。
3.注意:1,2脚为正负电源线,接错会导致显示器烧坏,3脚时液晶驱动电源的引脚,会对对比度产生影响,接正电源时对比度最低,接地时对比度最高,当然,对比度过高的话会产生鬼影。所以可以加一个几千欧姆的电位器来调整对比度。
4.LCD1602有两种控制模式,一种为直接控制模式,一种是间接控制模式,直接控制模式即连接了上述提到的所有引脚,一般适用于引脚线充足的情况,而间接控制模式则是只采用了DB4-DB7这四根线,传送数据时先传送数据或者命令的高四位,再传送低四位。
5.由于LCD1602的显示点阵共有16*2=32位,所以要确定LCD1602的显示位置时,至少要用到五个bit,需要注意的是,LCD1602的基本单元中最高位固定为1(1000 0000),剩下7位对应LCD1602的内部显示地址。
因为写入显示地址时要求最高位D7恒为1,所以如果你要指定显示的位置,第一行第一个位置的地址为00H,此时写入的地址不能为00H,而是80H(0000,0000B +1000,0000B = 1000,0000B),同理第二行首地址40H,加上80H后为C0H。
以上是1602的内部地址以及相关说明。
一般来说,LDC1602有相关的指令集,但尚不清楚是否在不同单片机之间通用,故此处不做说明,如想了解相关的指令集,请查阅对应型号的中文用户手册。
//说明:P2口对应D7-D1,P1口有三个引脚RS,RW,E #include#define uchar unsigned char #define uint unsigned int #define RS_SET P1OUT |= BIT5 //控制显示位置和显示数据 #define RS_LOW P1OUT &= ~BIT5 #define RW_SET P1OUT |= BIT6 //控制读写操作 #define RW_LOW P1OUT &= ~BIT6 #define E_SET P1OUT |= BIT7 //写入使能 #define E_LOW P1OUT &= ~BIT7 #define BUSY_OUT P2DIR |= BIT7 //液晶判忙 #define BUSY_IN P2DIR &= ~BIT7 #define BUSY_NUM P2IN&BIT7 //BIT7对应D7 void Delay(uint x){ int i; while(x--){for(i=0;i<200;i++);} } void LcdBusy(void){ RS_LOW; RW_SET; E_SET; //RS=0,RW=1,D7=BF,BF为忙标志位,高电平为忙,模块不能接受命令或数据。 _NOP(); //用几空指令产生短延时效果 BUSY_IN; while(BUSY_NUM); BUSY_OUT; E_LOW; } //写指令 void Write_where(uchar com){ LcdBusy(); //写入操作之前先判忙 RS_LOW; RW_LOW; E_SET; //凡是写入,E都要为1 _NOP();_NOP(); //一个NOP的延时大约几微秒 P2OUT = com; _NOP(); E_LOW; } //写数据 void Write_what(uchar com){ LcdBusy(); RS_SET; RW_LOW; E_SET; _NOP();_NOP(); P2OUT = com; _NOP();_NOP(); E_LOW; } //设置光标位置,x为横坐标,y为纵坐标 void LCD_set_xy(uchar x,uchar y){ uchar adress; if(y==0x01) //0x01为第一行 adress = 0x80+x; else adress = 0xc0+x; //x可以看作偏移地址 Write_where(adress); } //写入字符,x横坐标,y纵坐标 void Lcd_Write_char(uchar x,uchar y,uchar data){ LCD_set_xy(x,y); Writr_what(data); } //写入一串字符 void LCD_Write_str(uchar x,uchar y,uchar *str){ LCD_set_xy(x,y); while(*str){ P2OUT = *str; Write_what(*s); s++; } } //初始设置 void LCD(void){ Write_where(0x38); //8位数据口,两行显示,5*7点阵 Delay(5); //延时以让指令生效 Write_where(0x0c);Delay(5); //开显示,无光标 Write_where(0x06);Delay(5); Write_where(0x01);Delay(5); //清屏 } void IO(){ P1SEL = 0x00; P2SEL = 0x00; P1DIR = OXFF; P2DOR = 0xFF; }



