1、端口初始化
SETB P2.0
MOV P1,#0
2、检测按键变化,每按过一次,按键计数器KEYCOUNT就加竖滚1,
查询按键是否按下
若已按下,则等待按键d起,若升纤陆未按下吵顷则等待按下
按键未d起就一直等待,否则执行
inc keycount
3、将按键计数器的值送往P1口
mov a,keycount
mov P1,a
KEYCARDBIT
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
模仿下
呵呵
大家都没多少时间的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)