单片机Keyboard仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
键盘仿真汇编程序
- WR273 EQU 8000H
- RD244 EQU 8000H
- DULA EQU P2.0
- WELA EQU P2.1
- ORG 0000H
- AJMP START
- ORG 0030H
- START: MOV 70H,#0BFH
- MOV 71H,#0BFH
- MOV 72H,#0BFH
- MOV 73H,#0BFH
- LOOP1: LCALL DISP
- LCALL KEY ;调用子程序KEY,得到所按下的按键编号值,存在RAM的7FH单元中
- MOV A,7FH
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR ;将该键盘编号转换为共阳极段码
- MOV 73H,72H
- MOV 72H,71H
- MOV 71H,70H
- MOV 70H,A ;移位显示
- LJMP LOOP1
- ;--------键盘扫描子程序--------------
- KEY: MOV R7,#00H ;R7存放键盘的列号
- MOV A,#00H
- MOV B,#0EH
- KEY1: NOP
- ORL A,B
- MOV DPTR,#WR273
- MOVX @DPTR,A ;送扫描信号,扫描第一列
- NOP
- NOP
- NOP
- NOP
- MOV DPTR,#RD244
- MOVX A,@DPTR
- ANL A,#0FH ;收到的数据只保留低4位
- CJNE A,#0FH,KEY2 ;若读到的数据低4位不全为1,则表示有键按下,转往KEY2
- INC R7
- SETB C
- MOV A,B
- RLC A
- ANL A,#0FH ;此时A中低4位为1101,作为扫描下一列的输入
- CJNE A,#0FH,KEY0
- MOV A,#0EH ;若扫描完4列,均无键按下,则A的低4位装入1110,R7装入0,重新开始扫描
- MOV R7,#00H
- KEY0: MOV B,A
- SJMP KEY1
- KEY2: CPL A
- ANL A,#0FH
- JNB ACC.0,KEY6
- MOV A,#00H
- SJMP KEY9
- KEY6: JNB ACC.1,KEY7
- MOV A,#01H
- SJMP KEY9
- KEY7: JNB ACC.2,KEY8
- MOV A,#02H
- SJMP KEY9
- KEY8: MOV A,#03H ;KEY2-KEY8确定该列上哪一行的按键被按下,行号最终存放在A中
- KEY9: XCH A,R7
- MOV B,#04H
- MUL AB
- ADD A,R7 ;列号*4+行号得到键值,键值布局与电路结构和扫描顺序有关
- MOV DPTR,#KTAB1
- MOVC A,@A+DPTR ;将键值转换为我为键盘编的号
- MOV 7FH,A ;最终得到的键号存入RAM的7FH单元
- KEYUP: MOV DPTR,#RD244
- MOVX A,@DPTR
- ANL A,#0FH
- CJNE A,#0FH,KEYUP
- RET
- ;-----扫描结果与键盘编号的对应-------------
- KTAB1: DB 03H,07H,0BH,0FH
- DB 02H,06H,0AH,0EH
- DB 01H,05H,09H,0DH
- DB 00H,04H,08H,0CH
- ;-----数码管显示子程序---------------------
- DISP: MOV A,70H ;将RAM中70H-73H单元中的数据显示在对应的数码管上
- MOV DPTR,#0800H
- MOVX @DPTR,A
- MOV A,71H
- MOV DPTR,#1000H
- MOVX @DPTR,A
- MOV A,72H
- MOV DPTR,#2000H
- MOVX @DPTR,A
- MOV A,73H
- MOV DPTR,#4000H
- MOVX @DPTR,A
- RET
- ;-----共阳极段代码-------------------------
- TABLE: DB 0C0H,0F9H,0A4H,0B0H, 99H,92H,82H,0F8H,80H;0-8
- DB 90H, 88H, 83H,0C6H,0A1H,86H,8EH
- END
复制代码
全部资料51hei下载地址:
Keyboard_Array.rar
(64.82 KB, 下载次数: 6)
|