《《片机与液晶显示器》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《片机与液晶显示器》PPT课件.ppt(67页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、讲座四v1.多位LED显示v2.键盘管理模块v3.点阵、字符液晶显示器v4.字模提取软件LED的工作原理的工作原理(a)典型的七段式LED器件(b)共阳极LED(c)共阴极LED四位数七段LED数码管模块(左为正面图、右为背面图)LED数码管和单片机的连接1 单片机abcdefgdp +5v +5vabcdefgdpP0.0P0.7编程:(以共阳极为例)MOVP2,#11111001B(0F9H)MOVP0,#10100100B(0A4H)SJMP$静态连接静态显示LED数码管和单片机的连接2 单片机abcdefgdpP0.0P0.1P0.2P0.3想一想:和静态连接的区别在哪里?单片机 ab
2、cdefgdpP0.0P0.1P0.2P0.3 电路的接法决定了必须采用电路的接法决定了必须采用逐位扫描显示方式。即从段选口送出某位即从段选口送出某位LEDLED的字型码,然后选通该位的字型码,然后选通该位LEDLED,并保持一段延时时间。然后选通下一位,直到所有位扫并保持一段延时时间。然后选通下一位,直到所有位扫 描完。描完。怎样实现显示呢?静态、动态显示方式总结q静态显示连接q所有LED的位选均共同连接到+VCC或GND,每个LED的8根段选线分别连接一个8位并行I/O口。q原理简单;显示无闪烁;占用I/O资源较多。v动态显示连接 所有LED的段选线共同连接在一起共用一个 8位I/O口而每
3、个LED的位选分别由一根相应的I/O口线控制。因此必须采用动态扫描显示方式。例:74ls164+led(proteus)独立键盘case0 x01:key1();/键盘1功能函数。break;case0 x02:key2();/键盘2功能函数。break;case0 x04:key3();/键盘3功能函数。break;case0 x08:key4();/键盘4功能函数。break;case0 x10:key5();/键盘5功能函数。break;case0 x20:key6();/键盘6功能函数。break;case0 x40:key7();/键盘7功能函数。break;case0 x80:ke
4、y8();/键盘8功能函数。break;default:break;说明:采用轮询方式查询P1口,采用延时法消除键盘抖动*/#include/*函数名称:delay()功能:用于键盘消抖的延时函数说明:无入口参数:无返回值:无*/voiddelay()unsignedchari;for(i=400;i0;i-);/主函数main()voidmain(void)unsignedcharkey;while(1)P1=0 xff;/要想从P1口读数据必须先给P1口写1key=P1;/读入P1口的数据,赋值给变量keyif(key!=0 x00)/判断是否有键按下,当没有键按下时,P1口的数据为0 x
5、00delay();/延时去抖key=P1;/再次读入P1口的数据,赋值给变量keyif(key!=0 x00)/再次判断是否有键按下switch(key)矩阵式键盘控制4x4键盘的内部结构市售一体成型的4x4键盘低电平扫描按下“0”键X3X2X1X0Y3Y2Y1Y0动作按键11 101110Key 01101Key 11011Key 20111Key 311 011110Key 41101Key 51011Key 60111Key 710 111110Key 81101Key 91011Key A0111Key B01 111110Key C1101Key D1011Key E0111Key
6、 Fxx xx1111无按键按下低电平动作键盘动作分析表高电平扫描按下“0”键X3X2X1X0Y3Y2Y1Y0动作按键00 010001Key 00010Key 10100Key 21000Key 300 100001Key 40010Key 50100Key 61000Key 701 000001Key 80010Key 90100Key A1000Key B10 000001Key C0010Key D0100Key E1000Key Fxx xx0000无按键按下高电平动作键盘动作分析表44键盘扫描电路基本原理:分行扫描检查是否有键按下若有,确定哪个键被按下1.行扫描法的原理行扫描法的原
7、理 判断哪一个键被按下的流程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;case(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)switc
8、h(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;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(
9、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):display(13);break;case(0 xb0):display(14);break;case(0 x70):display(15);break;voiddisplay(unsignedchari)unsignedchartable=0 xC0,0 xF9,0 xA4,0 xB0,
10、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;2.行反转法的原理行反转法的原理行线、列线分别接并行口行线输出,列线输入列线输出读得的值,行线输入行反转法的流程 ucharkeyscan(void)/键盘扫描函数,使用行列反转扫描法ucharcord_h,cord_l;/行列值P3=0 x0f;/行线输出全为0cord_h=P3&0 x0f;/读入列线值if(cord_h!=0 x0f)/先检测有无按键按下delay(100);/去抖if(cord_h!=0 x
11、0f)cord_h=P3&0 x0f;/读入列线值P3=cord_h|0 xf0;/输出当前列线值cord_l=P3&0 xf0;/读入行线值return(cord_h+cord_l);/键盘最后组合码值此此处处仿仿真真测控系统中必不可少的组成人机界面图1测控系统的组成部分液晶显示器的原理v字符型液晶(1602)方法:通过向指定显示位置对应的DDRAM中写数据来显示字符。例如:在第2行第2列显示字符a,查表1可知a对应的代码为01100001即0 x31,则可向地址0 x41中写入数据0 x31即可显示。图21602的显示地址与DDRAM地址点阵型液晶(12864)在点阵型LCD上显示一幅图片
12、或是字符,如上图所示,只需黑色的部分点亮,空白的点置0即可。可以将LCD看成128*64个LED灯来帮助理解。正面图正面图背面图背面图12864分类12864点阵液晶显示屏有三种控制器,分别是KS0107(KS0108)、T6963C和ST7920,三种控制器主要区别是:KS0107(KS0108)不带任何字库、T6963C带ASCII码,ST7920带国标二级字库(8千多个汉字)。图312864的DDRAM地址XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y(列)地址指针。X地址计数器没有记数功能,只能用指令设置。Y地址计数器具有
13、循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。从上图可以看出数据按字节在屏幕上是竖向排列的。上方为低位,下方为高位。因此在横向上(也就是Y)就一共是128列数据。分为CS1和CS2两个64列来写入。在竖方向上(也就是X)一字节数据显示8个点,竖向64个点分为8个字节,称做8页(X=0-7)。了解这些后我们就知道要满屏显示一张图就要从y=0127、X=07一共写1288=1024个字节的数据。同样在AT89S51中存一张图就要1024个字节的空间。图片在12864上的显示v简单来说,主要分为两步:v1)将一幅图片转化为一系列二进制数据v2)将数据按字节(8位)写入液晶对应
14、的DDRAM由图3可知,12864的DDRAM有128*8=1024个地址,只需将图片转化的数据按字节写入这其对应的DDRAM地址即可。字符在12864上的显示上图中,汉字为16*16点阵,ASCII码为8*16点阵,同图片一样,一个汉字(ASCII)由16*2(8*2)个字节数据组成,字符显示原理与图片一致,只需将字符代码写入相应DDRAM地址。字体大小可以根据需要改变。小结v简而言之,无论是字符型还是点阵型LCD,其基本原理都是通过将数据写入所对应的DDRAM地址中来显示所需要的图形或是字符。v12864点阵型液晶对应的DDRAM有1024个地址,当需显示的字符或图片已转为二进制数据时,确
15、定将数据写入对应的DDRAM地址就是你所要做的工作!单片机与液晶显示器的硬件连接v液晶显示器(12864)主要包含了以下接口(图6):v1)使能E(51的RD和WR经或非门接LCD的使能E)v2)片选CS1(左半屏)、CS2(右半屏),见图3v3)命令/数据选择RS(0命令,1数据)v4)读/写选择R/W(0写,1读)v5)数据总线DB0DB7v6)负压产生和负压输入(对比度)调整v7)复位RSTv8)电源与地和背景光电源软件编程注意:程序的编写与硬件是分不开的。以图6为例,A11A8对应CS2、CS1、R/W、RS,未用的地址线为高。见图5则当向12864的左半屏(CS1=1,CS2=0)写
16、(R/W=0)数据(RS=1)时,总线地址为0 x1111010111111111。即0 xF5FF。C文件中定义如下:#defineWD1XBYTE0 xF5FF定义了总线地址后,对外部地址的操作变得非常简单。如向左半屏写数据0 xFF:WD1=0 xFF 读左半屏数据:data=RD1(data存储读取到的数据)举例v下面简单介绍程序编写的流程v1)定义所有总线地址v#defineWI1XBYTE0 xF4FF/向左半屏写命令v#defineWD1XBYTE0 xF5FF/向左半屏写数据v#defineRI1XBYTE0 xF6FF/读左半屏命令v#defineRD1XBYTE0 xF7F
17、F/读左半屏数据v#defineWI2XBYTE0 xF8FF/向右半屏写命令v#defineWD2XBYTE0 xF9FF/向右半屏写数据v#defineRI2XBYTE0 xFAFF/读右半屏命令v#defineRD2XBYTE0 xFBFF/读右半屏数据v2)编写底层程序(查忙,写数据,读数据)查忙(读BF标志即DB7总线,亦即读命令)BF=1表示模块在内部操作,此时模块不接受外部指令和数据;BF=0时模块为准备状态,随时可接受外部指令和数据;b=RI1 或者 b=RI2,观察b中最高位是否为0,否则忙。写数据aWD1=a或者WD2=a读数据到datadata=RD1或者data=RD2
18、注意:无论是写数据还是读数据一定要先查忙(对左右半屏读命令),只有在BF=0时才能对LCD进行操作3)LCD初始化包含开显示(0 x3F),起始行(0 xC0),设置起始页地址(0 xB8)和Y地址(0 x40),即分别向LCD的左右半屏写命令。可按括号内的数据进行初始化。具体可查阅12864的PDF资料。4)清屏(向DDRAM所有地址写0)显示一幅新图片前必须清屏,否则之前显示的数据仍存在于液晶上。5)指定位置显示一个ASCII码首先将起始页地址和起始Y地址设置好,写入ASCII码的上半部分(8个字节数据)重新设置起始页地址和起始Y地址,写入ASCII码的下半部分(另8个字节数据)注意:在对
19、DDRAM进行读写操作后,Y地址指针自动加1,指向下一个DDRAM单元。6)指定位置显示汉字同显示ASCII码基本相似,只是上下部分分别有16个字节数据需要写入DDRAM。7)显示一张图片对于图片,必然从第0页第0列开始,可以一页一页(不分左右屏)显示,也可以先写左半屏后写右半屏。所谓的两种方法差别正在设置的起始页地址和Y地址的不同。图3小结v12864点阵型液晶对应的DDRAM有1024个地址,无论是显示字符还是图片,灵活设置起始页地址和Y地址,可以达到想要的结果。vC语言中用到总线操作必须添加头文件“”,另如使用仿真器,需在debug中的setting里选择使用xbus(数据总线)。v可使
20、用取字模软件将字符或图片转为一系列二进制数据。写程序:写程序:附件v3)写数据datvvoidWriteData(uchardat,bitside)vvCheckBusy(side);vif(side=Left)vWD1=dat;velsevWD2=dat;v写命令cmd(side0为左,1为右)voidWriteCmd(ucharcmd,bitside)CheckBusy(side);if(side=Left)/Left=0(宏定义)WI1=cmd;elseWI2=cmd;读操作时序v1)查忙程序vvoidCheckBusy(bitside)/side0为左1为右vvunsignedchar
21、buf=0 xFF;vwhile(buf)vif(!side)vbuf=RI1;/单片机命令velsevbuf=RI2;vbuf&=0 x80;/取D7若为1则忙,忙则buf!=0(LCD回信号)vv初始化:初始化:v4)初始化程序vvoidLCD_Init()vvWriteCmd(0 x3F,Left);/显示开vWriteCmd(0 x3F,Right);vWriteCmd(0 xC0,Left);/起始行vWriteCmd(0 xC0,Right);vWriteCmd(0 xB8,Left);vWriteCmd(0 xB8,Right);/起始x,y坐标(0,0)vWriteCmd(0
22、x40,Left);vWriteCmd(0 x40,Right);v5)清屏(一般dat=0)vvoidLCD_Clear(uchardat)vvuchari,j;vfor(i=0;i8;i+)vWriteCmd(0 xB8+i,Left);vWriteCmd(0 xB8+i,Right);vWriteCmd(0 x40,Left);vWriteCmd(0 x40,Right);vfor(j=0;j64;j+)vWriteData(dat,Left);vWriteData(dat,Right);vvv总结v理解12864是如何显示字符和图形的v知晓单片机与12864的硬件连接v根据硬件接线,确
23、定所有的总线地址(8个)v明白如何通过总线操作对12864进行数据与命令的交换v参考12864的命令字进行软件编程v学会如何使用取字模软件图6AT89C51与12864的硬件连接LCD12864模块的20个引脚定义如下:1.Vss逻辑电源地逻辑电源正LCD驱动电压数据/指令选择:高电平为数据,低电平为指令读/写选择:高电平为读数据,低电平为写数据读写使能,高电平有效,下降沿锁定数据数据输入输出引脚数据输入输出引脚数据输入输出引脚数据输入输出引脚数据输入输出引脚数据输入输出引脚数据输入输出引脚数据输入输出引脚片选择号,低电平时选择前64列片选择号,低电平时选择后64列复位信号,低电平有效。输出1
24、5v电源给V0提供驱动电源背光电源LED正极背光电源LED负极图引脚图图引脚图带字库12864v带字库的带字库的12864的基本特性:的基本特性:(1)显示分辨率)显示分辨率:12864点点(就是(就是64行,每行行,每行128个点)个点)(2)内置汉字字库,提供)内置汉字字库,提供8192个个1616点阵汉字(点阵汉字(12864内部内部有一个有一个CGROM,内容掉电可以存储,所以汉字字库会存,内容掉电可以存储,所以汉字字库会存放在里面。满屏最多显示放在里面。满屏最多显示4*8=32个汉字)。个汉字)。(3)内置)内置 128个个168点阵点阵ASCII字符(字符(12864一次最多可以显
25、一次最多可以显示示4*16=64个个ASCII字符)。字符)。(4)通讯方式:串行、并口可选)通讯方式:串行、并口可选(数据写入和读出可以是以(数据写入和读出可以是以串行的方式,也可以是以并行的方式。)串行的方式,也可以是以并行的方式。)所以只要我们写入指令所以只要我们写入指令0 x01,整个屏幕就被清空了。,整个屏幕就被清空了。LCD初始化:初始化:一般用指令一般用指令0 x0c,开显示,关闭光标,开显示,关闭光标 既可以控制扩展功能,又可以控制绘图显示的指令!用既可以控制扩展功能,又可以控制绘图显示的指令!用0X30,基本指令集,基本指令集指令指令0X06光标右移光标右移1.汉字显示坐标汉
26、字显示坐标 显示汉字一屏可以显示显示汉字一屏可以显示4*8=32个个16*16的汉字。实的汉字。实物图对照下,把地址也表物图对照下,把地址也表到实物图上去了。到实物图上去了。操作的具体流程:操作的具体流程:A进入基本指令模式(指令进入基本指令模式(指令16,指令为,指令为0 x30)B写入写入xy地址(地址需要查上表,用指令地址(地址需要查上表,用指令8,也就是写入,也就是写入DDRAM)C写入欲写入的汉字的编码(一般定义一个数组,直接把汉字存放在里面即可,写入欲写入的汉字的编码(一般定义一个数组,直接把汉字存放在里面即可,存储的时候它就是以编码的形式。例如:存储的时候它就是以编码的形式。例如
27、:uchar code dis1=“南京师范大学南京师范大学;)例程代码:例程代码:uchar code dis3=“南京师范大学南京师范大学;void display_hz()Uchar I;Write_comd(0 x30);/基本指令基本指令Write_comd(0 x80);/写在第一个位置上写在第一个位置上For(i=0;i8;i+)Write_da(dis3i);/把数据送到端口把数据送到端口Delay_ms(5);/延时一会延时一会 显示坐标:显示坐标:它的坐标和汉字的坐标是一样的,只不过一个汉字的位置可以放两个它的坐标和汉字的坐标是一样的,只不过一个汉字的位置可以放两个ASCI
28、I码字符。因为前者为码字符。因为前者为16*16后者为后者为16*8,这样一行可以显示,这样一行可以显示16个个ASCII码了。在显示一串字符穿的时候,给一个起始地址,屏幕就会码了。在显示一串字符穿的时候,给一个起始地址,屏幕就会依次显示出来(自动加一功能)。依次显示出来(自动加一功能)。操作的具体流程:操作的具体流程:A进入基本指令模式(指令进入基本指令模式(指令16,指令为,指令为0 x30)B写入写入xy地址(地址需要查上表,用指令地址(地址需要查上表,用指令8,也就是写入,也就是写入DDRAM)C写入欲写入的汉字的编码(一般定义一个数组,直接把写入欲写入的汉字的编码(一般定义一个数组,
29、直接把ASACII码存放在码存放在里面即可,存储的时候它就是以编码的形式。例如:里面即可,存储的时候它就是以编码的形式。例如:uchar code dis1=SH;)例程代码:例程代码:uchar code dis2=SH;void display_ascii()Uchar I;Write_comd(0 x30);/基本指令基本指令Write_comd(0 x80);/写在第一个位置上写在第一个位置上For(i=0;i2;i+)Write_da(dis2i);/把数据送到端口把数据送到端口Delay_ms(5);/延时一会延时一会并行写资料到模块:并行写资料到模块:时序图:时序图:写指令:vo
30、idwrite_cmd(ucharcmd)lcdrs=0;/低电平表命令lcdrw=0;/低电平表写P0=cmd;/把命令送给P0lcden=0;/产生一个高脉冲delay_ms(5);lcden=1;delay_ms(5);/不用的时候把en拉低,12864不使能lcden=0;(2)写数据:voidwrite_dat(uchardat)lcdrs=1;/高电平表示数据lcdrw=0;/低电平表示写P0=dat;/把数据送到端口lcden=0;/产生一个高脉冲delay_ms(5);lcden=1;delay_ms(5);lcden=0;/不用时不使能根据这个时序图可以从根据这个时序图可以从
31、12864液晶模块内部液晶模块内部RAM中读出相应的数据,忙检测函数就是根据这个中读出相应的数据,忙检测函数就是根据这个时序图写出来的。时序图写出来的。带中文字库的带中文字库的128X64128X64显示模块时应注意以下几点:显示模块时应注意以下几点:欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。当字符编码为2字节时,应先写入高位字节,再写入低位字节。模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。