;P1口外接4×4键盘,输出使用74LS164驱动一位数码显示器。
;当按下任一键时,在数码显示器上显示键值。
;程序用汇编语言编写,用PROTEUS仿真调试的画面如下:
;程序如下:
ORG 0000H
LJMP START
ORG 0030H
START:
MOV P1, #255
MOV 60H, #16
MAIN:
CALL DISPLAY
;SJMP $
M_LOOP:
CALL K_SCAN ;扫描程序
JB ACC.4, M_LOOP
LJMP MAIN
;---------------------------------------
DISPLAY:
MOV A, 60H
MOV DPTR, #D_TAB ;码表首地址
MOVC A, @A + DPTR
CPL A
MOV R2, #8
INI1:
RRC A
MOV P3.0, C ;A中低位输出至P3.0
CLR P3.1 ;移位脉冲
SETB P3.1
DJNZ R2, INI1 ;移位8次
RET
;-------------------------
D_TAB: ;段码表
DB 03FH, 006H, 05BH, 04FH
DB 066H, 06DH, 07DH, 007H
DB 07FH, 06FH, 077H, 07CH
DB 039H, 05EH, 079H, 071H, 000H
;---------------------------------------
K_SCAN:
MOV P1, #240 ;各行皆为0
MOV A, P1 ;读出列
CJNE A, #240, COW ;有键按下转移
SETB ACC.4 ;没有按键的标记
RET
;-------------------------
COW:
MOV P1, #15 ;各列皆为0
ADD A, P1
MOV 60H, A ;保存键码
;-------------------------
MOV DPTR, #KEY_TAB ;键码表首地址
MOV R2, #0 ;从第0个开始查
K_S1:
MOV A, R2
INC R2
MOVC A, @A + DPTR
CJNE A, 60H, K_S1 ;与60H内容比较,不等则继续查
DEC R2
CJNE R2, #16, K_ED
SETB ACC.4 ;没有按键的标记
RET
;-------------------------
K_ED: ;有键按下
MOV 60H, R2 ;保存按键号码
CALL DELAY ;消除抖动
WAIT:
MOV P1, #0F0H
MOV A, P1
CJNE A, #0F0H, WAIT ;等待释放
CLR A
RET
;-------------------------
KEY_TAB: ;键码表
DB 07EH, 0BEH, 0DEH, 0EEH
DB 07DH, 0BDH, 0DDH, 0EDH
DB 07BH, 0BBH, 0DBH, 0EBH
DB 077H, 0B7H, 0D7H, 0E7H
;---------------------------------------
DELAY: ;延时
MOV R5, #10
D2: MOV R6, #2
D1: MOV R7, #248
DJNZ R7, $
DJNZ R6, D1
DJNZ R5, D2
RET
;---------------------------------------
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)