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++);}
}
/*LCD1602的显示速度相对于单片机的输出速度是较慢的,所以执行每条指令之前都要先读入忙
标志,当忙标志为低电平时,表示不忙,此时输入的指令才可以生效,否则此指令无效,当然也
可以选择不读入忙标志位,而是在每条指令后加一小段延时*/
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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)