LCD1602的相关介绍以及初始设置

相关介绍:

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<MSP430.H>
#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;
}




 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值