您好,欢迎访问三七文档
讲座四1.多位LED显示2.键盘管理模块3.点阵、字符液晶显示器4.字模提取软件LED的工作原理(a)典型的七段式LED器件(b)共阳极LED(c)共阴极LED四位数七段LED数码管模块(左为正面图、右为背面图)LED数码管和单片机的连接1单片机P2.0P2.7abcdefgdp+5v+5vabcdefgdpP0.0P0.7编程:(以共阳极为例)MOVP2,#11111001B(0F9H)MOVP0,#10100100B(0A4H)SJMP$静态连接静态显示LED数码管和单片机的连接2单片机P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3想一想:和静态连接的区别在哪里?单片机P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3电路的接法决定了必须采用逐位扫描显示方式。即从段选口送出某位LED的字型码,然后选通该位LED,并保持一段延时时间。然后选通下一位,直到所有位扫描完。怎样实现显示呢?静态、动态显示方式总结静态显示连接所有LED的位选均共同连接到+VCC或GND,每个LED的8根段选线分别连接一个8位并行I/O口。原理简单;显示无闪烁;占用I/O资源较多。动态显示连接所有LED的段选线共同连接在一起共用一个8位I/O口而每个LED的位选分别由一根相应的I/O口线控制。因此必须采用动态扫描显示方式。例:74ls164+led(proteus)独立键盘Vcck0k1k2k3k4k5k6k710KP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7独立键盘原理图case0x01:key1();//键盘1功能函数。break;case0x02:key2();//键盘2功能函数。break;case0x04:key3();//键盘3功能函数。break;case0x08:key4();//键盘4功能函数。break;case0x10:key5();//键盘5功能函数。break;case0x20:key6();//键盘6功能函数。break;case0x40:key7();//键盘7功能函数。break;case0x80:key8();//键盘8功能函数。break;default:break;}}}}说明:采用轮询方式查询P1口,采用延时法消除键盘抖动----------------*/#includereg51.h/********************************函数名称:delay()功能:用于键盘消抖的延时函数说明:无入口参数:无返回值:无********************************/voiddelay(){unsignedchari;for(i=400;i0;i--);}//主函数main()voidmain(void){unsignedcharkey;while(1){P1=0xff;//要想从P1口读数据必须先给P1口写1key=P1;//读入P1口的数据,赋值给变量keyif(key!=0x00)//判断是否有键按下,当没有键按下时,P1口的数据为0x00{delay();//延时去抖key=P1;//再次读入P1口的数据,赋值给变量keyif(key!=0x00)//再次判断是否有键按下switch(key){矩阵式键盘控制4x4键盘的内部结构正面背面X0X1X2X3Y3Y2Y1Y0Y0Y1Y2Y3X3X2X1X0市售一体成型的4x4键盘低电平扫描-按下“0”键X3X2X1X0Y3Y2Y1Y0动作按键11101110Key01101Key11011Key20111Key311011110Key41101Key51011Key60111Key710111110Key81101Key91011KeyA0111KeyB01111110KeyC1101KeyD1011KeyE0111KeyFxxxx1111无按键按下低电平动作键盘动作分析表高电平扫描-按下“0”键X3X2X1X0Y3Y2Y1Y0动作按键00010001Key00010Key10100Key21000Key300100001Key40010Key50100Key61000Key701000001Key80010Key90100KeyA1000KeyB10000001KeyC0010KeyD0100KeyE1000KeyFxxxx0000无按键按下高电平动作键盘动作分析表4×4键盘扫描电路基本原理:分行扫描检查是否有键按下若有,确定哪个键被按下1.行扫描法的原理判断哪一个键被按下的流程P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(0);break;case(0xd0):display(1);break;case(0xb0):display(2);break;case(0x70):display(3);break;}}}P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(4);break;case(0xd0):display(5);break;case(0xb0):display(6);break;case(0x70):display(7);break;}}}P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(8);break;case(0xd0):display(9);break;case(0xb0):display(10);break;case(0x70):display(11);break;}}}P1=0xf7;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xf7;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(12);break;case(0xd0):display(13);break;case(0xb0):display(14);break;case(0x70):display(15);break;}}}}voiddisplay(unsignedchari){unsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};P2=0xfe;P0=table[i];}2.行反转法的原理行线、列线分别接并行口行线输出,列线输入列线输出读得的值,行线输入行反转法的流程ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法{ucharcord_h,cord_l;//行列值P3=0x0f;//行线输出全为0cord_h=P3&0x0f;//读入列线值if(cord_h!=0x0f)//先检测有无按键按下{delay(100);//去抖if(cord_h!=0x0f){cord_h=P3&0x0f;//读入列线值P3=cord_h|0xf0;//输出当前列线值cord_l=P3&0xf0;//读入行线值return(cord_h+cord_l);//键盘最后组合码值}此处仿真测控系统中必不可少的组成——人机界面微型计算机89C51人机界面(键盘、LCD)执行模块数据采集及处理模块通信模块图1测控系统的组成部分液晶显示器的原理字符型液晶(1602)方法:通过向指定显示位置对应的DDRAM中写数据来显示字符。例如:在第2行第2列显示字符‘a’,查表1可知a对应的代码为01100001即0x31,则可向地址0x41中写入数据0x31即可显示。图21602的显示地址与DDRAM地址点阵型液晶(12864)在点阵型LCD上显示一幅图片或是字符,如上图所示,只需黑色的部分点亮,空白的点置0即可。可以将LCD看成128*64个LED灯来帮助理解。正面图背面图12864分类128×64点阵液晶显示屏有三种控制器,分别是KS0107(KS0108)、T6963C和ST7920,三种控制器主要区别是:KS0107(KS0108)不带任何字库、T6963C带ASCII码,ST7920带国标二级字库(8千多个汉字)。图312864的DDRAM地址XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y(列)地址指针。X地址计数器没有记数功能,只能用指令设置。Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。从上图可以看出数据按字节在屏幕上是竖向排列的。上方为低位,下方为高位。因此在横向上(也就是Y)就一共是128列数据。分为CS1和CS2两个64列来写入。在竖方向上(也就是X)一字节数据显示8个点,竖向64个点分为8个字节,称做8页(X=0-7)。了解这些后我们就知道要满屏显示一张图就要从y=0…127、X=0…7一共写128×8=1024个字节的数据。同样在AT89S51中存一张图就要1024个字节的空间。图片在12864上的显示简单来说,主要分为两步:1)将一幅图片转化为一系列二进制数据2)将数据按字节(8位)写入液晶对应的DDRAM由图3可知,12864的DDRAM有128*8=1024个地址,只需将图片转化的数据按字节写入这其对应的DDRAM地址即可。字符在12864上的显示上图中,汉字为16*16点阵,ASCII码为8*16点阵,同图片一样,一个汉字(ASCII)由16*2(8*2)个字节数据组成,字符显示原理与图片一致,只需将字符代码写入相应DDRAM地址。字体大小可以根据需要改变。小结简而言之,无论是字符型还是点阵型LCD,其基本原理都是通过将数据写入所对应的DDRAM地址中来显示所需要的图形或是字符。12864点阵型液晶对应的DDRAM有1024个地址,当需显示的字符或图片已转为二进制数据时,确定将数据写入对应的DDRAM地址就是你所要做的工作!单片机与液晶显示器的硬件连接液晶显示器(12864)主要包含了以下接口(图6):1)使能E(51的RD和WR经或非门接LCD的使能E)2)片选CS1(左半屏)、CS2(右半屏),见图33)命令/数据选择RS(0——命令,1——数据)4)读/写选择R/W(0——写,1——读)5)数据总线DB0~DB76)负压产生和负压输入(对比度)调整7)复位RST8)电源与地和背景光电源软件编程注意:程序的编写与硬件是分不开的。以图6为例,A11~A8对应CS2、CS1、R/W、RS,未用的地址线为高。见图5则当向12864的左半屏(CS1=1,CS2=0)写(R/W=0)数据(RS=1)时,总线地址为0x1111010111111111。即0xF5FF。C文件中定义如下:#defineWD1XBYTE[0xF5FF]定义了总线地址后,对外部地址的操作变得非常简单。如向左半屏写数据0xFF:WD1=0xFF读左半屏数据:data=RD1(data存储读取到的数据)举例下面简单介绍程序编写的流程1)定义所有总线地址#defineWI1XBYTE[0xF4FF]//向左半屏写命令#defineWD1XBYTE[0xF5FF]//向左半屏写数据#defineRI1XBYTE[0xF6FF]//读左半屏命令#defineRD1XBYTE[0xF7FF]//读左半屏数据#defineWI2XBYTE[0xF8FF]//向右半屏写命令#defineWD2XBYTE[0xF9FF]//向右半屏写数据#d
本文标题:单片机与液晶显示器
链接地址:https://www.777doc.com/doc-6437856 .html