ORG 0000H
AJMP MAIN
MAIN:
DISPLAY:LCALL KEY; 调用键盘扫描
MOV DPTR,#TAB;
MOVC A,@A+DPTR
MOV SBUF,A; 通过串口显示
AJMP DISPLAY;
KEY: LCALL KSF; 调用按键检测
JNZ K1; ACC不为零,则跳转;即表示有键按下
LCALL DELAY; 无键按下重新扫描
LJMP KEY;
K1: LCALL DELAY; 两次延时去抖动
LCALL DELAY;
LCALL KSF; 再次调用按键扫描
JNZ K2; 再次确认是否真有按键按下。有按键按下,转K2
LCALL KEY;
K2: MOV R2,#0EFH; R2存入扫描值
MOV R1,#00H; 列值
MOV P1,R2; 将第一行赋为低,检查第一行有无按键按下
L1: JB P1.0,L2; 第一列为高,表示无按键按下,转L2
MOV A,#00H; 有按键按下,将相应的键值存放到ACC中
AJMP L;
L2: JB P1.1,L3; 第二列为高,表示无按键按下,转L3
MOV A,#04H;
AJMP L;
L3: JB P1.2,L4; 第三列为高,表示无按键按下,转L4
MOV A,#08H;
AJMP L;
L4: JB P1.3,LN; 第四列为高,表示无按键按下,转LN
MOV A,#0CH;
AJMP L;
LN: MOV A,R2; 如:第一行全扫描完后,无按键按下,则判断第二行;
RL A; 需将第二行赋为低来检查第二行有无按键按下
MOV R2,ACC;
MOV P1,R2;
INC R1; 同时要将行值加1
CJNE R2,#0FEH,L1; 比较是否4行都已扫描完。
L: ADD A,R1; 将行值与列值相加
PUSH ACC
K: LCALL DELAY; 检查按键是否松开
LCALL KSF;
JNZ K;
POP ACC;
RET;
KSF: MOV P1,#0FH; 将第四位置为高电平
MOV A,P1; 读P1口的电平值
XRL A,#0FH; 异或后判断是否有键按下
RET
DELAY: MOV R3,#01H;
LL: MOV R4,#0AH;
LLL: DJNZ R4,LLL;
DJNZ R3,LL;
RET;
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,84H
END
文章评论(0条评论)
登录后参与讨论