340 likes | 490 Views
8.1 键盘接口技术. 8.1.1 行列式非编码键盘的工作原理 行列式键盘又叫矩阵键盘,如图 8-1 所示,按键设置在行列的交叉点上,如用 2×2 的行列结构可构成四个键的键盘, 4×4 的行列结构可构成 16 个键的键盘。在按键数量较多时,矩阵键盘可节省 I/O 口线。. 图 8-1 矩阵键盘与 AT89C51 接口连接图. 图 8-2 键闭合及断开时的电压抖动. 综上所述,对于非编码键盘,按键处理程序应具有如下四个功能: (1) 判断键盘上有无键按下。 (2) 去除键的机械抖动。 (3) 求按下键的键码。
E N D
8.1 键盘接口技术 • 8.1.1 行列式非编码键盘的工作原理 • 行列式键盘又叫矩阵键盘,如图8-1所示,按键设置在行列的交叉点上,如用2×2的行列结构可构成四个键的键盘,4×4的行列结构可构成16个键的键盘。在按键数量较多时,矩阵键盘可节省I/O口线。
综上所述,对于非编码键盘,按键处理程序应具有如下四个功能: • (1) 判断键盘上有无键按下。 • (2) 去除键的机械抖动。 • (3) 求按下键的键码。 • (4) 闭合一次,只进行一次键功能操作。 • 8.1.2 单片机对非编码键盘的控制方式 • 1. 查询方式 • 这种方式是指在单片机完成其它工作后的空余时间,调用键盘扫描子程序,来响应键盘输入的要求,在执行键功能程序时,CPU不再响应键输入要求。
[例8.1] 用查询法按图8-1读取行列键盘键码,并将键码存入内部RAM 32H单元。 • 图中P1.4~P1.7用于控制行线,P1.0~P1.3用于控制列线。行、列线通过上拉电阻接+5 V,没有键按下时,被钳在高电平状态。通过发送扫描字确定键码,具体方法如下: • (1) 由列线输出0,然后读入P1口的值存入内部RAM 30H单元。
(2) 由行线输出0,然后读入P1口的值存入内部RAM 31H单元。 • (3) 把30H的低4位与31H的高4位的值相加存入累加器A。 • (4) 最后判断累加器A的值,如果累加器A的数据全为1,说明无键按下,否则说明有键按下,且累加器A的数据就是被按下键的键值(程序中对累加器A取反,目的是用JNZ指令判断是否有键按下)。如图中圆圈所指键的键值为10111110B。
键扫描程序如下: • BOAD:LCALL BOADD • JNZ BOAD1 ;无键按下转BOAD • LCALL DELAY ;调延时子程序 • AJMP BOAD ;继续扫描键盘 • BOAD1:LCALL DELAY ;消除键抖动(延时子程序略) • LCALL BOADD ;确认是否有键按下 • JNZ BOAD2 • LCALL DELAY • SJMP BOAD ;转键扫描
BOAD2: CPL A • MOV 32H,A ;取键值 • BOAD3: LCALL DELAY • LCALL BOADD • JNZ BOAD3 ;等待键松开 • B2: RET ;返回 • ;获取键值子程序
BOADD: MOV P1,#0FH ;置行线为0 • MOV A,P1 • MOV 30H,A • MOV P1,#0F0H ;置列线为0 • MOV A,P1 • MOV 31H,A • ANL 30H,#0FH ;取列值
MOV A,30H • ANL 31H,#0F0H ;取行值 • ADD A,31H ;行值加列值 • CPL A ;A全0无键按下 • RET
2. 定时扫描工作方式 • 定时扫描工作方式是利用单片机内部定时器产生定时中断,CPU响应中断后对键盘进行扫描,当有键按下时,转入键功能的处理程序。 • 定时扫描在本质上是中断方式,只不过是定时扫描键盘,以中断的方式处理键盘,它的硬件电路与编程扫描工作方式相同。 • 3. 中断工作方式 • 单片机应用系统工作时,并不经常需要键输入。因此,无论是编程工作方式或是定时工作方式,CPU经常处于空扫描状态。 • 图8-3是AT89C51利用中断扫描方式实现的一个2×8矩阵式键盘的硬件接口电路。
通过前面的原理分析可知,完成键盘管理的程序主要有主程序和中断服务程序,主程序主要完成初始化和键值处理任务,中断服务程序主要完成键盘扫描和键值读入任务。对应的程序流程图如图8-4所示(INT1中断流程图与INT0类似,略)。通过前面的原理分析可知,完成键盘管理的程序主要有主程序和中断服务程序,主程序主要完成初始化和键值处理任务,中断服务程序主要完成键盘扫描和键值读入任务。对应的程序流程图如图8-4所示(INT1中断流程图与INT0类似,略)。
程序如下: • ORG 0000H • LJMP BEGIN ;转主程序 • ORG 0003H • LJMP WZD0 ;转外中断0程序 • ORG 0013H • LJMP WZD1 ;转外中断1程序
BEGIN: ORG 0100H • MOV SP,#60H ;设置堆栈 • MOV R1,#00H ;R1存放键值 • SETB IT1 ;设INT0、INT1为边沿触发 • SETB IT0 • SETB EA ;开中断 • SETB EX0 • SETB EX1 • MOV P1,#00H
键值处理程序(略) • 其它主程序(略) • WZD0: PUSH PSW ;保护现场 • PUSH A • CLR EX0 ;关中断INT0 • LCALL DELAY ;调延时程序去抖动 • JNB P3.2,WZD01 • ;再次确认是INT0中断吗
SETB EX0 ;不是,则恢复现场退出中断 • POP A • POP PSW • RETI • WZD01: MOV A,#01H ;置S1键的键值为1 • MOV P1,#0FEH ;扫描P1.0 • JNB P3.2,KEYR1 ;是S1键则转移
INC A ;不是S1键,键值加1 • MOV P1,#0FDH ;扫描P1.1,以下同P1.0类似 • JNB P3.2,KEYR1 • INC A • MOV P1,#0FBH • JNB P3.2,KEYR1 • INC A • MOV P1,#0F7H • JNB P3.2,KEYR1 • INC A
MOV P1,#0EFH • JNB P3.2,KEYR1 • INC A • MOV P1,#0DFH • JNB P3.2,KEYR1 • INC A • MOV P1,#0BFH • JNB P3.2,KEYR1 • INC A • MOV P1,#7FH
JNB P3.2,KEYR1 • LJMP KEYR2 • KEYR1:MOV R1,A ;将键值存入R1中 • KEYR2:CLR IE0 ;清中断标志(因扫描中可能使IE0置位) • SETB EX0 ;开中断INT0 • POP A ;恢复现场 • POP PSW • RETI ;中断返回 • WZD1: …;外中断1程序与中断0相似(略) • DELAY: …;延时程序(略)
图8-4 中断方式扩展键盘流程图 (a) 主程序流程图;(b) INT0中断服务程序流程图
8.2 LED显示器接口技术 • 8.2.1 LED显示器的结构原理 • LED显示器用发光二极管显示字段,分为共阴极和共阳极两种。图8-5给出了八段LED数码显示器的结构图和原理图。图8-5(a)是八段共阴极LED显示器,它将八个发光二极管阴极共地。当某发光二极管要点亮时,只需在该发光二极管的阳极加高电平即可。图8-5(b)是八段共阳极LED显示器,它的操作与共阴极相反。LED显示器也有七段的,它只比八段LED少一只发光二极管DP,其它结构与八段LED完全相同。
图8-5 七段LED显示器 (a) 共阴性;(b) 共阳性;(c) 管脚配置
字形码 3F 06 5B 4F 66 6D 7D 07 7F 6F 显示字符 0 1 2 3 4 5 6 7 8 9 • 表8-1 共阴极LED数码管字形码表 图8-6 字形码数据格式
8.2.2 LED显示器的显示方式 • 1.静态显示方式 • 在静态显示方式中,各位的共阴或共阳极连接在一起接地或接+5 V,每位的段选线(a~dp)与一个8位并行口相连。如图8-7所示,它是一个4位的静态显示电路,之所以称之为静态显示电路,是由于显示器的各位相互独立,而且各位的显示字符一经确定,相应的输出将维持不变,直到显示另一个字符为止。
2. 动态方式 • 为了克服静态显示方式的缺点,节省I/O口线,人们常常使用动态显示方式。它将所有数码管的a、b、c、d、e、f、g、sp引线并联在一起,由一个8位I/O口控制,而公共端由另一个I/O口控制。应用时,轮流送入每个LED的字形码与位选码,利用人的视觉暂留现象来显示各位的字符。图8-8是一个8位LED动态显示电路图.
[例8.2] 根据图8-9编写程序显示内部RAM 50H~57H单元中的数据。 图8-9 AT89C51与动态显示LED接口连接图
图8-9是用8255A对8位动态显示器的接口电路。图中LED为八段共阴数码管,A口输出字形码,B口输出位选码,片选端直接接地。根据图中连接可知,8255A的A口地址为FFFCH,B口地址为FFFDH,控制口地址为FFFFH,由于A、B口均为输出,因此控制字为80H。下面是一个动态显示内部RAM 50H~57H单元数据的子程序。
DIR:MOV A,#10000000B • ;设置8255的工作方式,A、B口为输出 • MOV DPTR,#0FFFFH • ;8255的命令口地址送DPTR • MOVX @DPTR,A • MOV R0,#50H ;50H~57H为显示缓冲区 • MOV R3,#7FH ;第一位的位选码 • MOV A,R3
SCAN: MOV DPTR,#0FFFDH ;指向B口 • MOVX @DPTR,A ;位选码送B口 • MOV A,@R0 ;取显示数据 • MOV DPTR,#TAB ;取字形码表首址 • MOVC A,@A+DPTR ;取字形码 • MOV DPTR,#0FFFCH ;指向A口
MOVX @DPTR,A ;字形码送A口 • ACALL DL1ms ;调延时1 ms子程序 • INC R0 ;指向下一显示数据单元 • MOV A,R3 • JNB ACC.0,ED ;8位显示完,退出 • RR A ;指向下一位 • MOV R3,A • AJMP SCAN ;继续显示下一位
ED:RET • TAB:DB 3FH,06H,5BH,4FH,66H • ;共阴0~F的字型码表 • DB 6DH,7DH,07H,7FH,6FH • DL1ms: MOV R7,#01H ;延时1 ms子程序 • DL0: MOV R6,#0FFH • DL1: DJNZ R6,DLI • DJNZ R7,DLO • RET