第九章51单片机与显示器、键盘接口及编程9.151单片机与LED显示器接口9.1.1LED显示器的结构与原理在单片机应用系统中通常使用的是8段式LED数码管显示器,它有共阴极和共阳极两种,如图所示。abcdefgdpcomabcdefgdpcomabcdefgdp10987612345gfcomabedcomcdp(a)(b)(c)其中:(a)为共阴极结构。(b)为共阳极结构。(c)图为管脚图,从a~g管脚输入不同的8位二进制编码,可显示不同的数字或字符。共阴极和共阳极的字段码互为反码。显示字符共阴极字段码共阳极字段码显示字符共阴极字段码共阳极字段码03FHC0HC39HC6H106HF9HD5EHA1H25BHA4HE79H86H34FHB0HF71H8EH466H99HP73H8CH56DH92HU3EHC1H67DH82HT31HCEH707HF8HY6EH91H87FH80HL38HC7H96FH90H8.FFH00HA77H88H“灭”00FFHB7CH83H………………9.1.2LED数码管显示器的译码方式一.硬件译码方式译码方式是指由显示字符转换得到对应的字段码的方式硬件译码方式是指利用专门的硬件电路来实现显示字符到字段码的转换,这样的硬件电路有很多,比如MOTOTOLA公司生产的MC14495芯片就是其中的一种,MC14495是共阴极一位十六进制数——字段码转换芯片,能够输出用四位二进制表示形式的一位十六进制数的七位字段码,不带小数点。它的内部结构如图。4锁存器地址译码和字段码ROM阵列ABCDLE569107VssVDD816abcdefgh+iVCR11121314151234二.软件译码方式软件译码方式就是通过编写软件译码程序,通过译码程序来得到要显示的字符的字段码。9.1.3LED数码管的显示方式一.LED静态显示LED静态显示时,其公共端直接接地(共阴极)或接电源(共阳极),各段选线分别与I/O口线相连。要显示字符,直接在I/O线送相应的字段码。abcdefgdpI/O(1)abcdefgdpI/O(2)二.LED动态显示方式LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O口线控制。D3D2D1D0I/O(1)I/O(2)设数码管为共阳极,它的工作过程为:第一步使右边第一个数码管的公共端D0为1,其余的数码管的公共端为0,同时在I/O(1)上送右边第一个数码管的字段码,这时,只有右边第一个数码管显示,其余不显示;第二步使右边第二个数码管的公共端D1为1,其余的数码管的公共端为0,同时在I/O(1)上送右边第二个数码管的字段码,这时,只有右边第二个数码管显示,其余不显示,依此类推,直到最后一个,这样四个数码管轮流显示相应的信息,一个循环完后,下一循环又这样轮流显示,从计算机的角度看是一个一个的显示,但由于人的视觉滞留,只要循环的周期足够快,看起来所有的数码管都是一起显示的了。这就是动态显示的原理。而这个循环周期对于计算机来说很容易实现。所以在单片机中经常用到动态显示。9.1.4LED显示器与单片机的接口LED显示器从译码方式上有硬件译码方式和软件译码方式。从显示方式上有静态显示方式和动态显示方式。在使用时可以把它们组合起来。在实际应用时,如果数码管个数较少,通常用硬件译码静态显示,在数码管个数较多时,则通常用软件译码动态显示。一.硬件译码静态显示下图是一个两位数码管硬件译码静态显示的接口电路图。abcdefgMC14495abcdefgabcdefgABCDLEMC14495abcdefgABCDLEP1.0P1.1P1.2P1.3P1.4P1.58051二.软件译码动态显示下图是一个8位软件译码动态显示的接口电路图。图中用8255A扩展并行I/O口接数码管,数码管采用动态显示方式,8位数码管的段选线并联与8255A的A口通过74LS373相连,8位数码管的公共端通过74LS373分别与8255A的B口相连。也即8255A的B口输出位选码选择要显示的数码管,8255A的A口输出字段码使数码管显示相应的字符,8255A的A口和B口都工作于方式0输出。A口、B口、C口和控制口的地址分别为7F00H、7F01H、7F02H和7F03H。D0D1D2D7Q0Q1Q2Q3Q4Q5Q6Q7D0D1D2D3D4D5D6D7VCC74LS373Q0Q1Q2Q3Q4Q5Q6Q7D0D1D2D3D4D5D6D7VCC74LS373PA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7CSWRRD74373P2.7WRRDALEP0.0~P0.78051D0~D7A1A0GA1A08255GGOEOE软件译码动态显示汇编语言程序为:(设8个数码管的显示缓冲区为片内RAM的57H~50H单元)DISPLAY:MOVA,#10000000B;8255初始化MOVDPTR,#7F03H;使DPTR指向8155控制寄存器端口MOVX@DPTR,AMOVR0,#57H;动态显示初始化,使R0指向缓冲区首址MOVR3,#7FH;首位位选字送R3MOVA,R3LD0:MOVDPTR,#7F00H;使DPTR指向PA口MOVX@DPTR,A;选通显示器低位(最右端一位)INCDPTR;使DPTR指向PB口MOVA,@R0;读要显示数ADDA,#0DH;调整距段选码表首的偏移量MOVCA,@A+PC;查表取得段选码MOVX@DPTR,A;段选码从PB口输出ACALLDL1;调用1ms延时子程序DECR0;指向缓冲区下一单元MOVA,R3;位选码送累加器AJNBACC.0,LD1;判断8位是否显示完毕,显示完返回RRA;未显示完,把位选字变为下一位选字MOVR3,A;修改后的位选字送R3AJMPLD0;循环实现按位序依次显示LD1:RETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;字段码表DB:7FH,6FH,77H,7CH,39H,5EH,79H,71HDL1:MOVR7,#02H;延时子程序DL:MOVR6,#0FFHDL0:DJNZR6,DL0DJNZR7,DLRET软件译码动态显示C语言程序为:#includereg51.h#includeabsacc.h//定义绝对地址访问#defineucharunsignedchar#defineuintunsignedintvoiddelay(uint);//声明延时函数voiddisplay(void);//声明显示函数uchardisbuffer[8]={0,1,2,3,4,5,6,7};//定义显示缓冲区voidmain(){XBYTE[0x7f03]=0x80;//8255初始化while(1){display();//设显示函数}}//************延时函数************voiddelay(uinti)//延时函数{uintj;for(j=0;ji;j++){}}//***********显示函数************voiddisplay(void)//定义显示函数{ucharcodevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字段码表ucharchocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选码表uchari,p,temp;for(i=0;i8;i++){p=disbuffer[i];//取当前显示的字符temp=codevalue[p];//查得显示字符的字段码XBYTE[0x7f00]=temp;//送出字段码temp=chocode[i];//取当前的位选码XBYTE[0x7f01]=temp;//送出位选码delay(20);//延时1ms}}9.251单片机与键盘接口9.2.1键盘的工作原理键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。它的结构和产生的波形如图所示。P1.1VCCGND断开闭合断开P1.1(a)(b)图9.1键盘的处理主要涉及三个方面:1.按键的识别2.抖动的消除消除按键盘抖动通常有两种方法:硬件消抖和软件消抖。硬件消抖是通过在按键输出电路上加一定的硬件线路来消除抖动,一般采用R—S触发器或单稳态电路。如图。断开闭合+5V+5V输出软件消抖是利用延时来跳过抖动过程图9.23.键位的编码通常有两种方法编码。(1)用连接键盘的I/O线的二进制组合进行编码。如(a)图(2)顺序排列编码。如(b)图,处理方法如下:编码值=行首编码值X+列号Y。P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.788848281484442412824222118141211P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7FEDCBA9876543210(a)(b)图9.39.2.2独立式键盘与单片机的接口键盘的结构形式一般有两种:独立式键盘与矩阵式键盘。独立式键盘就是各按键相互独立,每个按键各接一根I/O口线,每根I/O口线上的按键都不会影响其它的I/O口线。GNDVCCGNDVCC或(b)8051(a)INT08051P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7图9.4图9.4(a)为中断方式工作的独立式键盘的结构形式,(b)为查询方式工作的独立式键盘的结构形式下面是针对图9.2(b)图查询方式的汇编语言形式的键盘程序。总共有8个键位,KEY0~KEY7为8个键的功能程序。START:MOVA,#0FFH;MOVP1,A;置P1口为输入状态MOVA,P1;键状态输入CPLAJZSTART;没有键按下,则转开始JBACC.0,K0;检测0号键是否按下,按下转JBACC.1,K1;检测1号键是否按下,按下转JBACC.2,K2;检测2号键是否按下,按下转JBACC.3,K3;检测3号键是否按下,按下转JBACC.4,K4;检测4号键是否按下,按下转JBACC.5,K5;检测5号键是否按下,按下转JBACC.6,K6;检测6号键是否按下,按下转JBACC.7,K7;检测7号键是否按下,按下转JMPSTART;无键按下返回,再顺次检测K0:AJMPKEY0K1:AJMPKEY1……K7:AJIMPKEY7KEY0:……;0号键功能程序JMPSTART;0号键功能程序执行完返回KEY1:……;0号键功能程序JMPSTART;1号键功能程序执行完返回……KEY7:……;7号键功能程序JMPSTART;7号键功能程序执行完返回9.2.3矩阵键盘与单片机的接口矩阵式键盘又叫行列式键盘。用I/O口线组成行、列结构,键位设置在行列的交点上。例如4×4的行、列结构可组成16个键的键盘,比一个键位用一根I/O口线的独立式键盘少了一半的I/O口线。矩阵键盘的连接方法有多种,可直接连接于单片机的I/O口线;可利用扩展的并行I/O口连接;也可利用可编程的键盘、显示接口芯片(如8279)进行连接等等。其中,利用扩展的并行I/O口连接方便灵活,在单片机应用系统中比较常用。下图就是通过8255芯片扩展的并行I/O口连接48的矩阵键盘。PA7PA6PA5PA4PA3PA2PA1PA0PC0PC1PC2PC30123456789101112131415316171819202122232425262728293031CS74LS373WRRDA1A0P2.7WRRDALEP0.0~P0.7D0~D7RESET1K20F+5V+5V82555.1K48051图9.5一.矩阵键盘的工作过程对矩阵键盘的工作过程可分两步:第一步是CPU首先检测键盘