51单片机-LCD1602显示(无字库)
LCD1602液晶显示屏显示
字符显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
汉字的显示
汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。
LCD1602液晶显示屏引脚说明
引脚 | 功能 |
---|---|
VDD | 电源正极 |
VSS | 电源地 |
VL | 液晶显示偏压 |
RS | 数据/命令选择 |
R/W | 读/写选择 |
E | 使能信号 |
D0~D7 | 数据 |
BLA | 背光源正极 |
BLK | 背光源负极 |
- VSS为地电源。
- VDD接5V正电源。
- VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 >* RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
- R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
- E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
- D0~D7为8位双向数据线。
- BLA背光源正极。
- BLK背光源负极。
LCD1602液晶显示屏11条控制指令
指令 | RS R/W D7 D6 D5 D4 D3 D2 D1 D0 |
---|---|
清显示 | 0 0 0 0 0 0 0 0 0 1 |
光标返回 | 0 0 0 0 0 0 0 0 1 * |
置输入模式 | 0 0 0 0 0 0 0 1 I/D S |
显示开/关控制 | 0 0 0 0 0 0 1 D C B |
光标或字符移位 | 0 0 0 0 0 1 S/C R/L * * |
置功能 | 0 0 0 0 1 DL N F * * |
置字符发生存贮器地址 | 0 0 0 1 字符发生存贮器地址 |
置数据存贮器地址 | 0 0 1 显示数据存贮器地址 |
读忙标志或地址 | 0 1 BF 计数器地址 |
写数到CGRAM或DDRAM | 1 0 要写的数据内容 |
从CGRAM或DDRAM读数 | 1 1 读出的数据内容 |
- 清显示,指令码01H,光标复位到地址00H位置。
- 光标复位,光标返回到地址00H。
- 光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
- 显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
- 光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
- 功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
- 字符发生器RAM地址设置。
- DDRAM地址设置。
- 读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
- 写数据。
- 读数据。
LCD1602读写时序图
符号 | 时限 |
---|---|
tc | 400ns~ |
tpw | 150ns~ |
tr,tf | ~25ns |
tsp1 | 30ns~ |
thd1 | 10ns~ |
td | ~200ns |
thd2 | 20ns~ |
tsp2 | 40ns~ |
LCD1602的RAM地址映射
LCD1602默认字库
其中00H-07H用户可以自定义保存字符。通过字模软件或者自己编写字模代码写入字库中,后期可以调用使用。
下面为参考程序
/*delayms()函数自己补全*/
#define EN P3^4
#define RS P3^5
#define RW P3^6
#define DATAPORT P0
sbit En = EN;
sbit Rs = RS;
sbit Rw = RW;
void lcd_delayms(){
unsigned int x,y;
for(x=1;x>0;x--)
for(y=114;y>0