LCD1602(16*2)
一.原理部分
1.引脚
显示容量:16*2个字符

VO(对比度):值太小显示会很浅,看不清,值太大每个像素都显示出来,无法辨别哪些是我们想要的,我们用R1来调节
D1~D7:并行传送模式,最好接在一组io口上,D0—P0_1,D7—P0_7(高位对高位,低位对低位)
RS(在哪写)&RW(写什么)&E:控制引脚,控制D1~D7
E:上升沿的时候把数据传到D1~D7,下降沿的时候执行命令
2.内部结构

C(character)G(generater)字符生成
CGRAM是可写的,是自定义存储数据
CGROM不可写,早已规定,相当于字典
字模库就是段码表
D(data)D(display)数据显示
DDRAM,用户可写,对应到屏幕的话只会显示前16列(前16列映射到屏幕上),从第17列开始可以写,因为屏幕不够大所以显示不了(问题不大)
3.段码表
我们先要有一个段码表,然后找索引对应屏幕里的

可写的只有八个,在0001 0000-0001 0111
不可写e.g.比如A,对应0100 0001—转16进制—>0x41
4.时序图


最高位为1位置不同可以区分不同的指令
- 特别是在DB7置1绝对是要操作DDRAM
5.设置光标位置DDRAM(数据显示)

第一行:1000 0000 —>0x80
第二行:1100 0000 —>0xC0
两串的第一个1都代表要进入DDRAM这个指令
因为第一行的地址是00所以后接000 0000,第二行的地址是40所以后接100(二转十就是4) 0000
二.代码部分
1.子函数
①LCD_WriteCommand
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS=0; //0为指令
LCD_RW=0; //0为输入
LCD_DataPort=Command;
LCD_E=1;
LCD_Delay(); //延缓快速上下拉
LCD_E=0;
LCD_Delay(); //延缓快速上下拉
}
②LCD_DataCommand
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1; //0为数据
LCD_RW=0; //0为输入
LCD_DataPort=Data;
LCD_E=1;
LCD_Delay(); //延缓快速上下拉
LCD_E=0;
LCD_Delay(); //延缓快速上下拉
}
③LCD_Init
void LCD_Init(void)
{
LCD_WriteCommand(0x38); //八位数据接口,两行显示,5x7点阵屏
LCD_WriteCommand(0x0C); //显示开,光标关,闪烁关
LCD_WriteCommand(0x06); //数据读写操作后,光标自动加一,画面不动
LCD_WriteCommand(0x01); //清屏
}
④.LCD_ShowChar
LCD_WriteCommand(0x80|Column-1);
👆理解:Column是列。列-1再并上0x80才转换为对应的地址
- e.g. 当选择(1,2)时,由DDRAM的表格我们得知该位置的地址是01H
- 此时传参到Column的是2,2-1=1,1—10进制转2进制—>0001
- 1000 0000|0000 0001=1000 0001
- 把
1000 0001分成两个模块 1是指进入DDRAM模式000 0001对应01H,写入到(1,2)位上