原创 4*4键盘扫描程序(汇编)

2008-9-11 17:21 2880 0 分类: MCU/ 嵌入式

 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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /1 下一条