①介绍
LCD(Liquid Crystal Display),LCD1602模块,其中16表示每一行可以显示”16”个字符,”02”表示一共有两行。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的两条线是背光电源线VCC和地线GND,控制原理与14脚的LCD完全一样。
字符LCD的引脚定义如下图1所示。
图1 字符型LCD引脚定义表
使用LCD1602显示模块实现显示的主要思路就是,首先确定显示的位置(在LCD显示屏上有32个空格),然后是确定要显示的内容或字符。LCD的DB0~7为输入输出的接口,在确定显示位置和内容时要通过这些端口传输数据。
在确定显示位置时,由于只有32个空格,不需要用一个字节来确定。所以最高位(bit7)固定为1。剩下的七位的数据与确定的显示位置的关系如下图2所示。
图2 DDRAM地址与显示位置的对应关系
在确定了显示位置后,要确定的是显示内容。同样用到的是一个字节的数据来确定要显示的字符。数据与显示字符的对应关系如下图3所示。
图3 CGROM中字符码与字字符字模关系对照表
②指令功能
LCD1602模块共有11条指令,包括:清屏指令、光标归位指令、进入模式设置指令、显示开关控制指令、设定显示屏或光标移动方向指令、功能设定指令、设定CGRAM指令、设定DDRAM地址指令、读取忙信号或AC地址指令、数据写入DDRAM或CGRAM指令、从CGRAM或DDRAM读出数据指令。
有图1中对于RS引脚的作用描述可以看出,当RS=0时,LCD收到的数据作为指令;当RS=1,LCD收到的数据作为数据。要注意的是,在输入指令或是数据后,要使E接收到一个下降沿后才会生效。
③函数
在此次实验过程中用到的有关LCD的函数,主要是光标位置的改变、显示字符。
- 光标位置函数
void lcdwrc4bit(long c) //读取八位数据改变光标位置
{
while(readbusy());
GPIO_ResetBits(GPIOB,rs); //将rs置为零,表示后边输入指令
GPIO_ResetBits(GPIOB,rw);
GPIO_ResetBits(GPIOB,e);
delayms(1);
GPIOB->BSRR = c<<8 & 0xf000; //将数据送到P0口
GPIOB->BRR = ((~c)<<8) & 0xf000;
delayms(1);
GPIO_SetBits(GPIOB,e);
delayms(1);
GPIO_ResetBits(GPIOB,e);//执行指令
delayms(1);
GPIOB->BSRR = c<<12 & 0xf000; //将数据送到P0口
GPIOB->BRR = ((~c)<<12) & 0xf000;
delayms(1);
GPIO_SetBits(GPIOB,e);
delayms(1);
GPIO_ResetBits(GPIOB,e);//执行指令
delayms(1);
}
(b)显示字符函数
void lcdwrd(long dat) //读八位数据通过4个引脚
{
while(readbusy());
GPIO_SetBits(GPIOB,rs);
GPIO_ResetBits(GPIOB,rw);
GPIO_ResetBits(GPIOB,e);
delayms(1);
GPIOB->BSRR = dat<<8 & 0xf000; //将数据送到P0口
GPIOB->BRR = ((~dat)<<8) & 0xf000;
delayms(1);
GPIO_SetBits(GPIOB,e);
delayms(1);
GPIO_ResetBits(GPIOB,e);//执行指令
delayms(1);
GPIOB->BSRR = dat<<12 & 0xf000; //将数据送到P0口
GPIOB->BRR = ((~dat)<<12) & 0xf000;
delayms(1);
GPIO_SetBits(GPIOB,e);
delayms(1);
GPIO_ResetBits(GPIOB,e);//执行指令
delayms(1);
GPIO_ResetBits(GPIOB,rs);
}