最近刚学单片机,为了方便,用了proteus和keil 电脑仿真,刚调试成功,用两个数码管显示按键次数,经测试正确。
代码可能不是很有效,也希望有朋友帮忙改进.
以此而推可以显示更多位.现传上proteus 设计图和源码,带注解,因为看了论坛上那位肺腑之言的贴,要养好写注解的习惯。
KEYCARD BIT 00H ;用于标志是否有键按下
KEYCOU EQU 5AH ;用于记录按下键的次数
ORG 0000H ;程序开始
AJMP START
ORG 30H ;为避免占用中断向量区,主程序从30H开始
START:
MOV SP,#5FH ;设置堆栈的初始地址
MOV P2,#0H ;P2,P3的初始化
MOV P3,#0FFH
CLR KEYCARD ;有按键标志清0
MOV KEYCOU,#0 ;计数初值赋0
LOOP: ;循环扫描键盘
ACALL KEY_CHECK
JNB KEYCARD,DISPLAY
INC KEYCOU
DISPLAY: ;显示程序
MOV DPTR,#ASCII ;获得对应的显示码
PUSH B
MOV A,KEYCOU
MOV B,#0AH
DIV AB ;选显示第一位高位
MOVC A,@A+DPTR
MOV P0,A ;把显示码传至A口
SETB P2.1 ;选通P2.0,显示
ACALL DELAY1S
CLR P2.1
MOV A, B
POP B
MOVC A,@A+DPTR
MOV P0,A ;把显示码传至A口
SETB P2.0 ;选通P2.0,显示
ACALL DELAY1S
CLR P2.0
AJMP LOOP
KEY_CHECK: ;看有没有键按下
MOV A,P3
ANL A,#0fFH ;逻辑与
CJNE A,#0FFH,KEY_CER ;如果读入的与写出的不相等,延时消抖
CLR KEYCARD
RET
KEY_CER: ;延时,再读入,看是否真的有键按下
ACALL DELAY1S
MOV A,P3
ANL A,#0FFH
CJNE A,#0FFH,KEY_CE
CLR KEYCARD
RET
KEY_CE:
MOV A,P3 ;直等到按键放下,则算作一次
ANL A,#0FFH
CJNE A,#0FFH,KEY_CE
SETB KEYCARD ;真的有键按下,则置标志位
RET
DELAY1S: ;延时函数
MOV R7,#10
D1:
MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
ASCII: DB 0C0H,0F9H,0A4H,0B0H,099H
DB 092H,082H,0F8H,080H,090H
DB 088H,083H,0C6H,0A1H,086H
DB 08EH,08CH,0BFH,0FFH
END
|