跟我学51单片机_七_LCD1602液晶显示模块

本刊上期介绍单片机捕获红外遥控器解码方法电路原路和程序设计方法,并给出了实例。这一讲将介绍单片机驱动LCD1602液晶显示模块。通过该讲,读者可以掌握LCD1602液晶的工作原理和如何通过单片机来驱动LCD1602液晶。

一、原理简介

液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602液晶显示模块(其内部控制器为HD44780芯片),它可以显示两行,每行16个字符,因此可相当于32个LED 数码管,而且比数码管显示的信息还多。采用单+5V 电源供电,外围电路配置简单,价格便宜,具有很高的性价比。LCD1602外观如图1(a)所示。1602字符型LCD 模块的

管脚分布如图1(b)所示, 其管脚各功能如表1所示。

值得提出的是,各种液晶厂家均有提供几乎都是同样规格的1602模块或兼容模块,尽管各厂家的对其各自的产品命名不尽相同;但其最初采用的LCD 控制器采用的是HD44780,在各厂家生产的1602模块当中,基本上也都采用了与之兼容的控制IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块。

LCD1602 有11个控制指令,见表2。其中,DDRAM :显示数据RAM,用来寄存待显示的字符代码;CGROM :字符发生存储器;CGRAM :用户自定义的字符图形RAM。限于篇幅原因在此不做详细叙述,读者可以上网查看HD44780芯片资料和LCD1602

数据手册。

这里介绍几个LCD1602编程时经常用到的几个指令,见表3。

(a) (b)

图1 (a) LCD1602外观图 (b) LCD1602管脚分布图

LCD1602液晶显示模块

跟我学51单片机(七)

作者/赵亮

●●●

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 DL N F * *其中: DL=1,8位数据接口;DL=0,四位数据接口; N=1,两行显示;N=0,一行显示;

F=1,5×10点阵字符;F=0,5×7点阵字符。

二、电路详解

如图2所示,1602液晶的控制管脚都接到了单片机管脚上,前文提到,在功能设置指令中可以将液晶设为8位数据接口和4位数据接口,图中采用的是8位的数据接口,当然也可以当四位数据接口来用。液晶电源正端接5V,负端接地,背光正端接5V,负端接地。此外,液晶的偏压管脚(VO)接到一个电位器的中间抽头,电位器的两端分别接5V 和地,这样就可通过调节电位器来实现对1602液晶对比度的调节。经实验测试,笔者手里的1602液晶的偏压管脚的电压调节到0.3~0.4V 时对比度效果最好,也可以将该管脚通过一个1k 的电阻下拉到地。读者可以自己实践测试。

三、程序设计

在对1602液晶设计程序前,我们先看下其读写时序图,从图3和图4可以看出,1602液晶的读写操

作时序可总结成表4所示。

对照时序,我们可以很容易的写出驱动液晶的各个子函数,如下所示。

写命令函数:向寄存器写入控制字参数: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; //

在使能线的下降沿写入数据

图2 1602液晶与单片机的连接图

图3 1602液晶读操作的时序图图4 1602液晶写操作的时序图

}

要使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); //将地址写入寄存器}

写字符函数:向液晶写一个字符

参数:x -列坐标,y -行坐标,dat -将要显示的字符数据void LCD_write_char( unsigned x,unsigned char y,unsigned char dat){

LCD_set_xy( x, y ); //首先设置显示坐标LCD_en_dat(dat); //写数据

}

写字符串函数:向液晶写入字符串

参数:x -列坐标,y -行坐标,*s -将要显示的字符串数据void LCD_write_string(unsigned char x,unsigned char y,unsigned char *s)

{

LCD_set_xy( x, y ); //首先设置显示坐标while (*s) //判断是否结束{

LCDIO=*s;//循环调用写数据函数LCD_en_dat(*s); s ++;}}

四、调试要点与实验现象

接好硬件(特别是连接好1602液晶),通过冷启动方式将程序所生成的.hex 文件下载到单片机运行后,复位单片机,然后可在学习板上看到液晶的显示的字符(如图5所示)。

调试时应注意的是,因为液晶的内部显示操作需要一定的时间,因此如果单片机在对1602液晶写操作时不进行读忙操作,就应该延时足够的时间(可用延时函数)以让液晶内部能够接收命令或数据,否则会让液晶无法工作或者工作不正常。此外对于V0管脚,作为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,因此可通过一个电位器实现对其的电压调整,前文提到,将其调节到0.3~0.4V 时对比度效果最好。

五、总结

本讲介绍了字符型液晶1602的工作原理并给出了实例,通过该讲,读者可以了解和掌握51单片机

驱动1602液晶的方法。下讲将讲述单片机驱动带字库的128X64液晶,敬请期待。图5 1602液晶显示界面

END

套件销售

本刊提供单片机实验套件。有兴趣的读者请联系杂志读者服务部,电话010-******** / 020-******** / QQ :1312968332

相关文档
最新文档