1、第7章 思考题和习题解答7.1 试说明LED显示器的工作原理,什么是共阴极?什么是共阳极?答:当发光二极管导通时,相应的一个点或一个线段发光。控制不同组合的发光二极管导通,就能显示出各种不同的字形。共阴极LED显示器的8个发光二极管的阴极连接在一起,一般公共端阴极接地,其他管脚接驱动电路输出端,当某二极管的阳极为高电平时,则该发光二极管点亮;共阳极LED显示器的8个发光二极管的阳极连接在一起,一般公共阳极接高电平,其他管脚接驱动电路输出端。当某二极管的阴极为低电平时,则该发光二极管点亮。7.2 键盘有哪几种类型?为什么要进行“去抖”处理?答:键盘可以分为独立连接式和行列(矩阵)式两类,每一类又
2、可根据对键盘的译码方法分为编码键盘和非编码键盘两种类型。机械式按键在按下或释放时,由于触点弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。抖动时间的长短与开关的机械特性有关,一般为510ms。CPU在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作。为了克服按键触点机械抖动所致的检测误判,必须采取软件或硬件去抖动措施。7.3 键盘的“去抖”处理方法有哪几种?答:硬件去抖和软件去抖两种方法。7.4 说明静态显示和动态显示的特点?答:静态显示是指LED显示器显示某一字符时,相应的发光二极管恒定导通或恒定截止。这种显示方式要求各位
3、显示块的公共端恒定接地(共阴极)或接正电源(共阳极)。每个显示块的8个段选线分别与一个8位并行I/O口的8位口线相接,I/O口只要有段码输出,相应字符就被显示出来,并保持不变。直到I/O口输出新的段码。动态显示是一位一位地轮流点亮各位显示器,这种逐位点亮显示器的方式称为位扫描。这种显示方式要求各位显示器的段选线应并联在一起,由一个8位的IO口控制;各位的位选线(公共阴极或阳极)由另外的口线控制。该方式显示时,各位显示器轮流选通,要使其稳定显示必须采用扫描方式,即在某一时刻只选通一位显示器,并送出相应的段码,进行适当延时(延时时间约为15ms),接着选通另一位显示器,并送出相应的段码,如此循环往
4、复,即可使各位显示器显示相应的字符。只要循环时间足够短,利用人眼的视觉暂留效应,就可以给人同时显示的感觉。7.5 非编码键盘可分为哪几种键盘?各有什么特点?答:非编码键盘可分为独立式键盘和行列式键盘。独立式键盘是每个按键独立地占用一根数据输入线。当某一按键按下时,相应的I/O线变为低电平。独立式键盘的特点是电路结构简单,但每个按键必须占用一根I/O线,当按键数较多时,占用的I/O口线就多,故其通常应用于按键数量较少的场合。行列式键盘又称矩阵式键盘,它是将I/O线的一部分作为行线,另一部分作为列线,按键设置在行线和列线的交叉处。每当某个按键被按下时,与这个按键相连的行线和列线就会接通,否则是断开
5、状态。因此,一个MN的行列式非编码键盘只需M条行线和N条列线,共占用MN条单片机的I/O端口线。7.6 试说明非编码键盘的工作原理,如何去键抖动?如何判断键是否释放?答:在非编码键盘中,每个按键的作用只是使相应接点接通或断开,每个按键的键码并非由硬件电路产生,而是通过软件来识别键码。CPU在按键抖动期间扫描键盘必然会得到错误的行首键号和列值,最好的办法是使CPU在检测到有按键按下时延时一段时间后再进行列扫描。当CPU检测到按键释放时,执行一个10ms左右的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持断开状态电平,则可判断该按键已释放。7.7 独立式键盘和矩阵式键盘各有什么特点?各
6、自在什么场合下使用?答:独立式键盘是每个按键独立地占用一根数据输入线,其特点是电路结构简单,但每个按键必须占用一根I/O线,当按键数较多时,占用的I/O口线就多,故其通常应用于按键数量较少的场合。行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键盘中,每根行线和列线的交叉处都接有一个按键,每当某个按键被按下时,与这个按键相连的行线和列线就会接通,否则是断开状态。因此,一个MN的行列式非编码键盘只需M条行线和N条列线,共占用MN条单片机的I/O端口线。7.8 根据LED的结构原理,请任举一段码分析共阴极接法时的段码组成。答:共阴极LED显示器的8个发光二极管的阴极连接在一起,一般公共
7、端阴极接地,其它管脚接驱动电路输出端,当某二极管的阳极为高电平时,则该发光二极管点亮。如要显示字形“3”,则相应的发光二极管a、b、c、d、g点亮,e和f熄灭,所以从发光二极管SP、g、f、e、d、c、b、a阳极上所加控制电平为0、1、0、0、1、1、1、1,所以字形“3”的段码为4FH。7.9 根据LED的结构原理,请任举一段码分析共阳极接法时的段码组成。答:共阳极LED显示器的8个发光二极管的阳极连接在一起,一般公共阳极接高电平,其它管脚接驱动电路输出端。当某二极管的阴极为低电平时,则该发光二极管点亮。如同样要显示字形“3”,与共阴极一样,相应的发光二级管点亮或熄灭,但控制电平加在阴极上,
8、所以从发光二极管SP、g、f、e、d、c、b、a阳极上所加控制电平为1、0、1、1、0、0、0、0,所以字形“3”的段码为B0H。7.10 请用AT89C51单片机的P1口设计一个4位独立式键盘电路,并编写相应的键盘程序。答:ORG0030HKEYSCAN:MOVP1, #0FFH;置P1口为输入态MOVA, P1;读入键值LCALLDELAY10ms;延时10ms(DELAY10ms略),去抖动MOVB, P1;再读键值CJNEA, B, GORET;两次键值不一致,直接返回JNBACC.0, KEY0;0号键按下,转0号键功能程序JNBACC.1, KEY1;1号键按下,转1号键功能程序J
9、NBACC.2, KEY2;2号键按下,转2号键功能程序JNBACC.3, KEY3;3号键按下,转3号键功能程序GORET:RET;从键盘服务子程序返回KEY0:LCALLFUNC0;执行0号键功能服务程序RET;从键盘服务子程序返回KEY1:LCALLFUNC1;执行1号键功能服务程序RET;从键盘服务子程序返回KEY2:LCALLFUNC2;执行2号键功能服务程序RET;从键盘服务子程序返回KEY3:LCALLFUNC3;执行3号键功能服务程序RET;从键盘服务子程序返回7.11 请用AT89C51单片机的P1口设计一个33的键盘电路,并编写相应的键盘程序。答:ORG 0030HKEYS
10、CAN:ACALLKSCAN;查有没有键按下JZGORET;A=0表示没有键按下,返回LCALLDELAY10ms;有键按下,延时10ms(DELAY10ms略)。ACALLKSCAN;再查有没有键按下JZGORET;A=0表示没有键按下,返回ACALLKEYSUM;有键按下,扫描确定键值RL ARL A;键值4;主要考虑FTAB 以下指令LCALL(3字节)和RET(1字节)的总字节数为4MOVDPTR, #FTABJMPA+DPTR;散转,执行所按键相应功能子程序GORET:RETFTAB:LCALLFUNC0;调用0号键功能子程序RETLCALLFUNC1;调用1键功能子程序RETLCA
11、LLFUNC8;调用8键功能子程序RETLCALLERRSUB;键值为9,异常处理RET;KSCAN为判断有无键按下子程序,表示有键按下KSCAN:MOVP1, #0F8H;行线置低电平,列线置输入态MOVA, P1;读列线数据CPLA;A取反ANLA, #0F8H;屏蔽行线RET;返回,表示有键按下;KEYSUM为求键值子程序,键值在A中KEYSUM:MOVR6, #00H;R6存放每行最左键的键值,初始清零MOVR7, #0FEH;准备扫描第0行LOOP:MOVP1,R7;逐行输出0扫描MOVA, P1;读列线数据JBACC.3, L1;第0列无键按下,转查第1列MOVA, #0;第0列有
12、键按下,SJMPKSOLVE;转求键值L1:JBACC.4, L2;第1列无键按下,转查第2列MOVA, #1;第1列有键按下,SJMPKSOLVE;转求键值L2:JBACC.5, NEXT;4列均无键按下,本行扫描结束MOVA, #2;第3列有键按下,SJMPKSOLVE;转求键值NEXT:MOVA, R7;准备扫描下一行JNBACC.2,ERR;扫描完未读到键值,异常处理RLA;R7循环左移一位MOVR7,A;得到下一行行扫描字ADDR6, #3;得到下一行首键键值SJMPLOOP;转LOOP,扫描下一行ERR:MOVA, #9;键值赋9,表示出错!RETKSOLVE:ADDA,R6;得键
13、值PUSHACC;键值进栈暂存WAIT:ACALLKSCAN;查按键释放否?防止重复执行键功能JNZWAIT;没有释放,等待POPACC;键值出栈RET7.12 请用AT89C51单片机的P1口设计一个44的键盘电路,并编写相应的键盘程序。答:KEYSCAN:ACALLKSCAN;查有没有键按下JZGORET;A=0表示没有键按下,返回LCALLDELAY10ms;有键按下,延时10ms,防抖动。;(延时10ms的子程序DELAY10ms略)ACALLKSCAN;再查有没有键按下JZGORET;A=0表示没有键按下,返回ACALLKEYSUM;有键按下,扫描确定键值RL ARL A;键值4;主
14、要考虑FTAB 以下指令LCALL(3字节)和RET(1字节)的总字节数为4MOVDPTR, #FTABJMPA+DPTR;散转,执行所按键相应功能子程序GORET:RETFTAB:LCALLFUNC0;调用0号键功能子程序RETLCALLFUNC1;调用1键功能子程序RET. . . . . .LCALLFUNC15;调用15键功能子程序RETLCALLERRSUB;键值为16,异常处理RET;KSCAN为判断有无键按下子程序, 表示有键按下KSCAN:MOVP1, #0F0H;行线置低电平,列线置输入态MOVA, P1;读列线数据CPLA;A取反ANLA, #0F0H;屏蔽行线RET;返回
15、,表示有键按下;KEYSUM为求键值子程序,键值在A中KEYSUM:MOVR6, #00H;R6存放每行最左键的键值,初始清零MOVR7, #0FEH;准备扫描第0行LOOP:MOVP1,R7;逐行输出0扫描MOVA, P1;读列线数据SWAPA;A的高低半字节交换JBACC.0, L1;第0列无键按下,转查第1列MOVA, #0;第0列有键按下,SJMPKSOLVE;转求键值L1:JBACC.1, L2;第1列无键按下,转查第2列MOVA, #1;第1列有键按下,SJMPKSOLVE;转求键值L2:JBACC.2, L3;第2列无键按下,转查第3列MOVA, #2;第2列有键按下,SJMPK
16、SOLVE;转求键值L3:JBACC.3, NEXT;4列均无键按下,本行扫描结束MOVA, #3;第3列有键按下,SJMPKSOLVE;转求键值NEXT:MOVA, R7;准备扫描下一行JNBACC.3,ERR;扫描完未读到键值,异常处理RLA;R7循环左移一位MOVR7,A;得到下一行行扫描字ADDR6, #4;得到下一行首键键值SJMPLOOP;转LOOP,扫描下一行ERR:MOVA, #16;键值赋16,表示出错!RETKSOLVE:ADDA,R6;得键值PUSHACC;键值进栈暂存WAIT:ACALLKSCAN;查按键释放否?防止重复执行键功能JNZWAIT;没有释放,等待POPAC
17、C;键值出栈RET7.13 试设计有32个键盘的接口电路,并编写键盘的处理程序。答:ORG 0030HKEYSCAN:ACALLKSCAN;查有没有键按下JZGORET;A=0表示没有键按下,返回LCALLDELAY10ms;有键按下,延时10ms,防抖动。;(延时10ms的子程序DELAY10ms略)ACALLKSCAN;再查有没有键按下JZGORET;A=0表示没有键按下,返回ACALLKEYSUM;有键按下,扫描确定键值RL ARL A;键值4;主要考虑FTAB 以下指令LCALL(3字节)和RET(1字节)的总字节数为4MOVDPTR, #FTABJMPA+DPTR;散转,执行所按键相
18、应功能子程序GORET:RETFTAB:LCALLFUNC0;调用0号键功能子程序RETLCALLFUNC1;调用1键功能子程序RETLCALLFUNC31;调用31键功能子程序RETLCALLERRSUB;键值为32,异常处理RET; KSCAN为判断有无键按下子程序,表示有键按下KSCAN:MOVP1, #00H;行线置低电平, MOVP2, #0F0H ;列线置输入态MOVA, P2 ;读列线数据CPLA;A取反ANLA, #0FH;屏蔽高四位RET;返回,表示有键按下; KEYSUM为求键值子程序,键值在A中KEYSUM:MOVR6, #00H;R6存放每行最左键的键值,初始清零MOV
19、R7, #0FEH;准备扫描第0行LOOP:MOVP1,R7;逐行输出0扫描MOVA, P2;读列线数据JBACC.0, L1;第0列无键按下,转查第1列MOVA, #0;第0列有键按下,SJMPKSOLVE;转求键值L1:JBACC.1, L2;第1列无键按下,转查第2列MOVA, #1;第1列有键按下,SJMPKSOLVE;转求键值L2:JBACC.2, L3;第2列无键按下,转查第3列MOVA, #2;第2列有键按下,SJMPKSOLVE;转求键值L3:JBACC.3, NEXT;4列均无键按下,本行扫描结束MOVA, #3;第3列有键按下,SJMPKSOLVE;转求键值NEXT:MOV
20、A, R7;准备扫描下一行JNBACC.7,ERR;扫描完未读到键值,异常处理RLA;R7循环左移一位MOVR7,A;得到下一行行扫描字ADDR6, #4;得到下一行首键键值SJMPLOOP;转LOOP,扫描下一行ERR:MOVA, #32;键值赋32,表示出错!RETKSOLVE:ADDA,R6;得键值PUSHACC;键值进栈暂存WAIT:ACALLKSCAN;查按键释放否?防止重复执行键功能JNZWAIT;没有释放,等待POPACC;键值出栈RET7.14 用8051单片机的P1口作8个按键的独立式键盘接口,试画出其中断扫描方式的接口电路,编写相应的键盘处理程序。答:ORG0000HLJM
21、PSTARTORG0003H ;外部中断0入口地址LJMPKEYSCANORG0030HSTART:SETBIT0 ;置INT0边缘触发SETBEX0SETBEA ;开中断SJMP $ORG0100HKEYSCAN:MOVP1, #0FFH;置P1口为输入态MOVA, P1;读入键值LCALLDELAY10ms;延时10ms(DELAY10ms略),去抖动MOVB, P1;再读键值CJNEA, B, GORET;两次键值不一致,直接返回JNBACC.0, KEY0;0号键按下,转0号键功能程序JNBACC.1, KEY1;1号键按下,转1号键功能程序JNBACC.2, KEY2;2号键按下,转
22、2号键功能程序JNBACC.3, KEY3;3号键按下,转3号键功能程序JNBACC.4, KEY4;4号键按下,转4号键功能程序JNBACC.5, KEY5;5号键按下,转5号键功能程序JNBACC.6, KEY6;6号键按下,转6号键功能程序JNBACC.7, KEY7;7号键按下,转7号键功能程序GORET:RETI;从键盘服务子程序返回KEY0:LCALLFUNC0;执行0号键功能服务程序RETI;从键盘服务子程序返回KEY1:LCALLFUNC1;执行1号键功能服务程序RETI;从键盘服务子程序返回KEY2:LCALLFUNC2;执行2号键功能服务程序RETI;从键盘服务子程序返回KEY3:LCALLFUNC3;执行3号键功能服务程序RETI;从键盘服务子程序返回KEY4:LCALLFUNC4;执行4号键功能服务程序RETI;从键盘服务子程序返回KEY5:LCALLFUNC5;执行5号键功能服务程序RETI;从键盘服务子程序返回KEY6:LCALLFUNC6;执行6号键功能服务程序RETI;从键盘服务子程序返回KEY7:LCALLFUNC7;执行7号键功能服务程序RETI;从键盘服务子程序返回END7.15 请画出一个单片机与键盘、显示器的接口电路,并编出相应的程序。答:单片机与键盘、显示器的接口电路见教材“图7-10”所示。相应程序见教材“例7-5” 所示。7-10