1、,第5章,单片机的开关检测、键盘输入 与显示的接口设计,单片机原理及接口技术(C51编程)(第2版),目 录,CONTENTS,5.1 单片机控制发光二极管显示,5.2 开关状态检测,5.3 单片机控制LED数码管的显示,5.4 单片机控制LED点阵显示器显示,5.5 单片机控制液晶显示模块1602 LCD的显示,5.6 键盘接口设计,5.1 单片机控制发光二极管显示,发光二极管常用来指示系统工作状态,制作节日彩灯、广告牌匾等。 大部分发光二极管工作电流15mA之间,其内阻为20100。电流越大,亮度也越高。 为保证发光二极管正常工作,同时减少功耗,限流电阻选择十分重要,若供电电压为+5V,则
2、限流电阻可选13k。,5.1.1 单片机与发光二极管的连接,第2章已介绍,P0口作通用I/O用,由于漏极开路,需外接上拉电阻。而P1P3口内部有30k左右上拉电阻。 下面讨论P1P3口如何与LED发光二极管驱动连接问题。 单片机并行端口P1P3直接驱动发光二极管,电路见图5-1。 与P1、P2、P3口相比,P0口每位可驱动8个LSTTL输入,而P1P3口每一位驱动能力,只有P0口一半。,5.1.1 单片机与发光二极管的连接,图5-1 发光二极管与单片机并行口的连接,5.1.1 单片机与发光二极管的连接,当P0口某位为高电平时,可提供400A的拉电流;当P0口某位为低电平(0.45V)时,可提供
3、3.2mA的灌电流,而P1P3口内有30k左右上拉电阻,如高电平输出,则从P1、P2和P3口输出的拉电流Id仅几百A,驱动能力较弱,亮度较差,见图5-1(a)。 如端口引脚为低电平,能使灌电流Id从单片机外部流入内部,则将大大增加流过的灌电流值,见图5-1(b)。AT89S51任一端口要想获得较大的驱动能力,要用低电平输出。如一定要高电平驱动,可在单片机与发光二极管间加驱动电路,如74LS04、74LS244等。,5.1.2 I/O端口的编程举例,对I/O端口编程控制时,要对I/O端口特殊功能寄存器声明,在C51的编译器中,这项声明包含在头文件reg51.h中,编程时,可通过预处理命令#inc
4、lude,把这个头文件包含进去。下面通过案例介绍如何编程对发光二极管输出控制。,5.1.2 I/O端口的编程举例,【例5-1】 制作流水灯,原理电路见图5-2,8个发光二极管LED0LED7经限流电阻分别接至P1口的P1.0P1.7引脚上,阳极共同接高电平。编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。,5.1.2 I/O端口的编程举例,图5-2 单片机控制的流水灯,5.1.2 I/O端口的编程举例,参考程序: #include #include /包含移位函数_crol_( )的头文件 #define uchar unsigned char #define ui
5、nt unsigned int void delay(uint i) /延时函数 uchar t;while (i-) for(t=0;t120;t+); ,5.1.2 I/O端口的编程举例,void main( ) /主程序 P1=0xfe; /向P1口送出点亮数据while (1) delay( 500 ); /500为延时参数,可根据实际需 /要调整P1=_crol_(P1,1) ; / 函数_crol_(P1,1)把P1中的数据 /循环左移1位 ,5.1.2 I/O端口的编程举例,(1)while(1) 两种用法:,“while(1);”: while(1)后有分号,是使程序停留在这指
6、令上; “while(1) ;”:反复循环执行大括号内程序段,本例用法,即控制流水灯反复循环显示。,5.1.2 I/O端口的编程举例,(2)C51函数库中的循环移位函数:循环移位函数包括:,循环左移函数“_crol_”。循环右移函数“_cror_”。,本例用循环左移 “_crol_(P1,1)”,函数。括号第1个参数为循环左移对象,即对P1中的内容循环左移;第2个参数为左移位数,即左移1位。编程中一定要把含有移位函数的头文件intrins.h包含在内,例如第2行“#include ”。,5.1.2 I/O端口的编程举例,在【例5-1】基础上,编写控制发光二极管反复循环点亮的流水灯。 【例5-2
7、】电路见图5-2,制作由上至下再由下至上反复循环点亮显示的流水灯,3种方法实现。,数组的字节操作实现建立1个字符型数组,将控制8个LED显示的8位数据作为数组元素,依次送P1口。参考程序:,5.1.2 I/O端口的编程举例,#include #define uchar unsigned char uchar tab = 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f , 0x7f , 0xbf , 0xdf , 0xef , 0xf7 , 0xfb , 0xfd , 0xfe ; /*前8个数据为左移点亮 数据,后8个为右移点亮数据*
8、/ void delay( ) uchar i,j;for(i=0; i255; i+)for(j=0; j255; j+); ,5.1.2 I/O端口的编程举例,void main( ) /主函数 uchar i;while (1) for(i=0;i16; i+) P1=tabi; /向P1口送出点亮数据delay( ); /延时,即点亮一段时间 ,5.1.2 I/O端口的编程举例,移位运算符实现 使用移位运算符“”、“”,把送P1口显示控制数据进行移位,从而实现发光二极管依次点亮。参考程序:,#include #define uchar unsigned char void delay(
9、 ) uchar i,j;for(i=0; i255; i+)for(j=0; j255; j+); ,5.1.2 I/O端口的编程举例,void main( ) /主函数 uchar i,temp;while (1) temp=0x01; /左移初值赋给tempfor(i=0; i8; i+) P1=temp; / temp中的数据取反后送P1口delay( ); / 延时temp=temp1; / temp 中数据左移一位,5.1.2 I/O端口的编程举例,temp=0x80; / 赋右移初值给tempfor(i=0; i1; / temp 中数据右移一位 ,5.1.2 I/O端口的编程举
10、例,程序说明: 注意使用移位运算符“”、“”是将低位丢弃,高位补0。而循环左移函数“_crol_” 是将移出的高位再补到低位,即循环移位;同理循环右移函数“_cror_” 是将移出的低位再补到高位。,5.1.2 I/O端口的编程举例,用循环左、右移位函数实现 使用C51提供的库函数,即循环左移n位函数和循环右移n位函数,控制发光二极管点亮。参考程序:,#include #include /包含循环左、右移位函数的头文件 #define uchar unsigned char void delay( ) uchar i,j;for(i=0; i255; i+)for(j=0; j255; j+)
11、; ,5.1.2 I/O端口的编程举例,void main( ) / 主函数 uchar i,temp;while (1) temp=0xfe; / 初值为11111110for(i=0; i7; i+) P1=temp; / temp中的点亮数据送P1 /口,控制点亮显示delay( ); / 延时temp=_crol_( temp,1) ; / temp 数据循环左移1位,5.1.2 I/O端口的编程举例,for(i=0; i7; i+) P1=temp; / temp中的数据送P1口输出delay( ); / 延时temp=_cror_( temp,1) ; /temp中数据循环右移1位
12、 ,目 录,CONTENTS,5.1 单片机控制发光二极管显示,5.2 开关状态检测,5.3 单片机控制LED数码管的显示,5.4 单片机控制LED点阵显示器显示,5.5 单片机控制液晶显示模块1602 LCD的显示,5.6 键盘接口设计,5.2.1 开关检测案例1,用I/O端口来进行开关状态检测,开关一端接到I/O端口引脚上,并通过上拉电阻接+5V上,开关另一端接地,当开关打开时,I/O引脚为高电平,当开关闭合时,I/O引脚为低电平。【例5-3】 如图5-3,单片机的P1.4P1.7接4个开关S0S3,P1.0P1.3接4个发光二极管LED0LED3。 编程将P1.4P1.7上的4个开关状态
13、反映在P1.0P1.3引脚控制的4个发光二极管上,开关闭合,对应发光二极管点亮。例如P1.4引脚上开关S0状态,由P1.0脚上LED0显示,P1.6引脚上开关S2状态,由P1.2脚的LED2显示。,5.2.1 开关检测案例1,图5-3 开关、LED发光二极管与P1口的连接,5.2.1 开关检测案例1,参考程序如下: #include #define uchar unsigned char void delay( ) /延时函数 uchar i,j;for(i=0; i255; i+)for(j=0; j255; j+); ,5.2.1 开关检测案例1,void main( ) /主函数 whi
14、le (1) unsigned char temp; /定义临时变量tempP1=0xff; /P1口低4位置1,作为输入;高4位置1,发光二极管熄灭temp=P1 ,5.2.2 开关检测案例2,【例5-4】 如图5-4,P1.0和P1.1引脚接有两只开关S0和S1,两引脚上的高低电平共4种组合,4种组合分别点亮P2.0P2.3引脚控制的4只LED,即S0、S1均闭合,LED0亮,其余灭;S1闭合、S0打开,LED1亮,其余灭;S0闭合、S1打开,LED2亮,其余灭;S0、S1均打开,LED3亮,其余灭。编程实现此功能。,5.2.2 开关检测案例2,图5-4 开关检测指示器2接口电路与仿真,5
15、.2.2 开关检测案例2,参考程序:,#include / 包含头文件reg51.h void main( ) /主函数main( )char state;do P1=0xff; / P1口为输入state=P1; / 读入P1口的状态,送入statestate=state / 屏蔽P1口的高6位,5.2.2 开关检测案例2,switch (state) / 判P1口低2位开关状态case 0: P2=0x01; break;/ P1.1、P1.0=00,点亮P2.0脚LED case 1: P2=0x02; break;/ P1.1、P1.0=01,点亮P2.1脚LED case 2: P2
16、=0x04; break;/ P1.1、P1.0=10,点亮P2.2脚LED case 3: P2=0x08; break;/ P1.1、P1.0=11,点亮P2.3脚LED while ( 1 ); ,程序段中用到循环结构控制语句do-while以及switch-case语句。,目 录,CONTENTS,5.1 单片机控制发光二极管显示,5.2 开关状态检测,5.3 单片机控制LED数码管的显示,5.4 单片机控制LED点阵显示器显示,5.5 单片机控制液晶显示模块1602 LCD的显示,5.6 键盘接口设计,5.3.1 LED数码管显示原理,LED数码管: “8”字型,7段(不包括小数点)
17、或8段(包括小数点),每段对应一个发光二极管,共阳极和共阴极两种,见图5-5。共阳极数码管的阳极连接在一起,接+5V;共阴极数码管阴极连在一起接地。 对于共阴极数码管,当某发光二极管阳极为高电平时,发光二极管点亮,相应段被显示。同样,共阳极数码管阳极连在一起,公共阳极接+5V,当某个发光二极管阴极接低电平时,该发光二极管被点亮,相应段被显示。,5.3.1 LED数码管显示原理,图5-5 8段LED数码管结构及外形,5.3.1 LED数码管显示原理,为使LED数码管显示不同字符,要把某些段点亮,就要为数码管各段提供一字节的二进制码,即字型码(也称段码)。习惯上以“a”段对应字型码字节的最低位。各
18、字符段码见表5-1。,5.3.1 LED数码管显示原理,如要在数码管显示某字符,只需将该字符字型码加到各段上即可。 例如某存储单元中的数为“02H”,想在共阳极数码管上显示“2”,需要把“2”的字型码“A4H”加到数码管各段。将欲显示字符的字型码作成一个表(数组),根据显示字符从表中查找到相应字型码,然后把该字型码输出数码管各个段上,同时数码管的公共端接+5V,此时在数码管上显示字符“2”。 下面介绍单片机如何控制LED数码管显示字符。,5.3.1 LED数码管显示原理,【例5-5】利用单片机控制一个8段LED数码管先循环显示单个偶数:0、2、4、6、8,再显示单个奇数:1、3、5、7、9,如
19、此反复循环显示。 本例原理电路及仿真结果,见图5-6。 参考程序如下:,5.3.1 LED数码管显示原理,图5-6 控制数码管循环显示单个数字的电路及仿真,5.3.1 LED数码管显示原理,#include “reg51.h“ #include “intrins.h“ #define uchar unsigned char #define uint unsigned int #define out P0 uchar code seg=0xc0,0xa4,0x99,0x82,0x80,0xf9,0xb0,0x92,0xf8,0x90,0x01; /共阳极段码表 void delayms(uint
20、);,5.3.1 LED数码管显示原理,void main(void) uchar i; while(1) out=segi;delayms(900);i+;if(segi=0x01)i=0; / 如段码为0x01,表明一个循环显示已结束 ,5.3.1 LED数码管显示原理,void delayms(uint j) / 延时函数 uchar i; for(;j0;j-) i=250;while(-i);i=249;while(-i); ,5.3.1 LED数码管显示原理,说明:语句“if(segi=0x01)i=0; ” 含义:如果欲送出的数组元素为0x01(数字“9”段码0x90的下一个元素
21、,即结束码),表明一个循环显示已结束,则i=0,则重新开始循环显示,从段码数组表的第一个元素seg0,即段码0xc0(数字0)重新开始显示。,5.3.2 LED数码管的静态显示与动态显示,1. 静态显示方式,无论多少位LED数码管,都同时处于显示状态。 多位LED数码管工作于静态显示方式时,各位共阴极(或共阳极)连接在一起并接地(或接+5V);每位数码管段码线(adp)分别与一个8位I/O口锁存器输出相连。如果送往各个LED数码管所显示字符的段码一经确定,则相应I/O口锁存器锁存的段码输出将维持不变,直到送入下一个显示字符段码。静态显示方式显示无闪烁,亮度较高,软件控制较易。,5.3.2 LE
22、D数码管的静态显示与动态显示,1. 静态显示方式,图5-7为4位LED数码管静态显示电路,各数码管可独立显示,只要向控制各位I/O口锁存器送相应显示段码,该位就能保持相应的显示字符。 这样在同一时间,每一位显示的字符可各不相同。静态显示方式占用I/O口端口线较多。图5-7电路,要占用4个8位I/O口(或锁存器)。如数码管数目增多,则需增加I/O口数目。,5.3.2 LED数码管的静态显示与动态显示,1. 静态显示方式,图5-7 4位LED静态显示的示意图,5.3.2 LED数码管的静态显示与动态显示,1. 静态显示方式,【例5-6】单片机控制2只数码管,静态显示2个数字“27”。 原理电路见图
23、5-8。 单片机用P0口与P1口,分别控制加到两个数码管DS0与DS1的段码,而共阳极数码管DS0与DS1的公共端(公共阳极端)直接接至+5V,因此数码管DS0与DS1始终处于导通状态。利用P0口与P1口带有的锁存功能,只需向单片机P0口与P1口分别写入相应的显示字符“2”和“7”的段码即可。 由于一个数码管就占用一个I/O端口。如果数码管数目增多,则需增加I/O口,但软件编程要简单的多。,5.3.2 LED数码管的静态显示与动态显示,图5-8 2位数码管静态显示的原理电路与仿真,5.3.2 LED数码管的静态显示与动态显示,1. 静态显示方式,参考程序如下: #include /包含8051
24、单片机寄存器定义的头文件 void main(void) P0=0xa4; /将数字“2“的段码送P0口P1=0xf8; /将数字“7“的段码送P1口while(1) /无限循环; ,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,显示位数较多时,静态显示所占的I/O口多,这时常采用动态显示。为节省I/O口,通常将所有显示器段码线相应段并联在一起,由一个8位I/O口控制,各显示位公共端分别由另一单独I/O口线控制。,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,图5-9:4位8段LED动态显示器电路示意图。其中单片机发出的段码占用1个8位I/O(1)端口,
25、而位选控制使用I/O(2)端口中4位口线。 动态显示就是单片机向段码线输出欲显示字符的段码。每一时刻,只有1位位选线有效,即选中某一位显示,其他各位位选线都无效。每隔一定时间逐位轮流点亮各数码管(扫描方式),由于数码管余辉和人眼的“视觉暂留”作用,只要控制好每位数码管显示时间和间隔,则可造成“多位同时亮”的假象,达到同时显示效果。,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,图5-9 4位LED数码管动态显示示意图,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,各位数码管轮流点亮的时间间隔(扫描间隔)应根据实际情况定。发光二极管从导通到发光有一定的延时
26、,如果点亮时间太短,发光太弱,人眼无法看清;时间太长,产生闪烁现象,且此时间越长,占用单片机时间也越多。另外,显示位数增多,也将占用单片机大量时间,因此动态显示实质是以执行程序时间来换取I/O端口减少。下面是动态显示实例。,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,【例5-7】 8只数码管,分别滚动显示单个数字18。程序运行后,单片机控制左边第1个数码管显示1,其他不显示,延时之后,控制左边第2个数码管显示1,其他不显示,直至第8个数码管显示8,其他不显示,反复循环上述过程。,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,动态显示电路见图5-10,P
27、0口输出段码,P2口输出扫描的位控码,通过由8个NPN晶体管的位驱动电路对8个数码管位控扫描。即使扫描速度加快,由于是虚拟仿真,数码管的余辉也不能像实际电路那样体现出来。如对本例实际硬件显示电路进行快速扫描,由于数码管余辉和人眼 “视觉暂留”作用,只要控制好每位数码管显示的时间和间隔,则可造成“多位同时亮” 假象,达到同时显示效果。,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,但虚拟仿真做不到这一点。仿真运行下,只能是一位一位点亮显示,不能看到同时显示效果,但本例使我们了解动态扫描显示实际过程。如采用实际硬件电路,用软件控制快速扫描,可看到“多位同时点亮” 效果。,5.3
28、.2 LED数码管的静态显示与动态显示,图5-10 8只数码管分别滚动显示单个数字18,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,参考程序如下: #include #include #define uchar unsigned char #define uint unsigned int uchar code dis_code=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xc0; /共阳数码管段码表 void delay(uint t) /延时函数uchar i;while(t-) for(i=0;i200;i+
29、); ,5.3.2 LED数码管的静态显示与动态显示,2. 动态显示方式,void main() uchar i,j=0x80;while(1) for(i=0;i8;i+) j=_crol_(j,1); /_crol_(j,1)为将对象j循环左移1位P0=dis_codei; /P0口输出段码P2=j; /P2口输出位控码delay(180); /延时,控制每位显示的时间 ,目 录,CONTENTS,5.1 单片机控制发光二极管显示,5.2 开关状态检测,5.3 单片机控制LED数码管的显示,5.4 单片机控制LED点阵显示器显示,5.5 单片机控制液晶显示模块1602 LCD的显示,5.6
30、 键盘接口设计,5.4 单片机控制LED点阵显示器显示,LED点阵显示器应用非常广泛,在许多公共场合,如商场、银行、车站、机场、医院随处可见。不仅能显示文字、图形,还能播放动画、图像、视频等信号。 LED点阵显示器分为图文显示器和视频显示器,有单色显示,还有彩色显示。下面仅介绍单片机如何来控制单色LED点阵显示器的显示。,5.4.1 LED点阵显示器结构与显示原理,1. LED点阵结构,以88LED点阵显示器为例,外形见图5-11,内部结构见图5-12,由64个发光二极管组成,且每个发光二极管是处于行线(R0R7)和列线(C0C7)之间交叉点上。,图5-11 88 LED点阵显示器外形,5.4
31、.1 LED点阵显示器结构与显示原理,2. LED点阵显示原理,显示的字符由一个个点亮的LED所构成。 由图5-12点亮点阵中一个发光二极管条件:对应行为高电平,对应列为低电平。如在很短时间内依次点亮很多个发光二极管,LED点阵就可显示一个稳定字符、数字或其他图形。控制LED点阵显示器显示,实质就是控制加到行线和列线上编码,控制点亮某些发光二极管(点),从而显示出由不同发光点组成的各种字符。,5.4.1 LED点阵显示器结构与显示原理,1. LED点阵结构,图5-12 88LED点阵显示器(共阴极)的结构,5.4.1 LED点阵显示器结构与显示原理,2. LED点阵显示原理,1616 LED点
32、阵显示器的结构与88LED点阵显示模块内部结构及显示原理是类似的,只不过行和列均为16。1616是由4个88 LED点阵组成,且每个发光二极管也是放置在行线和列线的交叉点上,当对应某一列置0电平,某一行置1电平时,该发光二极管点亮。 下面以显示字符“子”为例,见图5-13。,5.4.1 LED点阵显示器结构与显示原理,1. LED点阵结构,图5-13 1616 LED点阵显示器显示字符“子”,5.4.1 LED点阵显示器结构与显示原理,2. LED点阵显示原理,显示过程如下:,先给LED点阵的第1行送高电平(行线高电平有效),同时给所有列线送高电平(列线低电平有效),从而第1行发光二极管全灭;
33、 延时一段时间后,再给第2行送高电平,同时给所有列线送“1100 0000 0000 1111”,列线为0的发光二极管点亮,从而点亮10个发光二极管,显示出汉字“子”的第一横;,5.4.1 LED点阵显示器结构与显示原理,2. LED点阵显示原理,延时一段时间后,再给第3行送高电平,同时加到列线的编码为“1111 1111 1101 1111”,点亮1个发光二极管; ; 延时一段时间后,再给第16行送高电平,同时给列线送“1111 1101 1111 1111” ,显示出汉字“子”的最下面的一行,点亮1个发光二极管。然后再重新循环上述操作,利用人眼视觉暂留效应,一个稳定字符“子” 显示出来,见
34、图5-13。,5.4.2 控制1616 LED点阵显示屏的案例,单片机控制1616点阵显示屏显示字符案例。 【例5-8】如图5-14,利用单片机及 74LS154(4-16译码器)、74LS07、1616 LED点阵显示屏来实现字符显示,编写程序,循环显示字符“电子技术”。 图中1616 LED点阵显示屏16行行线R0R15电平,由P1口低4位经4-16译码器74HC154的16条译码输出线L0L15经驱动后的输出来控制。16列列线C0C15的电平由P0口和P2口控制。剩下问题是如何确定显示字符的点阵编码,以及控制好每一屏逐行显示的扫描速度(刷新频率)。,5.4.2 控制1616 LED点阵显
35、示屏的案例,图5-14 控制1616LED点阵显示器(共阴极)显示字符,5.4.2 控制1616 LED点阵显示屏的案例,参考程序如下: #include #define uchar unsigned char #define uint unsigned int #define out0 P0 #define out2 P2 #define out1 P1 void delay(uint j) /延时函数uchar i=250;for(;j0;j-) while(-i);i=100;,5.4.2 控制1616 LED点阵显示屏的案例,uchar code string= /汉字“电” 1616
36、点阵列码 0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x03,0xE0,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,0x7F,0xBF,0x7F,0xBF,0xFF,0x00,0xFF,0xFF /汉字“子” 1616点阵列码 0xFF,0xFF,0x03,0xF0,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0x7F,0xFF,0x7F,0xFF,0x7F,0xDF,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF
37、,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,0xFF /汉字“技” 1616点阵列码 0xF7,0xFB,0xF7,0xFB,0xF7,0xFB,0x40,0x80,0xF7,0xFB,0xD7,0xFB,0x67,0xC0,0x73,0xEF,0xF4,0xEE,0xF7,0xF6,0xF7,0xF9,0xF7,0xF9,0xF7,0xF6,0x77,0x8F,0x95,0xDF,0xFB,0xFF,5.4.2 控制1616 LED点阵显示屏的案例,/汉字“术”的1616点阵的列码 0x7F,0xFF,0x7F,0xFB,0x7F,0xF7,0x7F,0xFF,0
38、x00,0x80,0x7F,0xFF,0x3F,0xFE,0x5F,0xFD, 0x5F,0xFB,0x6F,0xF7,0x77,0xE7,0x7B,0x8F,0x7C,0xDF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,; void main() uchar i,j,n;while(1) for(j=0;j4;j+) /共显示4个汉字,5.4.2 控制1616 LED点阵显示屏的案例,for(n=0;n40;n+) /每个汉字整屏扫描40次for(i=0;i16;i+) /逐行扫描16行out1=i%16; /输出行码, out0=stringi*2+j*32; /输出列码
39、到C0C7,逐行扫描out2=stringi*2+1+j*32; /输出列码到C8C15,逐行扫描delay(4); /显示并延时一段时间out0=0xff; /列线C0C7为高电平,熄灭发光二极管out2=0xff; /列线C8C15为高电平,熄灭发光二极管 ,5.4.2 控制1616 LED点阵显示屏的案例,扫描显示时,单片机通过P1口低4位经4-16译码器74HC154的16条译码输出线L0L15经驱动后的输出来控制,逐行为高电平,来进行扫描。由P0口与P2口控制列码的输出,从而显示出某行应点亮的发光二极管。,以显示汉字“子”为例,说明显示过程。由上面程序可看出,汉字“子”的前3行发光二
40、级管的列码为“0xFF,0xFF,0x03,0xF0,0xFF,0xFB,”,5.4.2 控制1616 LED点阵显示屏的案例,按照图5-12和图5-14连线关系,加到从左到右发光二极管应为C0 C7的二进制编码为“1100 0000”,即最左边的2个发光二极管不亮,其余的6个发光二极管点亮。,第一行列码为:“ 0xff,0xff”,由P0口与P2口输出,无点亮的发光二极管。,第二行列码为:“0x03,0xf0”,通过P0口与P2口输出后,由图5-13看出,0x03加到列线C7 C0的二进制编码为“0000 0011”,这里要注意加到8个发光二极管上的对应位置。,5.4.2 控制1616 LE
41、D点阵显示屏的案例,同理,P2口输出的0xF0加到列线C15 C8的二进制编码为“1111 0000”,即加到C8 C15的二进制编码为“0000 1111”,所以第二行的最右边的4个发光二极管不亮,如图5-13所示。对应通过P0口与P2口输出加到第3行16个发光二极管的列码为“0xFF,0xFB,”,对应于从左到右的C0 C15的二进制编码为“1111 1111 1101 1111”,从而第3行左边数第11个发光二极管被点亮,其余均熄灭,如图5-13所示。其余各行点亮的发光二极管,也是由1616点阵的列码来决定。,目 录,CONTENTS,5.1 单片机控制发光二极管显示,5.2 开关状态检
42、测,5.3 单片机控制LED数码管的显示,5.4 单片机控制LED点阵显示器显示,5.5 单片机控制液晶显示模块1602 LCD的显示,5.6 键盘接口设计,5.5 单片机控制液晶显示模块1602 LCD的显示,液晶显示器(Liquid Crystal Display,LCD)具有省电、体积小、抗干扰能力强等优点, LCD显示器分为字段型、字符型和点阵图形型。,字段型。以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。,字符型。专门用于显示字母、数字、符号等。一个字符由57或510的点阵组成,在单片机系统中已广泛使用。,5.5 单片机控
43、制液晶显示模块1602 LCD的显示,点阵图形型。广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。,5.5.1 LCD 1602液晶显示模块简介,单片机系统中常用的字符型液晶显示模块。由于LCD显示面板较为脆弱,厂商已将LCD控制器、驱动器、RAM 、ROM和液晶显示器用PCB连接到一起,称为液晶显示模块(LCd Module,LCM),购买现成的即可。单片机只需向LCD显示模块写入相应命令和数据就可显示需要的内容。,5.5.1 LCD 1602液晶显示模块简介,字符型LCD模块常用的有16字1行、16字2行、20字
44、2行、20字4行等模块,型号常用1602、1604、2002、2004来表示,其中为商标名称,16代表液晶显示器每行可显示16个字符,02表示显示2行。 LCD1602内有字符库ROM(CGROM),能显示出192个字符(57点阵),如图5-15所示。,1字符型液晶显示模块LCD 1602特性与引脚,5.5.1 LCD 1602液晶显示模块简介,1字符型液晶显示模块LCD 1602特性与引脚,图5-15 ROM字符库的内容,5.5.1 LCD 1602液晶显示模块简介,1字符型液晶显示模块LCD 1602特性与引脚,由字符库可看出显示器显示的数字和字母部分代码,恰是ASCII码表中编码。 单片
45、机控制LCD 1602显示字符,只需将待显示字符的ASCII码写入显示数据存储器(DDRAM),内部控制电路就可将字符在显示器上显示出来。,5.5.1 LCD 1602液晶显示模块简介,例如,显示字符“A”,单片机只需将字符“A”的ASCII码41H写入DDRAM,控制电路就会将对应的字符库ROM(CGROM)中的字符“A”的点阵数据找出来显示在LCD上。 模块内有80字节数据显示RAM (DDRAM),除显示192个字符(57点阵)的字符库ROM(CGROM)外,还有64字节的自定义字符RAM(CGRAM),用户可自行定义8个57点阵字符。,1字符型液晶显示模块LCD 1602特性与引脚,5
46、.5.1 LCD 1602液晶显示模块简介,LCD 1602工作电压4.55.5V,典型5V,工作电流2mA。标准的14引脚(无背光)或16个引脚(有背光)的外形及引脚分布如图5-16所示。,1字符型液晶显示模块LCD 1602特性与引脚,(a) LCD 1602的外形,(b) LCD 1602的引脚,图5-16 LCD 1602外形及引脚,5.5.1 LCD 1602液晶显示模块简介,引脚包括8条数据线、3条控制线和3条电源线,见表5-2。通过单片机向模块写入命令和数据,就可对显示方式和显示内容做出选择。,1字符型液晶显示模块LCD 1602特性与引脚,5.5.1 LCD 1602液晶显示模
47、块简介,显示字符首先要解决待显示字符的ASCII码产生。用户只需在C51程序中写入欲显示的字符常量或字符串常量,C51程序在编译后会自动生成其标准的ASCII码,然后将生成的ASCII码送入显示用数据存储器DDRAM,内部控制电路就会自动将该ASCII码对应的字符在LCD1602显示出来。,2LCD1602字符的显示及命令字,5.5.1 LCD 1602液晶显示模块简介,2LCD1602字符的显示及命令字,让液晶显示器显示字符,首先对其进行初始化设置:对有、无光标、光标移动方向、光标是否闪烁及字符移动方向等进行设置,才能获得所需显示效果。 对LCD 1602的初始化、读、写、光标设置、显示数据
48、的指针设置等,都是单片机向LCD 1602写入命令字来实现。命令字见表5-3。,5.5.1 LCD 1602液晶显示模块简介,2LCD1602字符的显示及命令字,5.5.1 LCD 1602液晶显示模块简介,2LCD1602字符的显示及命令字,表5-3中11个命令功能说明如下:,命令1:清屏,光标返回地址00H位置(显示屏的左上方)。 命令2:光标返回到地址00H位置(显示屏的左上方)。 命令3:光标和显示模式设置。,5.5.1 LCD 1602液晶显示模块简介,2LCD1602字符的显示及命令字,I/D地址指针加1或减1选择位。I/D=1,读或写一个字符后地址指针加1;I/D=0,读或写一个字符后地址指针减1。,