LCD1602液晶显示
时间:2023-01-18 15:30:00
文章目录
- 一、LCD1602简介
-
- 1. 显示原理
- 2. 外形尺寸
- 3. 技术参数
- 4. 引脚功能
- 5. 指令集
- 6. 连接方式
- 二、时序图
-
- 1. 写时序
- 2.读时序
- 三、程序设计
-
- 1. 写数据、指令
- 2. 初始化,设置光标
- 3. 读数据(读忙信号)
- 4. 显示函数
- 5. 示例
一、LCD1602简介
LCD1602液晶显示广泛使用的字符型液晶显示模块。它是由字符型液晶显示屏制成的(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100和少量电阻、电容元件和结构件组装在一起PCB板上而成。不同厂家生产LCD1602芯片可能不同,但使用方法相同。为了降低成本,绝大多数制造商直接在板上制作裸片。
1. 显示原理
液晶由点阵图形式M×N假设由一个显示单元组成LCD显示屏有64行,每行128列,每8列对应8个字节,即每行16字节,共16行×8=128个点组成。显示屏上64×16个显示单元和显示单元RAM1024字节对应于区域,每个字节的内容对应于显示屏上相应位置的亮度。例如显示屏第一行的亮暗由RAM区的000H~00FH当(00000H)=FFH当(3)FFH)=FFH当(0000)H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H在屏幕顶部显示一条由8条亮线和8条暗线组成的虚线。
字符液晶显示模块是一种点阵式,专门用于显示字母、数字和符号LCD,常用16×1,16×2,20×2和40×二等模块LCD大多数1602字符液晶显示器的内部控制器都是HD44780能显示英文字母、阿拉伯数字、日文片假名和一般符号。
2. 外形尺寸
LCD1602字符液晶显示器的实物形状如图1所示。
LCD1602分为带背光和无背光两种,其控制器多为HD44780。带背光的厚度比没有背光的厚度在实际应用中没有区别。具体识别方法可参考图2所示的设备尺寸示意图。
原理图:
3. 技术参数
(1)显示容量:16×2个字符。
(2)芯片工作电压:4.5~5.5V。
(3)工作电流:2.0mA(5.0V)。
(4)模块最佳工作电压:5.0V。
(5)字符尺寸:2.95mm×4.35mm(宽×高)。
4. 引脚功能
LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚接口说明见表1。
各引脚的功能介绍如下:
·引脚1:VSS为地电源。
·引脚2:VDD接5V正电源。
·引脚3:VL对于液晶显示器的对比度调整端,连接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生鬼影现象kQ调整电位器的对比度。
·引脚4:RS选择寄存器的脚,高电平时选择数据寄存器,低电平时选择指令寄存器。
·引脚5:R/W为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W当共同为低电时,可以写入指令或显示地址;RS为低电平,R/W为了高电,可以读忙信号;当RS为高电平,R/W在低电平时,可以写入数据。
·引脚6:E当E端从高电平跳转到低电平时,液晶模块执行命令。
·引脚7~ 14:D0~D7是8位双向数据线。
·引脚15:背光源正极。
·引脚16:背光源负极。
5. 指令集
LCD液晶模块内的控制器有11个控制指令,见表2。
LCD通过指令编程实现1602液晶模块的读写操作、显示屏和光标操作(其中1为高电平,0为低电平),分别介绍如下:
(1)指令1:清屏。指令码01H,将光标复位到地址00H。
(2)指令2:光标复位。将光标复位到地址00H。
(3)指令3:设置输入模式。I/D表示光标的移动方向,高电平右移,低电平左移;S高电平表示有效,低电平表示无效。
(4)指令4:显示开关控制。D用于控制整体显示的开关,高电平显示,低电平显示;C用于控制光标的开关,高电平表示光标,低电平表示无光标;B用于控制光标是否闪烁,高电平闪烁,低电平不闪烁。
(5)指令5:光标或字符移位控制。S/C表示在高电平时移动显示的文字,在低电平时移动光标。
(6)指令6:功能设置命令。DL高电平时为8位总线,低电平时为4位总线;N表示低电平时单行显示,高电平时双行显示;F低电平时显示5×7点阵字符,高电平时显示5×10点阵字符。
(7)指令7:字符发生器RAM地址设置。
(8)指令8:DDRAM地址设置。
(9)指令9:阅读忙信号和光标地址。BF为忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平则表示不忙。
(10)指令10:写数据。
(11)指令11:阅读数据。
6. 连接方式
LCD1602和单片机有两种连接方式,一种是直接控制,另一种是所谓的间接控制。它们之间的区别只是使用的数据线数量不同,其他数据都是一样的。
1.直接控制模式
LCD16028根数据线和3根控制线E,RS和R/W与单片机连接后即可正常工作。一般应用只需要往LCD命令和数据可以写入1602,因此LCD1602的R/W读写选择控制端直接接地,可节省1条数据线。VO引脚是液晶对比度调试端,通常连接10个kΩ电位器可以调整对比度;也可以通过引脚接地调整适当大小的电阻,但电阻的大小应通过调试确定。
2.间接控制模式
间接控制也被称为四线工作模式HD四位数据总线的功能是简化电路接口的一种方式。为减少接线数量,只使用引脚DB4~DB7与单片机通信,先传输数据或命令,再传输4位。四线并口通信可以减少微控制器I/O产品设计过程中单片机的需求I/O当资源紧张时,可以考虑使用这种方法。
二、时序图
1. 写时序
2.读时序
综上:
三、程序设计
1. 写数据和指令
/** * @brief LCD1602写数据 * @param Data 要写的数据 * @retval 无 */ void LCD_WriteData(unsigned char Data) {
LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_E=1; LCD_Delay();
LCD_E=0;
LCD_Delay();
}
/** * @brief LCD1602写指令 * @param Command 要写入的指令 * @retval 无 */
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS=0;
LCD_RW=0;
LCD_DataPort=Command;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
2. 初始化、设光标
/** * @brief LCD1602初始化函数 * @param 无 * @retval 无 */
void LCD_Init(void)
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
/** * @brief LCD1602设置光标位置 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @retval 无 */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);
}
}
3. 读数据(读忙信号)
read_busy_flag()
{
unsigned char flag; // flag为LCD状态标志
//Px为LCD上8位数据总线所连接的单片机IO端口
Px = 0xFF; // 给8位数据总线赋值11111111
LCD_RS = 0; // 选择指令寄存器,读取LCD状态字
LCD_RW = 1; // 读操作
do
{
LCD_E = 1; // 使能端拉高
flag = Px; // 读取LCD状态
LCD_E = 0; // 使能端拉低
} while(flag & 0x80); // 如果DB7依然为1,表示忙,直到DB7为0时跳出
}
4. 显示函数
/** * @brief 在LCD1602指定位置上显示一个字符 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @param Char 要显示的字符 * @retval 无 */
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
LCD_SetCursor(Line,Column);
LCD_WriteData(Char);
}
/** * @brief 在LCD1602指定位置开始显示所给字符串 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param String 要显示的字符串 * @retval 无 */
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
/** * @brief 返回值=X的Y次方 */
int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}
/** * @brief 在LCD1602指定位置开始显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~65535 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
}
}
/** * @brief 在LCD1602指定位置开始以有符号十进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:-32768~32767 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
unsigned char i;
unsigned int Number1;
LCD_SetCursor(Line,Column);
if(Number>=0)
{
LCD_WriteData('+');
Number1=Number;
}
else
{
LCD_WriteData('-');
Number1=-Number;
}
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
}
}
/** * @brief 在LCD1602指定位置开始以十六进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~0xFFFF * @param Length 要显示数字的长度,范围:1~4 * @retval 无 */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
unsigned char SingleNumber;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
SingleNumber=Number/LCD_Pow(16,i-1)%16;
if(SingleNumber<10)
{
LCD_WriteData('0'+SingleNumber);
}
else
{
LCD_WriteData('A'+SingleNumber-10);
}
}
}
/** * @brief 在LCD1602指定位置开始以二进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 * @param Length 要显示数字的长度,范围:1~16 * @retval 无 */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
}
}
5. 示例
void main()
{
LCD_Init(); //LCD初始化
LCD_ShowChar(1,1,'A'); //在1行1列显示字符A
LCD_ShowString(1,3,"Hello"); //在1行3列显示字符串Hello
LCD_ShowNum(1,9,66,2); //在1行9列显示数字66,长度为2
LCD_ShowSignedNum(1,12,-88,2); //在1行12列显示有符号数字-88,长度为2
LCD_ShowHexNum(2,1,0xA5,2); //在2行1列显示十六进制数字0xA5,长度为2
LCD_ShowBinNum(2,4,0xA5,8); //在2行4列显示二进制数字0xA5,长度为8
LCD_ShowChar(2,13,0xDF); //在2行13列显示编码为0xDF的字符
LCD_ShowChar(2,14,'C'); //在2行14列显示字符C
while(1)
{
}
}