关于51单片机LCD1602

主要记录下lcd1602的使用,怕忘了
开发板:HC6800-EM3 V3.0
单片机:stc89c52rc

首先看lcd1602模块的电路图关于51单片机LCD1602_第1张图片
结构很清晰,就不多说了,需要注意的VO这个引脚,用来调节屏幕对比度的,字符显示不清晰可通过改变电阻值来调节。电压越低对比度越高。
编程是主要使用的是4-14根引脚。
找MCU的对应引脚连接硬件,开发板上数码管下方已经有焊接lcd对应的引脚,可以直接使用。也可以自己用杜邦线直接接对应的IO口,挺好玩的,不过自己接线的话需要解决VO口外接电阻的问题,不能直接接地(因为直接接地导致显示不正常,找了半天问题)。用的是P2.5-P2.7以及P0口。

lcd操作比较简单,简单初始化后就可以读写,主要是写操作。下面写下初始化和读写操作。
1.初始化:

void lcd1602_init()
{
    delay_nms(15);
    lcd1602_writeComm(0x38);
    delay_nms(5);
    lcd1602_writeComm(0x38);
    delay_nms(5);
    lcd1602_writeComm(0x38);
    lcd1602_writeComm(0x08);
    lcd1602_writeComm(0x01);
    lcd1602_writeComm(0x06);
    lcd1602_writeComm(0x0f);    
}

2.写命令:

void lcd1602_writeComm(uchar dat)
{
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DATA = dat;
    delay_nms(1);
    LCD1602_LCDE = 1;
    delay_nms(1);
    LCD1602_LCDE = 0;
}

3.写数据:

void lcd1602_writeData(uchar dat)
{
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DATA = dat;
    delay_nms(1);
    LCD1602_LCDE = 1;
    delay_nms(1);
    LCD1602_LCDE = 0;
}

4.读数据:

uchar lcd1602_readData()
{

    uchar lcddata;
    LCD1602_DATA = 0xff;   //很重要,不写则读失败  为什么????        
    LCD1602_LCDE = 0;
    delay_nms(1);
    LCD1602_RS = 1;
    LCD1602_RW = 1;
    LCD1602_LCDE = 1;
    delay_nms(1);
    lcddata = LCD1602_DATA;
    delay_nms(1);
    LCD1602_LCDE = 0;
    return lcddata;
}

5.忙等:

bit lcd1602_busy()  
{                            
    bit result;  
    LCD1602_RS = 0;  
    LCD1602_RW = 1;  
    LCD1602_LCDE = 1;  
    delay_nms( 1 );  
    result = (bit)(P0&0x80);  
    LCD1602_LCDE = 0;  
    return result;
} 

首先讲一下初始化
关于51单片机LCD1602_第2张图片
关于51单片机LCD1602_第3张图片

需要注意
4.1.2的命令中整屏左移、右移其实只是移动一个字符,即整个屏所有字符都左右移动一个字符。
4.2.1 地址值是从80H开始计算的,第一行为显示的是00H-0FH,第二行显示40H-4FH,其余不显示,需要左右移动才能显示。
读写数据的过程可以简化为下图:
关于51单片机LCD1602_第4张图片
这里注意两点
1.1读状态操作可以用来测试lcd内部是否繁忙当前地址指针的数值
关于51单片机LCD1602_第5张图片
要注意每个指令之间需要判断lcd是否繁忙或者需要延时等待操作
可以参考时序图关于51单片机LCD1602_第6张图片
关于51单片机LCD1602_第7张图片
关于51单片机LCD1602_第8张图片

你可能感兴趣的:(51单片机)