目录
介绍
LCD(液晶显示器)用于显示嵌入式系统中的状态或参数。
LCD 16×2是16引脚器件,具有8个数据引脚(D0-D7)和3个控制引脚(RS,RW,EN)。其余5个引脚用于LCD的电源和背光。
控制引脚可帮助我们在命令模式或数据模式下配置LCD。它们还有助于配置读取模式或写入模式以及何时进行读取或写入。
LCD 16×2可以在4位模式或8位模式下使用,具体取决于应用的要求。为了使用它,我们需要在命令模式下向LCD发送某些命令,一旦根据我们的需要配置LCD,我们就可以在数据模式下发送所需的数据。
有关LCD 16×2及其使用方法的更多信息,请参阅传感器和模块部分中的LCD 16×2显示模块部分。
LCD16x2引脚
连接图
LCD 16×2连接,带8051
硬件连接
开始编程:LCD16x2
初始化LCD16x2
初始化LCD非常容易
- 打开LCD电源
- 等待15ms,开启LCD16x2的初始化时间
- 发送0x38命令(初始化.2行,5×8矩阵,8位模式)
- 发送任何Display ON命令(0x0E,0x0C)
- 发送0x06命令(增量光标)
void LCD_Init (void) /* LCD Initialize function */
{
delay(20); /* LCD Power ON Initialization time >15ms */
LCD_Command (0x38); /* Initialization of 16X2 LCD in 8bit mode */
LCD_Command (0x0C); /* Display ON Cursor OFF */
LCD_Command (0x06); /* Auto Increment cursor */
LCD_Command (0x01); /* Clear display */
LCD_Command (0x80); /* Cursor at home position */
}
现在我们成功初始化了LCD,它已准备好接受要显示的数据。
命令写入功能
- 将命令发送到数据端口
- 使RS引脚为低电平,RS = 0(命令寄存器)
- 使RW引脚为低电平,RW = 0(写操作)
- 在Enable(E)最小值为450ns时给出高至低脉冲。
当我们给启动脉冲时,LCD锁存D0到D7中的数据并执行命令,因为RS是命令reg。
void LCD_Command (unsigned char cmd) /* LCD16x2 command funtion */
{
lcd_data_port= cmd;
rs=0; /* command reg. */
rw=0; /* Write operation */
en=1;
delay(1);
en=0;
delay(5);
}
数据写入功能
- 将命令发送到数据端口
- 使RS引脚为低电平,RS = 1(数据寄存器)
- 使RW引脚为低电平,RW = 0(写操作)
- 在Enable(E)最小450 ns时给出高至低脉冲
当我们给启动脉冲时,LCD锁存D0到D7的数据并将其显示在5x8矩阵上,因为RS是数据寄存器。
void LCD_Char (unsigned char char_data) /* LCD data write function */
{
lcd_data_port=char_data;
rs=1; /*Data reg.*/
rw=0; /* Write operation*/
en=1;
delay(1);
en=0;
delay(5);
}
注意
- LCD上电延时:上电后我们无法立即发送命令,LCD16x2需要自动初始化时间15ms。编程时我们需要注意在延迟> 15ms时提供足够的电源,然后向LCD发送命令。
- 在提供执行命令后,LCD16x2需要时间(以微秒为单位),但对于0x01命令(清除显示),执行需要1.64ms。所以在给出这个命令后,我们需要给出足够的延迟> 1.63毫秒。
程序:
/*
LCD16x2 8 bit 8051 interface
https://www.qutaojiao.com
*/
#include
sfr lcd_data_port=0x90; /* P1 port as data port */
sbit rs=P2^0; /* Register select pin */
sbit rw=P2^1; /* Read/Write pin */
sbit en=P2^2; /* Enable pin */
void delay(unsigned int count) /* Function to provide delay Approx 1ms */
{
int i,j;
for(i=0;ifor(j=0;j<112;j++);
}
void LCD_Command (unsigned char cmd) /* LCD16x2 command funtion */
{
lcd_data_port= cmd;
rs=0; /* command reg. */
rw=0; /* Write operation */
en=1;
delay(1);
en=0;
delay(5);
}
void LCD_Char (unsigned char char_data) /* LCD data write function */
{
lcd_data_port=char_data;
rs=1; /* Data reg.*/
rw=0; /* Write operation*/
en=1;
delay(1);
en=0;
delay(5);
}
void LCD_String (unsigned char *str) /* Send string to LCD function */
{
int i;
for(i=0;str[i]!=0;i++) /* Send each char of string till the NULL */
{
LCD_Char (str[i]); /* Call LCD data write */
}
}
void LCD_String_xy (char row, char pos, char *str) /* Send string to LCD function */
{
if (row == 0)
LCD_Command((pos & 0x0F)|0x80);
else if (row == 1)
LCD_Command((pos & 0x0F)|0xC0);
LCD_String(str); /* Call LCD string function */
}
void LCD_Init (void) /* LCD Initialize function */
{
delay(20); /* LCD Power ON Initialization time >15ms */
LCD_Command (0x38); /* Initialization of 16X2 LCD in 8bit mode */
LCD_Command (0x0C); /* Display ON Cursor OFF */
LCD_Command (0x06); /* Auto Increment cursor */
LCD_Command (0x01); /* clear display */
LCD_Command (0x80); /* cursor at home position */
}
结果演示
LCD16x2字符串输出
滚动显示
要在LCD上滚动字符串或字符,我们需要使用以下命令
为了滚动显示,我们只需将这些命令放在循环中。
滚动显示:
- 在LCD上显示字符串
- 使用’0x1C’命令将其滚动到右侧
- 使用’0x18’命令将其滚动到左侧
主要功能代码
void main()
{
unsigned char i,shift;
delay(5);
LCD_Init(); /* initilize LCD */
LCD_String("ElectronicWings"); /* display string */
delay(1000);
shift=15; /* number of time shifts count=15 */
while(1)
{
for(i=0;i0x1c); /* shift display right */
delay(300);
}
shift=30; /* number of time shifts 30 */
for(i=0;i<30;i++)
{
LCD_Command(0x18); /* shift display left */
delay(300);
}
}
}
本节课程序下载: