||
程序清单
; 定义几个变量。
UpDown BIT 00H ;上下行标志。
StartEnd BIT 01H ;起动及停止标志。
LAMPCODE EQU 21H ;存放流动的数据代码。
; 程序开始。
ORG 0000H
AJMP MAIN
ORG 30H
;主程序。
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown ;启动时处于向上的状态。
CLR StartEnd ;启动时处于停止状态。
MOV LAMPCODE,#0FEH ;单灯流动的代码。
LOOP:
ACALL KEY ;调用键盘程序。
JNB F0,LNEXT ;如果无键按下,则继续,
ACALL KEYPROC ;否则调用键盘处理程序。
LNEXT:ACALL LAMP ;调用灯显示程序。
AJMP LOOP ;反复循环,主程序到此结束。
;延时程序,键盘处理中调用。
DELAY:MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;键盘处理程序。
KEYPROC:
MOV A,B ;从B寄存器中获取键值。
JB ACC.2,KeyStart ;分析键的代码,某,
JB ACC.3,KeyOver ; 位被按下,则该位为1。
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:SETB StartEnd ;第一个键按下后的处理。
AJMP KEY_RET
KeyOver:CLR StartEnd ;第二个键按下后的处理。
AJMP KEY_RET
KeyUp:SETB UpDown ;第三个键按下后的处理。
AJMP KEY_RET
KeyDown:CLR UpDown ;第四个键按下后的处理。
KEY_RET:
RET
; 按键检测程序。
KEY:
CLR F0 ;清F0,表示无键按下。
ORL P3,#00111100B ;将P3口的接有键的四位置1。
MOV A,P3 ;取P3的值。
ORL A,#11000011B ;将其余4位置1。
CPL A ;取反。
JZ K_RET ;如果为0则一定无键按下,
CALL DELAY ;否则延时去键抖。
ORL P3,#00111100B ;下面的程序目的是再次。
MOV A,P3 ; 确认按键是否按下。
JZ K_RET ;有键按下?在此设置断点!
MOV B,A ;确实有键按下,将键值存入B中。
SETB F0 ;设置有键按下的标志。
;以下的代码是可以被注释掉的,如果去掉注释,就具有判断键是否释放的功能,否则没有。
K_RET: ;ORL P3,#00111100B ;此处循环等待键的释放。
;MOV A,P3
;ORL A,#11000011B
;CPL A
;JZ K_RET1 ;读取的数据取反后为0说明键释放了。
;AJMP K_RET
;K_RET1:CALL DELAY ;消除后沿抖动。
RET