资源描述
第7章 思考题和习题解答
7.1 试说明LED显示器的工作原理,什么是共阴极?什么是共阳极?
答:当发光二极管导通时,相应的一个点或一个线段发光。控制不同组合的发光二极管导通,就能显示出各种不同的字形。
共阴极LED显示器的8个发光二极管的阴极连接在一起,一般公共端阴极接地,其他管脚接驱动电路输出端,当某二极管的阳极为高电平时,则该发光二极管点亮;共阳极LED显示器的8个发光二极管的阳极连接在一起,一般公共阳极接高电平,其他管脚接驱动电路输出端。当某二极管的阴极为低电平时,则该发光二极管点亮。
7.2 键盘有哪几种类型?为什么要进行“去抖”处理?
答:键盘可以分为独立连接式和行列(矩阵)式两类,每一类又可根据对键盘的译码方法分为编码键盘和非编码键盘两种类型。
机械式按键在按下或释放时,由于触点弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。抖动时间的长短与开关的机械特性有关,一般为5~10ms。CPU在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作。为了克服按键触点机械抖动所致的检测误判,必须采取软件或硬件去抖动措施。
7.3 键盘的“去抖”处理方法有哪几种?
答:硬件去抖和软件去抖两种方法。
7.4 说明静态显示和动态显示的特点?
答:静态显示是指LED显示器显示某一字符时,相应的发光二极管恒定导通或恒定截止。这种显示方式要求各位显示块的公共端恒定接地(共阴极)或接正电源(共阳极)。每个显示块的8个段选线分别与一个8位并行I/O口的8位口线相接,I/O口只要有段码输出,相应字符就被显示出来,并保持不变。直到I/O口输出新的段码。
动态显示是一位一位地轮流点亮各位显示器,这种逐位点亮显示器的方式称为位扫描。这种显示方式要求各位显示器的段选线应并联在一起,由一个8位的I/O口控制;各位的位选线(公共阴极或阳极)由另外的口线控制。该方式显示时,各位显示器轮流选通,要使其稳定显示必须采用扫描方式,即在某一时刻只选通一位显示器,并送出相应的段码,进行适当延时(延时时间约为1~5ms),接着选通另一位显示器,并送出相应的段码,如此循环往复,即可使各位显示器显示相应的字符。只要循环时间足够短,利用人眼的视觉暂留效应,就可以给人同时显示的感觉。
7.5 非编码键盘可分为哪几种键盘?各有什么特点?
答:非编码键盘可分为独立式键盘和行列式键盘。
独立式键盘是每个按键独立地占用一根数据输入线。当某一按键按下时,相应的I/O线变为低电平。独立式键盘的特点是电路结构简单,但每个按键必须占用一根I/O线,当按键数较多时,占用的I/O口线就多,故其通常应用于按键数量较少的场合。
行列式键盘又称矩阵式键盘,它是将I/O线的一部分作为行线,另一部分作为列线,按键设置在行线和列线的交叉处。每当某个按键被按下时,与这个按键相连的行线和列线就会接通,否则是断开状态。因此,一个M×N的行列式非编码键盘只需M条行线和N条列线,共占用M+N条单片机的I/O端口线。
7.6 试说明非编码键盘的工作原理,如何去键抖动?如何判断键是否释放?
答:在非编码键盘中,每个按键的作用只是使相应接点接通或断开,每个按键的键码并非由硬件电路产生,而是通过软件来识别键码。
CPU在按键抖动期间扫描键盘必然会得到错误的行首键号和列值,最好的办法是使CPU在检测到有按键按下时延时一段时间后再进行列扫描。
当CPU检测到按键释放时,执行一个10ms左右的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持断开状态电平,则可判断该按键已释放。
7.7 独立式键盘和矩阵式键盘各有什么特点?各自在什么场合下使用?
答:独立式键盘是每个按键独立地占用一根数据输入线,其特点是电路结构简单,但每个按键必须占用一根I/O线,当按键数较多时,占用的I/O口线就多,故其通常应用于按键数量较少的场合。
行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键盘中,每根行线和列线的交叉处都接有一个按键,每当某个按键被按下时,与这个按键相连的行线和列线就会接通,否则是断开状态。因此,一个M×N的行列式非编码键盘只需M条行线和N条列线,共占用M+N条单片机的I/O端口线。
7.8 根据LED的结构原理,请任举一段码分析共阴极接法时的段码组成。
答:共阴极LED显示器的8个发光二极管的阴极连接在一起,一般公共端阴极接地,其它管脚接驱动电路输出端,当某二极管的阳极为高电平时,则该发光二极管点亮。如要显示字形“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”,与共阴极一样,相应的发光二级管点亮或熄灭,但控制电平加在阴极上,所以从发光二极管SP、g、f、e、d、c、b、a阳极上所加控制电平为1、0、1、1、0、0、0、0,所以字形“3”的段码为B0H。
7.10 请用AT89C51单片机的P1口设计一个4位独立式键盘电路,并编写相应的键盘程序。
答:
ORG 0030H
KEYSCAN: MOV P1, #0FFH ;置P1口为输入态
MOV A, P1 ;读入键值
LCALL DELAY10ms ;延时10ms(DELAY10ms略),去抖动
MOV B, P1 ;再读键值
CJNE A, B, GORET ;两次键值不一致,直接返回
JNB ACC.0, KEY0 ;0号键按下,转0号键功能程序
JNB ACC.1, KEY1 ;1号键按下,转1号键功能程序
JNB ACC.2, KEY2 ;2号键按下,转2号键功能程序
JNB ACC.3, KEY3 ;3号键按下,转3号键功能程序
GORET: RET ;从键盘服务子程序返回
KEY0: LCALL FUNC0 ;执行0号键功能服务程序
RET ;从键盘服务子程序返回
KEY1: LCALL FUNC1 ;执行1号键功能服务程序
RET ;从键盘服务子程序返回
KEY2: LCALL FUNC2 ;执行2号键功能服务程序
RET ;从键盘服务子程序返回
KEY3: LCALL FUNC3 ;执行3号键功能服务程序
RET ;从键盘服务子程序返回
7.11 请用AT89C51单片机的P1口设计一个3×3的键盘电路,并编写相应的键盘程序。
答:
ORG 0030H
KEYSCAN: ACALL KSCAN ;查有没有键按下
JZ GORET ;A=0表示没有键按下,返回
LCALL DELAY10ms ;有键按下,延时10ms(DELAY10ms略)。
ACALL KSCAN ;再查有没有键按下
JZ GORET ;A=0表示没有键按下,返回
ACALL KEYSUM ;有键按下,扫描确定键值
RL A
RL A ;键值×4
;主要考虑FTAB 以下指令LCALL(3字节)和RET(1字节)的总字节数为4
MOV DPTR, #FTAB
JMP @A+DPTR ;散转,执行所按键相应功能子程序
GORET: RET
FTAB: LCALL FUNC0 ;调用0号键功能子程序
RET
LCALL FUNC1 ;调用1键功能子程序
RET
……
LCALL FUNC8 ;调用8键功能子程序
RET
LCALL ERRSUB ;键值为9,异常处理
RET
;KSCAN为判断有无键按下子程序,表示有键按下
KSCAN: MOV P1, #0F8H ;行线置低电平,列线置输入态
MOV A, P1 ;读列线数据
CPL A ;A取反
ANL A, #0F8H ;屏蔽行线
RET ;返回,表示有键按下
;KEYSUM为求键值子程序,键值在A中
KEYSUM: MOV R6, #00H ;R6存放每行最左键的键值,初始清零
MOV R7, #0FEH ;准备扫描第0行
LOOP: MOV P1,R7 ;逐行输出0扫描
MOV A, P1 ;读列线数据
JB ACC.3, L1 ;第0列无键按下,转查第1列
MOV A, #0 ;第0列有键按下,
SJMP KSOLVE ;转求键值
L1: JB ACC.4, L2 ;第1列无键按下,转查第2列
MOV A, #1 ;第1列有键按下,
SJMP KSOLVE ;转求键值
L2: JB ACC.5, NEXT ;4列均无键按下,本行扫描结束
MOV A, #2 ;第3列有键按下,
SJMP KSOLVE ;转求键值
NEXT: MOV A, R7 ;准备扫描下一行
JNB ACC.2,ERR ;扫描完未读到键值,异常处理
RL A ;R7循环左移一位
MOV R7,A ;得到下一行行扫描字
ADD R6, #3 ;得到下一行首键键值
SJMP LOOP ;转LOOP,扫描下一行
ERR: MOV A, #9 ;键值赋9,表示出错!
RET
KSOLVE: ADD A,R6 ;得键值
PUSH ACC ;键值进栈暂存
WAIT: ACALL KSCAN ;查按键释放否?防止重复执行键功能
JNZ WAIT ;没有释放,等待
POP ACC ;键值出栈
RET
7.12 请用AT89C51单片机的P1口设计一个4×4的键盘电路,并编写相应的键盘程序。
答:
KEYSCAN: ACALL KSCAN ;查有没有键按下
JZ GORET ;A=0表示没有键按下,返回
LCALL DELAY10ms ;有键按下,延时10ms,防抖动。
;(延时10ms的子程序DELAY10ms略)
ACALL KSCAN ;再查有没有键按下
JZ GORET ;A=0表示没有键按下,返回
ACALL KEYSUM ;有键按下,扫描确定键值
RL A
RL A ;键值×4
;主要考虑FTAB 以下指令LCALL(3字节)和RET(1字节)的总字节数为4
MOV DPTR, #FTAB
JMP @A+DPTR ;散转,执行所按键相应功能子程序
GORET: RET
FTAB: LCALL FUNC0 ;调用0号键功能子程序
RET
LCALL FUNC1 ;调用1键功能子程序
RET
. . . . . .
LCALL FUNC15 ;调用15键功能子程序
RET
LCALL ERRSUB ;键值为16,异常处理
RET
;KSCAN为判断有无键按下子程序, 表示有键按下
KSCAN: MOV P1, #0F0H ;行线置低电平,列线置输入态
MOV A, P1 ;读列线数据
CPL A ;A取反
ANL A, #0F0H ;屏蔽行线
RET ;返回,表示有键按下
;KEYSUM为求键值子程序,键值在A中
KEYSUM: MOV R6, #00H ;R6存放每行最左键的键值,初始清零
MOV R7, #0FEH ;准备扫描第0行
LOOP: MOV P1,R7 ;逐行输出0扫描
MOV A, P1 ;读列线数据
SWAP A ;A的高低半字节交换
JB ACC.0, L1 ;第0列无键按下,转查第1列
MOV A, #0 ;第0列有键按下,
SJMP KSOLVE ;转求键值
L1: JB ACC.1, L2 ;第1列无键按下,转查第2列
MOV A, #1 ;第1列有键按下,
SJMP KSOLVE ;转求键值
L2: JB ACC.2, L3 ;第2列无键按下,转查第3列
MOV A, #2 ;第2列有键按下,
SJMP KSOLVE ;转求键值
L3: JB ACC.3, NEXT ;4列均无键按下,本行扫描结束
MOV A, #3 ;第3列有键按下,
SJMP KSOLVE ;转求键值
NEXT: MOV A, R7 ;准备扫描下一行
JNB ACC.3,ERR ;扫描完未读到键值,异常处理
RL A ;R7循环左移一位
MOV R7,A ;得到下一行行扫描字
ADD R6, #4 ;得到下一行首键键值
SJMP LOOP ;转LOOP,扫描下一行
ERR: MOV A, #16 ;键值赋16,表示出错!
RET
KSOLVE: ADD A,R6 ;得键值
PUSH ACC ;键值进栈暂存
WAIT: ACALL KSCAN ;查按键释放否?防止重复执行键功能
JNZ WAIT ;没有释放,等待
POP ACC ;键值出栈
RET
7.13 试设计有32个键盘的接口电路,并编写键盘的处理程序。
答:
ORG 0030H
KEYSCAN: ACALL KSCAN ;查有没有键按下
JZ GORET ;A=0表示没有键按下,返回
LCALL DELAY10ms ;有键按下,延时10ms,防抖动。
;(延时10ms的子程序DELAY10ms略)
ACALL KSCAN ;再查有没有键按下
JZ GORET ;A=0表示没有键按下,返回
ACALL KEYSUM ;有键按下,扫描确定键值
RL A
RL A ;键值×4
;主要考虑FTAB 以下指令LCALL(3字节)和RET(1字节)的总字节数为4
MOV DPTR, #FTAB
JMP @A+DPTR ;散转,执行所按键相应功能子程序
GORET: RET
FTAB: LCALL FUNC0 ;调用0号键功能子程序
RET
LCALL FUNC1 ;调用1键功能子程序
RET
……
LCALL FUNC31 ;调用31键功能子程序
RET
LCALL ERRSUB ;键值为32,异常处理
RET
; KSCAN为判断有无键按下子程序,表示有键按下
KSCAN: MOV P1, #00H ;行线置低电平,
MOV P2, #0F0H ;列线置输入态
MOV A, P2 ;读列线数据
CPL A ;A取反
ANL A, #0FH ;屏蔽高四位
RET ;返回,表示有键按下
; KEYSUM为求键值子程序,键值在A中
KEYSUM: MOV R6, #00H ;R6存放每行最左键的键值,初始清零
MOV R7, #0FEH ;准备扫描第0行
LOOP: MOV P1,R7 ;逐行输出0扫描
MOV A, P2 ;读列线数据
JB ACC.0, L1 ;第0列无键按下,转查第1列
MOV A, #0 ;第0列有键按下,
SJMP KSOLVE ;转求键值
L1: JB ACC.1, L2 ;第1列无键按下,转查第2列
MOV A, #1 ;第1列有键按下,
SJMP KSOLVE ;转求键值
L2: JB ACC.2, L3 ;第2列无键按下,转查第3列
MOV A, #2 ;第2列有键按下,
SJMP KSOLVE ;转求键值
L3: JB ACC.3, NEXT ;4列均无键按下,本行扫描结束
MOV A, #3 ;第3列有键按下,
SJMP KSOLVE ;转求键值
NEXT: MOV A, R7 ;准备扫描下一行
JNB ACC.7,ERR ;扫描完未读到键值,异常处理
RL A ;R7循环左移一位
MOV R7,A ;得到下一行行扫描字
ADD R6, #4 ;得到下一行首键键值
SJMP LOOP ;转LOOP,扫描下一行
ERR: MOV A, #32 ;键值赋32,表示出错!
RET
KSOLVE: ADD A,R6 ;得键值
PUSH ACC ;键值进栈暂存
WAIT: ACALL KSCAN ;查按键释放否?防止重复执行键功能
JNZ WAIT ;没有释放,等待
POP ACC ;键值出栈
RET
7.14 用8051单片机的P1口作8个按键的独立式键盘接口,试画出其中断扫描方式的接口电路,编写相应的键盘处理程序。
答:
ORG 0000H
LJMP START
ORG 0003H ;外部中断0入口地址
LJMP KEYSCAN
ORG 0030H
START: SETB IT0 ;置INT0边缘触发
SETB EX0
SETB EA ;开中断
SJMP $
ORG 0100H
KEYSCAN: MOV P1, #0FFH ;置P1口为输入态
MOV A, P1 ;读入键值
LCALL DELAY10ms ;延时10ms(DELAY10ms略),去抖动
MOV B, P1 ;再读键值
CJNE A, B, GORET ;两次键值不一致,直接返回
JNB ACC.0, KEY0 ;0号键按下,转0号键功能程序
JNB ACC.1, KEY1 ;1号键按下,转1号键功能程序
JNB ACC.2, KEY2 ;2号键按下,转2号键功能程序
JNB ACC.3, KEY3 ;3号键按下,转3号键功能程序
JNB ACC.4, KEY4 ;4号键按下,转4号键功能程序
JNB ACC.5, KEY5 ;5号键按下,转5号键功能程序
JNB ACC.6, KEY6 ;6号键按下,转6号键功能程序
JNB ACC.7, KEY7 ;7号键按下,转7号键功能程序
GORET: RETI ;从键盘服务子程序返回
KEY0: LCALL FUNC0 ;执行0号键功能服务程序
RETI ;从键盘服务子程序返回
KEY1: LCALL FUNC1 ;执行1号键功能服务程序
RETI ;从键盘服务子程序返回
KEY2: LCALL FUNC2 ;执行2号键功能服务程序
RETI ;从键盘服务子程序返回
KEY3: LCALL FUNC3 ;执行3号键功能服务程序
RETI ;从键盘服务子程序返回
KEY4: LCALL FUNC4 ;执行4号键功能服务程序
RETI ;从键盘服务子程序返回
KEY5: LCALL FUNC5 ;执行5号键功能服务程序
RETI ;从键盘服务子程序返回
KEY6: LCALL FUNC6 ;执行6号键功能服务程序
RETI ;从键盘服务子程序返回
KEY7: LCALL FUNC7 ;执行7号键功能服务程序
RET I ;从键盘服务子程序返回
END
7.15 请画出一个单片机与键盘、显示器的接口电路,并编出相应的程序。
答:单片机与键盘、显示器的接口电路见教材“图7-10”所示。相应程序见教材“例7-5” 所示。
7-10
展开阅读全文