MOV R2,#08H ;LED待显示位数送R2
MOV R0,#30H ;显示缓冲区首址送R0
STAR: MOV @R0,#00H ;显示缓冲区清零
INC R0
DJNZ R2,STAR
CLR A ;累加器清零
;―――――――――――键盘查询程序――――――――――
KEY: ACALL KS ;调按键查询子程序判是否有键按下
JNZ K1 ;有键按下转移
ACALL DISP ;无键按下,调显示子程序延时
AJMP KEY ;继续查询按键
;―――――――――――键盘扫描程序――――――――――
K1: ACALL DISP ;键盘去抖延时
ACALL DISP
ACALL KS ;再次判别是否有键按下
JNZ K2 ;有键按下转移
AJMP KEY ;无按键,误读,继续查询按键
K2: MOV R3,#0FEH ;首列扫描字送R3
MOV R4,#00H ;首列号送R4
K3: MOV DPTR,#4401H ;PA口地址送DPTR,开始列扫描
MOV A,R3
MOVX @DPTR,A ;列扫描字送PA口
INC DPTR ;指向PC口
INC DPTR
MOVX A,@DPTR ;读取行扫描值
JB ACC.0,L1 ;第0行无键按下,转查第1行
MOV A,#00H ;第0行有键按下,行首键号送A
AJMP LK ;转求键号
L1: JB ACC.1,L2 ;第1行无键按下,转查第2行
MOV A,#08H ;第1行有键按下,行首键号送A
AJMP LK ;转求键号
L2: JB ACC.2,L3 ;第2行无键按下,转查第3行
MOV A,#10H ;第2行有键按下,行首键号送A
AJMP LK ;转求键号
L3: JB ACC.3,NEXT ;第3行无键按下,转查下一列
MOV A,#18H ;第3行有键按下,行首键号送A
AJMP LK
LK: ADD A,R4 ;形成键码送A
PUSH ACC ;键码入栈保护
K4: ACALL DISP
ACALL KS ;等待键释放
JNZ K4 ;未释放,等待
POP ACC ;键释放,弹栈送A
AJMP PR ;转键盘处理程序
NEXT: INC R4 ;修改列号
MOV A,R3
JNB ACC.3,KEY ;4列扫描完返回按键查询状态
RL A ;未扫描完,改为下列扫描字
MOV R3,A ;扫描字暂存R3
AJMP K3 ;转列扫描程序
;―――――――――――键盘处理程序―――――――――――――――
PR: CJNE A,#00H,PR01 ;不是KE0键码,转KE1键
AJMP KE0 ;转KE0键处理程序
PR01: CJNE A,#01H,PR02 ;不是KE1键码,转KE2键
AJMP KE1 ;转KE1键处理程序
PR02: CJ