跟我学51单片机(七)——LCD1602液晶显示模块
一、原理简介
液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602 液晶显示模块(其内部控制器为HD44780 芯片),它可以显示两行,每行16 个字符,因此可相当于32 个LED 数码管,而且比数码管显示的信息还多。采用单+5V 电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
LCD1602 外观如图1(a) 所示。1602 字符型LCD 模块的管脚分布如图1(b) 所示, 其管脚各功能如表1 所示。
图1 (a) LCD1602外观图 (b) LCD1602管脚分布图
值得提出的是,各种液晶厂家均有提供几乎都是同样规格的1602 模块或兼容模块,尽管各厂家的对其各自的产品命名不尽相同;但其最初采用的LCD 控制器采用的是HD44780,在各厂家生产的1602 模块当中,基本上也都采用了与之兼容的控制IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块。
LCD1602 有11 个控制指令, 见表2。其中,DDRAM :显示数据RAM,用来寄存待显示的字符代码;CGROM :字符发生存储器;CGRAM :用户自定义的字符图形RAM。限于篇幅原因在此不做详细叙述,读者可以上网查看HD44780 芯片资料和LCD1602 数据手册。
这里介绍几个LCD1602 编程时经常用到的几个指令,见表3。
二、电路详解
如图2 所示,1602 液晶的控制管脚都接到了单片机管脚上,前文提到,在功能设置指令中可以将液晶设为8 位数据接口和4 位数据接口,图中采用的是8位的数据接口,当然也可以当四位数据接口来用。液晶电源正端接5V,负端接地,背光正端接5V,负端接地。此外,液晶的偏压管脚(VO)接到一个电位器的中间抽头,电位器的两端分别接5V 和地,这样就可通过调节电位器来实现对1602 液晶对比度的调节。经实验测试,笔者手里的1602 液晶的偏压管脚的电压调节到0.3~0.4V 时对比度效果最好,也可以将该管脚通过一个1k 的电阻下拉到地。读者可以自己实践测试。
图2 1602液晶与单片机的连接图
三、程序设计
在对1602 液晶设计程序前,我们先看下其读写时序图,从图3 和图4 可以看出,1602 液晶的读写操作时序可总结成表4 所示。
图3 1602液晶读操作的时序图
图4 1602液晶写操作的时序图
对照时序,我们可以很容易的写出驱动液晶的各个子函数,如下所示。
写命令函数:向寄存器写入控制字
参数:command - 控制字
void LCD_en_command(unsigned char command)
{
LCD_delay(); // 延时一段时间
LCD1602_RW=LOW; // 写命令时,R/W 为低电平
LCD1602_RS=LOW; // 写入指令,RS 为低电平
LCD1602_EN=HIGH; // 置高使能线
LCDIO=command; // 接收命令字并送到数据总线上
LCD1602_EN=LOW; // 在使能线的下降沿写入数据
}
写数据函数:向寄存器写入数据
参数:dat - 待要显示数据
void LCD_en_dat(unsigned char dat)
{
LCD_delay(); // 延时一段时间
LCD1602_RW=LOW; // 写指令时,R/W 为低电平
LCD1602_RS=LOW; // 写入数据,RS 为高电平
LCD1602_EN=HIGH; // 置高使能线
LCDIO=dat; // 接收数据并送到数据总线上
LCD1602_EN=LOW; // 在使能线的下降沿写入数据
}
要使1602 液晶能正常工作和操作方便,除了写数据和命令函数外,还需要进行初始化等操作,先将本讲中所用到的操作1602 液晶的主要函数设计如下。
液晶初始化函数:设置液晶的工作方式
void LCD_init(void)
{
delaylcd_nms(5);
LCD_en_com_nobusy(DATA_MODE);
// 延时5ms, 写指令,不检测忙信号
delaylcd_nms(5);
LCD_en_com_nobusy(DATA_MODE);
// 延时5ms, 写指令,不检测忙信号
delaylcd_nms(5);
LCD_en_com_nobusy(DATA_MODE);
// 延时5ms, 写指令,不检测忙信号
LCD_en_com(DATA_MODE);
// 设置为8位数据传送模式
delaylcd_nms(5);
LCD_en_com(OPEN_SCREEN); // 开显示
LCD_en_com(DISPLAY_ADDRESS); // 设置显示地址
CLEARSCREEN; // 清屏
}
设置显示坐标函数:设置字符的显示位置,行、列坐标
参数: x -列坐标,y -行坐标
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == LINE1) // 判断行
address = LINE1_HEAD + x; // 设置列坐标
else
address = LINE2_HEAD + x;
LCD_en_command(address); // 将
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)