51单片机教程(七):LCD1602液晶显示模块

发布者:yunhui最新更新时间:2021-02-02 来源: eefocus关键字: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); // 将地址写入寄存器


}


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


参数: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 所示)。

图5 1602液晶显示界面


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

关键字:51单片机  LCD1602  液晶显示模块 引用地址:51单片机教程(七):LCD1602液晶显示模块

上一篇:51单片机三极管的作用讲解
下一篇:烟雾检测的火灾自动探测报警系统设计

推荐阅读最新更新时间:2024-11-13 22:34

51单片机——LED流水灯
一、查表法实现流水灯 查看开发板的原理图,知道了控制LED2~LED7的端口为P0口,所以可以通过对P0口赋值控制发光二极管的亮灭。比如,用十六进制表示P0的值,P0=0xfe,即LED2发光,其他LED熄灭。要实现流水灯的话,让发光二极管从LED2到LED7顺序发光就可以了,也就是说,P0口的值依次为0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,简简单单。 而查表法就是把P0口要表示的值做成数组,再利用'code'将其存入ROM中,使用时,让P0口等于数组中的某个值。 程序如下: #include reg52.h sbit ADDR0=P1^0; sb
[单片机]
<font color='red'>51单片机</font>——LED流水灯
如何用51单片机来产生PWM波
89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。 1 软件延时法 利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。 程序如下: #include sbit pwm=P1^0; main() while(1) pwm=1; delayus(60);//置高电平后延时60us,占空比60% pwm=0; delayus(40); void delayus(uint x) while(x--); proteus软件仿真结果如下: 可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显
[单片机]
如何用<font color='red'>51单片机</font>来产生PWM波
基于51单片机设计的空调主板显示数据实时监测电路
近年来,随着空调市场的不断扩大,竞争也日趋激烈;从而对空调生产成本控制提出了更高的要求,空调生产过程中测试成本占据了生产成本相当大的比重。同时,生产测试的方便性、准确性和有效性都影响着产品质量,从而最终影响空调品牌的信誉。 国内空调生产厂家对空调主板的测试大多数仍停留在手工检测阶段,为提高生产测试中的自动化程度,我们设计了空调主板自动测试系统;自行研制的主板测试数据的实时监测电路是该自动测试系统的一个重要组成部分。 该监测电路是以Philips增强型单片机P89C51RD2为核心,实时监视空调主板内的单片机与显示驱动芯片之间的同步串行数据,确保对空调主板检测的准确有效;同时根据工控机软件定义的检测流程,将计算机发出的控制信号传
[单片机]
基于<font color='red'>51单片机</font>设计的空调主板显示数据实时监测电路
基于51单片机的温度采集系统简单应用设计
  0 引言   在工业现场,生产环境恶劣,不能长时间停留在现场采集温度数据,而有限传输具有温度检测难、可操作性差。高科技农业现场,采集温度时,布线困难复杂,成本高。为解决以上困难,采用无线方式。常用的无线方式为433 MHz小无线、ZigBee、CDMA/GPRS、3G等方式,考虑到性价比和现场情况,本系统采用JF24D?B完成无线收发。为了采集不同高度的温度,可在不同高度安置无线网络传感器。但考虑到成本和传感器的电源替换问题,采用简易螺旋直升机升降不同高度来采集温度。   通过控制直升机的升降让它达到测量高度进行温度测量并传送控制单元处理,测量完毕返回便于无线传感器的维护。   1 总电路设计   为了采集高空温度,采
[单片机]
基于<font color='red'>51单片机</font>的温度采集系统简单应用设计
学习笔记之51单片机键盘篇
(一)基础补充 1.键盘的任务 (1)判别是否有键按下?若有,进入下一步。 (2)识别哪一个键被按下,并求出相应的键值。 (3)根据键值,找到相应键值的处理程序入口。 2.键盘的识别 按键的闭合与否,反映在行线输出电压上就是呈现高电平或低电平,单片机通过对行线电平的高低状态的检测,便可以确认按键是否按下或松开。为了确保单片机对一次按键动作只确认一次按键有效(所谓按键有效,是指按下按键后,一定要再松开),必须消除抖动期t1和t3的影响。 3.如何消除按键的抖动 (1)用软件延时来消除按键抖动,基本思路是:在检测到有键按下时,该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线电平是否仍为低电平,如果仍为低
[单片机]
学习笔记之<font color='red'>51单片机</font>键盘篇
51单片机实物与仿真差异
此仿真以protues8为例 首先我们不得不承认仿真的的优点,元件库庞大,仿真效果好,线路简单,操作简化用于小工程效果实现有很大的帮助。 实物,这是真正看得见摸得着的东西,但是工程量庞大,不适用于庞大的工程试验。 对于初学者而言,更多的还用实物,从焊接到调试,从故障到成功,是一个很好的学习过程,而电子仿真可以做为辅助作用的工具,不能用于主要学习的手段,有时候只有仿真效果出来了,做出实物才更加方便快捷,所以对于51单片机而言设计电路,我的步骤是先设计仿真电路,等到理想状态效果出来后在着手调试实际电路,这时候会发现仿真和实际的效果有很大的差异,这时候就是调试和学经验好时候。有些人会说步骤太过于繁琐直接仿真或者用实物不是更好吗?
[单片机]
51单片机-按键
矩阵按键: 实现功能按一个键,相应的灯亮。 左边的是普通二极管,右边的是发光二极管。左边的二极管如果想导通,则右边要比左边电平低。如果导通就是按键可以控制灯亮,那么按键左下的都为低电平,系统复位时默认I/O是高电平,所以给垂直方向的I/O拉低,这样如果按键按下,电路导通,那么垂直方向I/O的低电平会把水平方向的拉低。这样就可以通过检测水平方向哪个I/O为低电平来检测哪个键被按下。 开始时对程序的错误想法:被按下的键两边肯定都是低电平,把它们存在一个数组里,然后检测。这样是不对的,用一个临时变量去存P0的值,不会有相同的,开始P0的值为oxff,这样即使按下按键,那么两边的引脚还是高电平,所以失败了。 #
[单片机]
<font color='red'>51单片机</font>-按键
51单片机分时控制8路舵机程序
本程序中用到的头文件 12c5a.H下载: http://www.51hei.com/f/12c5a.rar //分时控制舵机,采用的单片机是STC12c5a 51增强型单片机,晶振11.0592MHZ #include 12c5a.H void delay(uint16 time); void Timer_init(); void Timer0(uint32 us); uint16 xdata pwm ={1500,1500,1500,1500,1500,1500,1500,1500}; sbit pwm1=P0^0; sbit pwm2=P0^1; sbit pwm3=P0^2; sbit pwm4=
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved