📄 kb.lst
字号:
A51 MACRO ASSEMBLER KB 01/17/2008 21:49:43 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN kb.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE kb.a51 SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
0000 1 ORG 00H
0000 803E 2 JMP START
3 ;-----------------------------------------------------------
0090 4 KB_PORT EQU P1
00A0 5 LED_PORT EQU P2
6 ;-----------------------MAIN_PRO----------------------------
0040 7 ORG 40H
0040 8 START:
0040 114C 9 CALL KEY_SCAN
0042 8BA0 10 MOV P2,R3
0044 7D0A 11 MOV R5,#10
0046 1186 12 L1: CALL DL20MS
0048 DDFC 13 DJNZ R5,L1
004A 80F4 14 JMP START
15 ;--------------------查表法得顺序码------键码存于R3中------------------------
004C 16 KEY_SCAN:
004C 75900F 17 MOV KB_PORT,#0FH ;用反转法查键
004F E590 18 MOV A,KB_PORT
0051 540F 19 ANL A,#0FH
0053 F5F0 20 MOV B,A
0055 7590F0 21 MOV KB_PORT,#0F0H
0058 E590 22 MOV A,KB_PORT
005A 54F0 23 ANL A,#0F0H
005C 45F0 24 ORL A,B
005E B4FF01 25 CJNE A,#0FFH,KEY1
0061 22 26 RET ;无键按下
0062 27 KEY1:
0062 F5F0 28 MOV B,A ;有键按下,存键码
0064 900075 29 MOV DPTR,#TABLE
0067 7BFF 30 MOV R3,#0FFH ;存顺序码单元初始化
0069 31 KEY2:
0069 0B 32 INC R3
006A EB 33 MOV A,R3
006B 93 34 MOVC A,@A+DPTR
006C B5F002 35 CJNE A,B,KEY3 ;判键码,求顺序码
006F EB 36 MOV A,R3 ;若找到键码,存顺序码
0070 22 37 RET
0071 38 KEY3:
0071 B4FFF5 39 CJNE A,#0FFH,KEY2 ;判是否查完
0074 22 40 RET ;已查完,键码未找到,以无按键处理
41
42 ;-------------------可改表的须序来改变对应键的顺序-----------------------------------------
---
0075 43 TABLE:
0075 E7D7DBDD 44 DB 0E7H,0D7H,0DBH,0DDH;7 8 9 F
0079 B7BBBD77 45 DB 0B7H,0BBH,0BDH,077H;4 5 6 E
007D 7B7DEBED 46 DB 07BH,07DH,0EBH,0EDH;1 2 3 D
0081 EEDEBE7E 47 DB 0EEH,0DEH,0BEH,07EH;0 A B C
0085 FF 48 DB 0FFH
49 ;------------------可改表的须序来改变对应键的顺序------------------------------------------
--
50 ;TABLE:
51 ; DB 077H,07BH,07DH,07EH ;0 1 2 3
52 ; DB 0B7H,0BBH,0BDH,0BEH ;4 5 6 7
53 ; DB 0D7H,0DBH,0DDH,0DEH ;8 9 A B
54 ; DB 0E7H,0EBH,0EDH,0EEH ;C D E F
55 ; DB 0FFH ;查表的结束标记
56 ;--------------------delay 20 ms-----------------------
A51 MACRO ASSEMBLER KB 01/17/2008 21:49:43 PAGE 2
0086 57 DL20MS:
0086 7F64 58 MOV R7,#100
0088 7E64 59 D1: MOV R6,#100
008A DEFE 60 DJNZ R6,$
008C DFFA 61 DJNZ R7,D1
008E 22 62 RET
63 ;-------------------------------------------------
64 END
;------------------------------------------------------------------------
;KEY_SCAN:
; MOV KEY_PORT,#0FH ;置高4位为低电平,低四位为输入
; MOV A,KEY_PORT ;保存键码
; CJNE A,#0FH,KEY1 ;有键按下就到KEY1
; JMP OUT
;KEY1:
; CALL DL20MS ;去抖
; MOV A,KEY_PORT ;再次读键码
; CJNE A,#0FH,KEY2 ;是否有键按下
; JMP OUT
;KEY2:
; MOV KEY_PORT,#0F0H ;置低四位为低电平,高四位为输入
; MOV B,KEY_PORT ;保存键码
;KEY3:
; ORL A,B ;将两次的键码合并为1B的键码并放在A中
;----------------------------查表-----------------------------------------
; MOV B,A ;保存键码于B中
; MOV DPTR,#TABLE ;取表首地址
; MOV R3,#00H ;存顺序码单元初始化
;KEY4:
; MOV A,R3
; MOVC A,@A+DPTR
; CJNE A,B,KEY5 ;判键码,求顺序码
; MOV A,R3 ;若找到键码,存顺序码
; JMP OUT
;KEY5:
; INC R3 ;指向表的下一个
; CJNE R3,#16,KEY4 ;判断是否查完
;OUT: RET
;-------------------------KEY_SCAN---------------------------
;采用行送低电平,列设输入,读列值
;列送低电平,行设为输入,读行值,
A51 MACRO ASSEMBLER KB 01/17/2008 21:49:43 PAGE 3
;最后得到按键对应唯一的代码,优点:可识别多键同时按下的情况
;------------------------------------------------------------
;KB_PORT EQU P1
;KEY_CODE EQU 30H
;
;KEY_SCAN:
; MOV KEY_CODE,#0
; MOV KB_PORT,#0FH
; MOV A,KB_PORT
; ANL A,#0FH
; CJNE A,#0FH,SAV1
; JMP OUT ;若无键按下,退出
;SAV1: MOV KEY_CODE,A ;保存
;
; CALL DELAY ;去抖动
;
; MOV KB_PORT,#0F0H
; MOV A,KB_PORT
; ANL A,#0F0H
; CJNE A,#0F0H,SAV2 ;若无键按下,退出
; JMP OUT
;SAV2:
; ORL A,KEY_CODE ;得到8位键盘码
; MOV KEY_CODE,A ;保存8位键盘码
;OUT: RET
;---------------------------------------------------------------
A51 MACRO ASSEMBLER KB 01/17/2008 21:49:43 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
B. . . . . . . . . D ADDR 00F0H A
D1 . . . . . . . . C ADDR 0088H A
DL20MS . . . . . . C ADDR 0086H A
KB_PORT. . . . . . D ADDR 0090H A
KEY1 . . . . . . . C ADDR 0062H A
KEY2 . . . . . . . C ADDR 0069H A
KEY3 . . . . . . . C ADDR 0071H A
KEY_SCAN . . . . . C ADDR 004CH A
L1 . . . . . . . . C ADDR 0046H A
LED_PORT . . . . . D ADDR 00A0H A
P1 . . . . . . . . D ADDR 0090H A
P2 . . . . . . . . D ADDR 00A0H A
START. . . . . . . C ADDR 0040H A
TABLE. . . . . . . C ADDR 0075H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -