51 单片机汇编编程:记录按键
扫描二维码
随时随地手机看文章
;有个题目,要求记录按下的键的编号。
;使用器件:
;51单片机,8个编号为“1~8”的数字键,1个功能键,1个数码管,其他晶振电阻电容。
;实现功能:
;按下功能键后,10s内,检测被按下的数字键,
;10s后,结束检测,并用数码管循环显示被按下过的键编号。
;做而论道据此画出的电路如下:
;电路中的数码管,不仅用于显示按下过的键编号,还能显示 9~0 的倒计时。
;在电路中,还安装了一个 LED,用来表示按键的状态。
;当有键按下,10ms 后仍然按下时,LED 将发光,表示按键确实按下了。
;当按键释放后,再令 LED 熄灭。
;另外,在显示按下的按键编号时,也令 LED 持续发光。
;当 LED 熄灭后,再次按下 FUNC 键,可以重新进行下一轮的按键记录。
;汇编语言编写的程序如下:
ORG 0000H
SJMP START
ORG 000BH
SJMP T0_INT
;---------------------------------------
START:
MOV TMOD, #01H
MOV IE, #82H
MOV DPTR, #D_TAB
WAIT_F:
JB P3.6, $ ;等待按下功能键
CALL DELAY10MS
JB P3.6, WAIT_F
CLR P3.2 ;LED发光
JNB P3.6, $ ;等待释放
SETB P3.2
;----------------------------------
MOV R0, #30H
MOV TH0, #(65536 - 62500) / 256
MOV TL0, #(65536 - 62500) MOD 256
MOV R7, #16
MOV R6, #9
CALL DISPLAY
SETB TR0
;----------------------------------
WAIT_N: ;循环检测按键
JNB TR0, STOP ;到10s退出
CALL KEY_N
JZ WAIT_N
MOV B, A
CALL DELAY10MS ;延时
CALL KEY_N
CJNE A, B, WAIT_N ;消抖
MOV @R0, A ;保存按键数值
INC R0
CLR P3.2 ;LED发光
WAIT_S:
CALL KEY_N
JNZ WAIT_S ;等待释放
SETB P3.2
SJMP WAIT_N ;循环检测按键
;----------------------------------
STOP:
MOV A, R0
CLR C
SUBB A, #30H
MOV R2, A
CLR P3.2 ;LED发光
MOV R0, #30H
ECHO:
MOV A, @R0
INC R0
MOV R6, A
CALL DISPLAY ;回放
MOV R3, #100
CALL DELAY10MS
DJNZ R3, $ - 2
DJNZ R2, ECHO ;循环
SETB P3.2
MOV R6, #0
CALL DISPLAY
SJMP WAIT_F
;---------------------------------------
T0_INT:
MOV TH0, #(65536 - 62500) / 256
MOV TL0, #(65536 - 62500) MOD 256
DJNZ R7, T0_END
MOV R7, #16
DEC R6
CJNE R6, #255, DISP
CLR TR0
RETI
DISP:
CALL DISPLAY
T0_END:
RETI
;---------------------------------------
DISPLAY:
MOV A, R6
MOVC A, @A + DPTR
MOV P2, A
RET
D_TAB: ;共阳段码
DB 0C0H, 0F9H, 0A4H, 0B0H, 099H
DB 092H, 082H, 0F8H, 080H, 090H
;---------------------------------------
KEY_N:
CLR A
JNB P1.0, K1
JNB P1.1, K2
JNB P1.2, K3
JNB P1.3, K4
JNB P1.4, K5
JNB P1.5, K6
JNB P1.6, K7
JNB P1.7, K8
RET ;没有按键,返回0
K8: INC A
K7: INC A
K6: INC A
K5: INC A
K4: INC A
K3: INC A
K2: INC A
K1: INC A
RET
;---------------------------------------
DELAY10MS:
MOV R4, #20
DJNZ R5, $
DJNZ R4, $ - 2
RET
;---------------------------------------
END
;经过仿真实验证明,本程序可以稳定工作。