版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机与液晶显示器第1页,共67页,2022年,5月20日,17点54分,星期二1.多位LED显示2.键盘管理模块3.点阵、字符液晶显示器4.字模提取软件第2页,共67页,2022年,5月20日,17点54分,星期二LED的工作原理(a)典型的七段式LED器件 (b) 共阳极LED (c) 共阴极LED第3页,共67页,2022年,5月20日,17点54分,星期二四位数七段LED数码管模块(左为正面图、右为背面图)第4页,共67页,2022年,5月20日,17点54分,星期二第5页,共67页,2022年,5月20日,17点54分,星期二LED数码管和单片机的连接1 单片机P2.0P2.7abc
2、defgdp +5v +5vabcdefgdpP0.0P0.7编程:(以共阳极为例)MOVP2,#11111001B(0F9H)MOVP0,#10100100B(0A4H)SJMP$第6页,共67页,2022年,5月20日,17点54分,星期二LED数码管和单片机的连接2 单片机P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3想一想:和静态连接的区别在哪里?第7页,共67页,2022年,5月20日,17点54分,星期二 单片机 P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3 电路的接法决定了必须采用逐位扫描显示方式。即从段选口送出某位LED的字型码,然后选
3、通该位LED, 并保持一段延时时间。然后选通下一位,直到所有位扫 描完。怎样实现显示呢?第8页,共67页,2022年,5月20日,17点54分,星期二静态、动态显示方式总结静态显示连接所有LED的位选均共同连接到+VCC或GND,每个LED的8根段选线分别连接一个8位并行I/O口。原理简单;显示无闪烁;占用I/O资源较多。动态显示连接 所有LED的段选线共同连接在一起共用一个 8位I/O口而每个LED的位选分别由一根相应的I/O口线控制。因此必须采用动态扫描显示方式。第9页,共67页,2022年,5月20日,17点54分,星期二例:74ls164+led(proteus)第10页,共67页,2
4、022年,5月20日,17点54分,星期二独立键盘第11页,共67页,2022年,5月20日,17点54分,星期二case 0 x01: key1(); /键盘1功能函数。 break; case 0 x02: key2();/键盘2功能函数。 break; case 0 x04: key3(); /键盘3功能函数。 break; case 0 x08: key4();/键盘4功能函数。 break; case 0 x10: key5(); /键盘5功能函数。 break; case 0 x20: key6();/键盘6功能函数。 break; case 0 x40: key7(); /键盘7
5、功能函数。 break; case 0 x80: key8();/键盘8功能函数。 break; default:break; 说明 :采用轮询方式查询P1口,采用延时法消除键盘抖动*/#include /* 函数名称:delay()功能:用于键盘消抖的延时函数说明:无 入口参数:无返回值 :无*/void delay() unsigned char i; for (i=400;i0;i-);/ 主函数 main()void main(void) unsigned char key; while(1) P1=0 xff; /要想从P1口读数据必须先给P1口写1 key=P1; /读入P1口的数
6、据,赋值给变量key if(key!=0 x00) /判断是否有键按下,当没有键按下时,P1口的数据为0 x00 delay(); /延时去抖 key=P1; /再次读入P1口的数据,赋值给变量key if(key!=0 x00) /再次判断是否有键按下 switch(key) 第12页,共67页,2022年,5月20日,17点54分,星期二矩阵式键盘控制第13页,共67页,2022年,5月20日,17点54分,星期二4x4 键盘的内部结构第14页,共67页,2022年,5月20日,17点54分,星期二市售一体成型的4x4键盘第15页,共67页,2022年,5月20日,17点54分,星期二低电
7、平扫描按下“0”键第16页,共67页,2022年,5月20日,17点54分,星期二X3X2X1X0Y3Y2Y1Y0动作按键11101110Key 01101Key 11011Key 20111Key 311011110Key 41101Key 51011Key 60111Key 710111110Key 81101Key 91011Key A0111Key B01111110Key C1101Key D1011Key E0111Key Fxxxx1111无按键按下低电平动作键盘动作分析表第17页,共67页,2022年,5月20日,17点54分,星期二高电平扫描按下“0”键第18页,共67页,2
8、022年,5月20日,17点54分,星期二X3X2X1X0Y3Y2Y1Y0动作按键00010001Key 00010Key 10100Key 21000Key 300100001Key 40010Key 50100Key 61000Key 701000001Key 80010Key 90100Key A1000Key B10000001Key C0010Key D0100Key E1000Key Fxxxx0000无按键按下高电平动作键盘动作分析表第19页,共67页,2022年,5月20日,17点54分,星期二44键盘扫描电路第20页,共67页,2022年,5月20日,17点54分,星期二基本
9、原理:分行扫描检查是否有键按下若有,确定哪个键被按下1. 行扫描法的原理第21页,共67页,2022年,5月20日,17点54分,星期二 判断哪一个键被按下的流程第22页,共67页,2022年,5月20日,17点54分,星期二P1=0 xfe;n=P1;n&=0 xf0;if(n!=0 xf0) delay(); P1=0 xfe; n=P1; n&=0 xf0; if(n!=0 xf0) switch(n) case(0 xe0):display(0);break; case(0 xd0):display(1);break; case(0 xb0):display(2);break; cas
10、e(0 x70):display(3);break; P1=0 xfd;n=P1;n&=0 xf0;if(n!=0 xf0) delay(); P1=0 xfd; n=P1; n&=0 xf0; if(n!=0 xf0) switch(n) case(0 xe0):display(4);break; case(0 xd0):display(5);break; case(0 xb0):display(6);break; case(0 x70):display(7);break; P1=0 xfb;n=P1;n&=0 xf0;if(n!=0 xf0) delay(); P1=0 xfb; n=P1
11、; n&=0 xf0; if(n!=0 xf0) switch(n) case(0 xe0):display(8);break; case(0 xd0):display(9);break; case(0 xb0):display(10);break; case(0 x70):display(11);break; P1=0 xf7;n=P1;n&=0 xf0;if(n!=0 xf0) delay(); P1=0 xf7; n=P1; n&=0 xf0; if(n!=0 xf0) switch(n) case(0 xe0):display(12);break; case(0 xd0):displa
12、y(13);break; case(0 xb0):display(14);break; case(0 x70):display(15);break; void display(unsigned char i)unsigned char table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E;P2=0 xfe;P0=tablei;第23页,共67页,2022年,5月20日,17点54分,星期二2. 行反转法的原理行线、列线分别接并行口行线输出,列线输
13、入列线输出读得的值,行线输入第24页,共67页,2022年,5月20日,17点54分,星期二行反转法的流程 第25页,共67页,2022年,5月20日,17点54分,星期二uchar keyscan(void)/键盘扫描函数,使用行列反转扫描法 uchar cord_h,cord_l;/行列值 P3=0 x0f; /行线输出全为0 cord_h=P3&0 x0f; /读入列线值 if(cord_h!=0 x0f) /先检测有无按键按下 delay(100); /去抖 if(cord_h!=0 x0f) cord_h=P3&0 x0f; /读入列线值 P3=cord_h|0 xf0; /输出当前
14、列线值 cord_l=P3&0 xf0; /读入行线值 return(cord_h+cord_l);/键盘最后组合码值 此处仿真第26页,共67页,2022年,5月20日,17点54分,星期二测控系统中必不可少的组成人机界面图1 测控系统的组成部分第27页,共67页,2022年,5月20日,17点54分,星期二液晶显示器的原理字符型液晶(1602)方法:通过向指定显示位置对应的DDRAM中写数据来显示字符。例如:在第2行第2列显示字符 a,查表1 可知a对应的代码为01100001即0 x31,则可向地址0 x41中写入数据0 x31即可显示。图2 1602的显示地址与DDRAM地址第28页,
15、共67页,2022年,5月20日,17点54分,星期二点阵型液晶(12864)在点阵型LCD上显示一幅图片或是字符,如上图所示,只需黑色的部分点亮,空白的点置0即可。可以将LCD看成128*64个LED灯来帮助理解。第29页,共67页,2022年,5月20日,17点54分,星期二正面图背面图第30页,共67页,2022年,5月20日,17点54分,星期二12864分类12864点阵液晶显示屏有三种控制器,分别是KS0107(KS0108)、T6963C和ST7920,三种控制器主要区别是:KS0107(KS0108)不带任何字库、T6963C带ASCII码,ST7920带国标二级字库(8千多个
16、汉字)。第31页,共67页,2022年,5月20日,17点54分,星期二图3 12864的DDRAM地址第32页,共67页,2022年,5月20日,17点54分,星期二XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y(列)地址指针。X地址计数器没有记数功能,只能用指令设置。Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。从上图可以看出数据按字节在屏幕上是竖向排列的。上方为低位,下方为高位。因此在横向上(也就是Y)就一共是128列数据。分为CS1和CS2两个64列来写入。在竖方向上(也就是X)一字
17、节数据显示8个点,竖向64个点分为8个字节,称做8页(X=0-7)。了解这些后我们就知道要满屏显示一张图就要从y=0127、X=07一共写1288=1024个字节的数据。同样在AT89S51中存一张图就要1024个字节的空间。 第33页,共67页,2022年,5月20日,17点54分,星期二图片在12864上的显示简单来说,主要分为两步:1)将一幅图片转化为一系列二进制数据2)将数据按字节(8位)写入液晶对应的DDRAM由图3可知,12864的DDRAM有128*8=1024个地址,只需将图片转化的数据按字节写入这其对应的DDRAM地址即可。第34页,共67页,2022年,5月20日,17点5
18、4分,星期二字符在12864上的显示上图中,汉字为16*16点阵,ASCII码为8*16点阵,同图片一样,一个汉字(ASCII)由16*2(8*2)个字节数据组成,字符显示原理与图片一致,只需将字符代码写入相应DDRAM地址。字体大小可以根据需要改变。第35页,共67页,2022年,5月20日,17点54分,星期二小结简而言之,无论是字符型还是点阵型LCD,其基本原理都是通过将数据写入所对应的DDRAM地址中来显示所需要的图形或是字符。12864点阵型液晶对应的DDRAM有1024个地址,当需显示的字符或图片已转为二进制数据时,确定将数据写入对应的DDRAM地址就是你所要做的工作!第36页,共
19、67页,2022年,5月20日,17点54分,星期二单片机与液晶显示器的硬件连接液晶显示器(12864)主要包含了以下接口(图6) :1)使能E(51的RD和WR经或非门接LCD的使能E)2)片选CS1(左半屏)、CS2(右半屏),见图33)命令/数据选择RS(0命令,1数据)4)读/写选择R/W(0写,1读)5)数据总线DB0DB76)负压产生和负压输入(对比度)调整7)复位RST8)电源与地和背景光电源第37页,共67页,2022年,5月20日,17点54分,星期二软件编程注意:程序的编写与硬件是分不开的。以图6为例,A11A8对应CS2、CS1、R/W、RS,未用的地址线为高。见图5则当
20、向12864的左半屏(CS1=1,CS2=0)写(R/W=0)数据(RS=1)时,总线地址为0 x1111010111111111。即0 xF5FF。C文件中定义如下:#define WD1 XBYTE0 xF5FF定义了总线地址后,对外部地址的操作变得非常简单。如向左半屏写数据0 xFF: WD1=0 xFF 读左半屏数据 : data=RD1(data存储读取到的数据)第38页,共67页,2022年,5月20日,17点54分,星期二举例下面简单介绍程序编写的流程1)定义所有总线地址#define WI1 XBYTE0 xF4FF/向左半屏写命令#define WD1 XBYTE0 xF5F
21、F /向左半屏写数据#define RI1 XBYTE0 xF6FF /读左半屏命令#define RD1 XBYTE0 xF7FF /读左半屏数据#define WI2 XBYTE0 xF8FF /向右半屏写命令#define WD2 XBYTE0 xF9FF/向右半屏写数据#define RI2 XBYTE0 xFAFF /读右半屏命令#define RD2 XBYTE0 xFBFF/读右半屏数据第39页,共67页,2022年,5月20日,17点54分,星期二2)编写底层程序(查忙,写数据,读数据)查忙(读BF标志即DB7总线,亦即读命令)BF=1表示模块在内部操作,此时模块不接受外部指令
22、和数据; BF=0时模块为准备状态,随时可接受外部指令和数据;b=RI1 或者 b=RI2,观察b中最高位是否为0,否则忙。写数据aWD1=a或者WD2=a读数据到datadata=RD1或者data=RD2注意:无论是写数据还是读数据一定要先查忙(对左右半屏读命令),只有在BF=0时才能对LCD进行操作第40页,共67页,2022年,5月20日,17点54分,星期二3)LCD初始化包含开显示(0 x3F),起始行(0 xC0),设置起始页地址(0 xB8)和Y地址(0 x40),即分别向LCD的左右半屏写命令。可按括号内的数据进行初始化。具体可查阅12864的PDF资料。4)清屏(向DDRA
23、M所有地址写0)显示一幅新图片前必须清屏,否则之前显示的数据仍存在于液晶上。第41页,共67页,2022年,5月20日,17点54分,星期二5)指定位置显示一个ASCII码首先将起始页地址和起始Y地址设置好,写入ASCII码的上半部分(8个字节数据)重新设置起始页地址和起始Y地址,写入ASCII码的下半部分(另8个字节数据)注意:在对DDRAM进行读写操作后,Y地址指针自动加1,指向下一个DDRAM 单元。第42页,共67页,2022年,5月20日,17点54分,星期二6)指定位置显示汉字 同显示ASCII码基本相似,只是上下部分分别有16个字节数据需要写入DDRAM。7)显示一张图片对于图片
24、,必然从第0页第0列开始,可以一页一页(不分左右屏)显示,也可以先写左半屏后写右半屏。所谓的两种方法差别正在设置的起始页地址和Y地址的不同。图3第43页,共67页,2022年,5月20日,17点54分,星期二小结12864点阵型液晶对应的DDRAM有1024个地址,无论是显示字符还是图片,灵活设置起始页地址和Y地址,可以达到想要的结果。C语言中用到总线操作必须添加头文件“absacc.h”,另如使用仿真器,需在debug中的setting里选择使用xbus(数据总线)。可使用取字模软件将字符或图片转为一系列二进制数据。第44页,共67页,2022年,5月20日,17点54分,星期二写程序:附件
25、第45页,共67页,2022年,5月20日,17点54分,星期二3)写数据datvoid WriteData(uchar dat,bit side) CheckBusy(side);if(side=Left)WD1=dat;elseWD2=dat;写命令cmd(side0为左,1为右)void WriteCmd(uchar cmd, bit side) CheckBusy(side);if(side=Left)/Left=0(宏定义)WI1=cmd;elseWI2=cmd;第46页,共67页,2022年,5月20日,17点54分,星期二读操作时序第47页,共67页,2022年,5月20日,17
26、点54分,星期二1)查忙程序void CheckBusy(bit side)/side0为左1为右 unsigned char buf=0 xFF; while(buf)if(!side)buf=RI1;/单片机命令elsebuf=RI2; buf&=0 x80; /取D7若为1则忙,忙则buf != 0(LCD回信号)第48页,共67页,2022年,5月20日,17点54分,星期二初始化:第49页,共67页,2022年,5月20日,17点54分,星期二第50页,共67页,2022年,5月20日,17点54分,星期二4)初始化程序void LCD_Init() WriteCmd(0 x3F,L
27、eft);/显示开 WriteCmd(0 x3F,Right);WriteCmd(0 xC0,Left);/起始行 WriteCmd(0 xC0,Right);WriteCmd(0 xB8,Left);WriteCmd(0 xB8,Right);/起始x,y坐标(0,0)WriteCmd(0 x40,Left);WriteCmd(0 x40,Right);第51页,共67页,2022年,5月20日,17点54分,星期二5)清屏(一般dat=0)void LCD_Clear(uchar dat) uchar i,j;for(i=0;i8;i+)WriteCmd(0 xB8+i,Left);Wri
28、teCmd(0 xB8+i,Right);WriteCmd(0 x40,Left);WriteCmd(0 x40,Right);for(j=0;j64;j+)WriteData(dat,Left);WriteData(dat,Right);第52页,共67页,2022年,5月20日,17点54分,星期二总结理解12864是如何显示字符和图形的知晓单片机与12864的硬件连接根据硬件接线,确定所有的总线地址(8个)明白如何通过总线操作对12864进行数据与命令的交换参考12864的命令字进行软件编程学会如何使用取字模软件第53页,共67页,2022年,5月20日,17点54分,星期二图6 AT8
29、9C51与12864的硬件连接第54页,共67页,2022年,5月20日,17点54分,星期二LCD12864模块的20个引脚定义如下:1.Vss 逻辑电源地2.VDD逻辑电源正5v3.V0LCD驱动电压4.RS 数据/指令选择:高电平为数据, 低电平为指令5.R/W读/写选择:高电平为读数据, 低电平为写数据6.E读写使能,高电平有效, 下降沿锁定数据7.DB0数据输入输出引脚8.DB1数据输入输出引脚9.DB2数据输入输出引脚10.DB3数据输入输出引脚11.DB4数据输入输出引脚12.DB5数据输入输出引脚13.DB6数据输入输出引脚14.DB7数据输入输出引脚15.CS1片选择号,低电
30、平时选择前64列16.CS2片选择号,低电平时选择后64列17.RET复位信号,低电平有效。18.VEE输出15v电源给V0提供驱动电源19.A背光电源LED正极20.K背光电源LED负极图5.LCD引脚图第55页,共67页,2022年,5月20日,17点54分,星期二带字库12864带字库的12864的基本特性:(1)显示分辨率:12864点 (就是64行,每行128个点)(2)内置汉字字库,提供8192个1616点阵汉字(12864内部有一个CGROM,内容掉电可以存储,所以汉字字库会存放在里面。满屏最多显示4*8=32个汉字)。(3)内置 128个168点阵ASCII字符(12864一次
31、最多可以显示4*16=64个ASCII字符)。(4)通讯方式:串行、并口可选 (数据写入和读出可以是以串行的方式,也可以是以并行的方式。)第56页,共67页,2022年,5月20日,17点54分,星期二第57页,共67页,2022年,5月20日,17点54分,星期二所以只要我们写入指令0 x01,整个屏幕就被清空了。LCD初始化:一般用指令0 x0c,开显示,关闭光标 既可以控制扩展功能,又可以控制绘图显示的指令!用0X30,基本指令集第58页,共67页,2022年,5月20日,17点54分,星期二指令0X06光标右移第59页,共67页,2022年,5月20日,17点54分,星期二1.汉字显示
32、坐标 显示汉字一屏可以显示4*8=32个16*16的汉字。实物图对照下,把地址也表到实物图上去了。 第60页,共67页,2022年,5月20日,17点54分,星期二操作的具体流程:A进入基本指令模式(指令16,指令为0 x30)B写入xy地址(地址需要查上表,用指令8,也就是写入DDRAM)C写入欲写入的汉字的编码(一般定义一个数组,直接把汉字存放在里面即可,存储的时候它就是以编码的形式。例如:uchar code dis1=“南京师范大学;)例程代码:uchar code dis3 = “南京师范大学;void display_hz()Uchar I;Write_comd(0 x30);/基
33、本指令Write_comd(0 x80);/写在第一个位置上For(i=0;i8;i+)Write_da(dis3i);/把数据送到端口Delay_ms(5);/延时一会 第61页,共67页,2022年,5月20日,17点54分,星期二2.ASCII显示坐标:它的坐标和汉字的坐标是一样的,只不过一个汉字的位置可以放两个ASCII码字符。因为前者为16*16后者为16*8,这样一行可以显示16个ASCII码了。在显示一串字符穿的时候,给一个起始地址,屏幕就会依次显示出来(自动加一功能)。 操作的具体流程:A进入基本指令模式(指令16,指令为0 x30)B写入xy地址(地址需要查上表,用指令8,也就是写入DDRAM)C写入欲写入的汉字的编码(一般定义一个数组,直接把ASACII码存放在里面即可,存储的时候它就是以编码的形式。例如:uchar code dis1=SH;)第62页,共67页,2022年,5月20日,17点54分,星期二例程代码:uchar c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中储粮集团黑龙江分公司招聘165人查看职位笔试历年参考题库附带答案详解
- 蓄电池综合性能测试方法规范
- 2026年江苏省常州市武进区前黄实验学校中考英语调研试卷(4月份)(含答案)
- 2026年能源管理系统服务合同
- 2026六年级道德与法治下册 邻里互助精神
- 2025工程(燃气灶安装)合同
- 无人机传感器技术课件 28.湿敏传感器
- 新苏教版三年级数学下册第一单元第9课《用量角器量角》教案
- 2026年道法科学考试题及答案
- 异形墩钢模板拆除施工方案
- 2025年银行业务知识考试题及答案
- 物业纠纷调解技巧2026年培训
- 家长会课件 下学期八年级期中考后分析与安全建议家长会课件
- 17 记金华的双龙洞 课件(内嵌视频)2025-2026学年统编版语文四年级下册
- 2026贵州磷化(集团)有限责任公司春季社会招聘228人笔试参考题库及答案解析
- 山东省地质勘查预算操作细则
- 2026年幕墙工程专项安全监理实施细则
- 2025年高速路巡查员入职考试题库及答案
- 阿司匹林应用指南2025年版
- 卵巢早衰的课件
- 2025长三角新材料行业市场供需现状投资评估规划分析研究报告
评论
0/150
提交评论