第7章单片机应用系统中的按键与显示习题解答一、填空题1.键盘抖动可以使用硬件和软件两种办法消除。2.液晶显示的优点是:液晶显示的优点是:与数码管相比,显示内容多,可显示数字、字符,甚至汉字和图形。3.键盘中断扫描方式的特点是提高了CPU的工作效率。4.数字5的共阴极七段LED显示代码是6DH,数字5的共阳极七段LED显示代码是92H。5.液晶显示模块(LCM)是指将液晶显示模块(LCM)是指将控制器、驱动器、显示器集成在一起的器件。二、简答题1.何谓LED静态显示?何谓LED动态显示?两种显示方式各有何优缺点?答:LED静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止,公共端恒定接地(共阴极)或接正电源(共阳极)。LED动态显示是一位一位地轮流点亮各位数码管的显示方式,每位数码管点亮的时间大约在lms左右。但由于LED具有余辉特性以及人眼也有视觉暂留特性,使人看起来就好像在同时显示不同的字符一样。静态显示的优点是,显示控制程序简单,显示亮度大,节约单片机工作时间。静态显示的缺点是,在显示位数较多时,静态显示占用的I/O口线较多,或者需要增加额外的硬件电路,硬件成本较高。动态显示的优点是,可以大大简化硬件线路。动态显示的缺点是,要循环执行显示程序,对各个数码管进行动态扫描,消耗单片机较多的运行时间;在显示器位数较多或刷新间隔较大时,会有一定的闪烁现象,显示亮度较暗。2.简述用RS触发器消除按键抖动的基本原理。答:RS触发器消除按键抖动的常用电路如图7-3所示。图中用两个与非门构成一个RS触发器。当按键未被按下而处于A处时,触发器输出为“1”。当按键按下处于B处时,输出为“0”。此时即使由于按键的机械弹性,因抖动产生瞬间断开,只要按键不返回原始状态A,双稳态电路的状态就不改变,输出保持为“0”,不会产生抖动。3.设有一个单片机应用系统用三个LED数码管显示运行结果,电路如图7-22所示。显示数据的显示代码已分别存储在内部RAM32H~30H中(百位在32H)。编写程序,实现静态显示。图7-22简答题3的图答:汇编语言参考答案:(此图中,请将74164的Q0~Q7接数码管的Dp~a,或对显示内容从高到低逐位转换)ORG0000H;在0000H单元存放转移指令SJMPMAIN;转移到主程序ORG0030H;程序从0030H开始MAIN:MOV32H,#5;百位MOV31H,#4;十位MOV30H,#3;个位MOVSCON,#00H;初始化串行口方式0START:MOVDPTR,#TAB;字形表的入口地址MOVR0,#30H;显示数的初始地址LOOP:MOVA,@R0;取待显示数据MOVCA,@A+DPTR;查表获取字型码MOVSBUF,A;送串口显示JNBTI,$;等待发送完毕CLRTI;清发送标志INCR0;地址加一,准备取下一个待显示数CJNER0,#33H,LOOP;判断3个数据是否显示完SJMP$;显示结束TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;段码表;0123456789对应内容END;程序结束C语言参考答案:#includereg51.h//预处理命令,定义SFR的头文件charcodeTAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表unsignedcodedis_code[3]={0x5,0x4,0x3};//待显示数据main(){inti,dis;//定义变量i,disSCON=0x00;//初始化串行口方式0for(i=2;i=0;i--)//3位显示循环{dis=dis_code[i];//取待显示位数SBUF=TAB[dis];//取待显示数的字型码while(TI==0);//等待发送完毕TI=0;//清发送标志}while(1);//显示结束}Proteus仿真图如下所示:4.设有一个LED数码管动态显示电路如图7-23所示。已知显示代码存储在内部RAM30H开始的8个单元中,编写程序,动态显示给定的信息。图7-23简答题4的图答:汇编语言参考答案:(用Proteus仿真画图的时候,P0口需接上拉电阻)ORG0000H;在0000H单元存放转移指令SJMPMAIN;转移到主程序ORG0030H;程序从0030H开始MAIN:MOV30H,#00H;给内部RAM30H开始的8个单元内容赋值MOV31H,#01HMOV32H,#02HMOV33H,#03HMOV34H,#04HMOV35H,#05HMOV36H,#06HMOV37H,#07HMOVDPTR,#TAB;共阴字形表的入口地址LOOP:MOVR0,#30H;待显示数的首地址MOVR1,#00H;控制位选信号LOOP1:MOVP1,R1;送位选信号MOVA,@R0;取待显示数MOVCA,@A+DPTR;取待显示数据的字型码CLRP2.7;选通74LS377允许控制端MOVP0,A;送字形LCALLDELAY;调用延时INCR1;选通下一位INCR0;地址加一,准备取下一个待显示数CJNER0,#38H,LOOP1;判断8个数据是偶显示完SJMPLOOP;重新开始显示DELAY:MOVR5,#10;延时程序,给R5赋值DEL0:MOVR6,#1;给R6赋值DEL1:MOVR7,#20;给R7赋值DEL2:DJNZR7,DEL2;R7减1不等于0继续执行该行DJNZR6,DEL1;R6减1不等于0跳到DEL1处DJNZR5,DEL0;R5减1不等于0跳到DEL0处RET;子程序返回TAB:DB3FH,06H,05BH,04FH,66H,6DH,7DH,07H;段码表;01234567对应内容DB7FH,6FH,77H,7CH,39H,5EH,79H,71H;89ABCDEFENDC语言参考答案:#includereg51.h//预处理命令,定义SFR的头文件sbitP2_7=P2^7;charcodeTAB[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//段码表unsignedcodedis_code[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};//待显示数据voiddelay1ms(void)//延时1ms函数{unsignedchartemp=249;//声明变量temp,并赋值249while(--temp);//temp是否减到0,否则继续执行该行temp=249;//给变量temp赋值while(--temp);//temp是否减到0,否则继续执行该行}voidmain(void)//主函数{inti,dis;//定义变量i的数据类型do{//dowhile组成循环unsignedchardsSe1=0x00;//定义变量dsSe1,并赋值0for(i=0;i8;i++)//8位显示循环{P1=dsSe1;//送字位dis=dis_code[i];//取待显示数P2_7=0;//选通74LS377允许控制端P0=TAB[dis];//取待显示数的字形delay1ms();//延时1msdsSe1++;//字位加1,选送下一位}}while(1);}Proteus仿真图如下所示:5.有一个单片机显示电路如图7-24所示。图中4511是BCD码锁存/七段LED译码器/驱动器,当其输入为BCD码时,输出为七段LED数码管显示代码。设要显示的BCD码数据存储在内部RAM30H~32H中。编写程序,实现指定数据的静态显示。图7-24简答题5的图答:汇编语言参考答案:ORG0000H;在0000H单元存放转移指令SJMPMAIN;转移到主程序ORG0030H;程序从0030H开始MAIN:MOV32H,#5;百位MOV31H,#4;十位MOV30H,#3;个位LOOP:MOVA,30H;取个位ORLA,#0E0H;清P1.4位,选通个位显示MOVP1,A;送个位显示MOVA,31H;取十位ORLA,#0D0H;清P1.5位,选通十位显示MOVP1,A;送十位显示MOVA,32H;取百位ORLA,#0B0H;清P1.6位,选通白位显示MOVP1,A;送百位显示SJMP$;等待END;程序结束C语言参考答案:#includereg51.h//预处理命令,定义SFR的头文件unsignedcodedis_code[3]={0x5,0x4,0x3};//待显示数据voidmain(void)//主函数{P1=dis_code[2]|0xe0;//显示个位P1=dis_code[1]|0xd0;//显示十位P1=dis_code[0]|0xb0;//显示百位while(1);}Proteus仿真图如下所示:三、Proteus仿真1.在Proteus下,仿真实现7.7节内容。答:全自动洗衣机洗衣流程Proteus仿真设洗衣机洗衣流程有三道程序:进水、洗涤、甩干。按下“启动”键,开始洗衣流程。首先进水,“进水”指示灯亮,用LED发光二极管指示;定时10秒,用2位LED数码管显示。然后洗涤,“洗涤”指示灯亮,定时10秒。最后甩干,“甩干”指示灯亮,定时10秒。洗衣流程结束后,扬声器发声提示。电路如图7-20所示。图7-20洗衣流程控制原理汇编语言参考程序如下:ORG0000H;在0000H单元存放转移指令LJMPMAIN;转移到主程序ORG000BH;定时/计数器T0的中断入口地址LJMPTime0;转到定时/计数器T0的中断服务程序Time0ORG0100H;主程序从0100H开始MAIN:JBP1.7,MAIN;判按键是否按下,为0即按下,顺序执行,否则等待。LCALLDISPLAY;有键按下,延时去抖动JBP1.7,MAIN;再判有键按下MOVP1,#0EH;确定键按下,A灯亮,开始放水定时MOVR0,#00H;R0放3个阶段的工作标志MOVR1,#00H;R1放定时器的中断计数SETBEA;开中断总开关SETBET0;开定时/计数器T0MOVTMOD,#01H;设定时/计数器T0工作方式1MOVTH0,#3CH;定时50ms高8位初值MOVTL0,#0B0H;定时50ms低8位初值SETBTR0;启动定时/计数器T0SJMP$;等待定时;定时/计数器T0中断服务程序Time0:CJNER0,#00H,L1;R0的内容为标志,若R0=0,执行第1阶段定时(放水功能)INCR1;R1内容加1MOVA,R1;R1的内容送到AMOVB,#20;B寄存器送立即数20DIVAB;计算时间秒MOVB,#10;B寄存器送立即数10DIVAB;秒分成个位和十位MOVDPTR,#DTAB;字形表头地址送DPTRMOVCA,@A+DPTR;秒十位查字形码MOVP0,A;十位字形送P0口显示MOVA,B;秒个位送A寄存器MOVCA,@A+DPTR;秒个位查字形码MOVP2,A;个位字形送P2口显示CJNER1,#200,L4;若累计满200次,即计时满10sMOVP1,#0DH;A灯灭,结束放水,B灯亮,开始洗涤MOVR1,#00H;R1内容清0,重新从0开始计数INCR0;R0内容加1,准备第2阶段的定时SJMPL4;转L4,送初值,中断返回L1:CJNER0,#01H,L2;若R0=1,执行第2阶段定时(洗涤功能)INCR1;R1内容加1MOVA,R1;R1的内容送到AMOVB,#20;B寄存器送立即数20DIVAB;计算时间秒MOVB,#10;B寄存器送立即数10DIVAB;秒分成个位和十位MOVDPTR,#DTAB;字形表头地址送DPTRMOVCA,@A+DPTR;秒十位查字形码MOVP0,A;十位字形送P0口显示MOVA,B;秒个位送A寄存器MOVCA,@A+DPTR;秒个位查字形码MOVP2,A;个位字形送P2口显示CJNER1