4*4矩阵键盘的设计

本次设计是利用单片机技术,采用利用键盘产生中断的思想,利用中断查询的方法,用汇编语言设计了一个4×4的键盘模块,键盘有值0--F时产生中断,用数码管显示相应的按键值。

 汇编程序如下:

 

 

 

 

 

 

;*********************************************************
;      0               1               2              3----P1^0 
;      4               5               6              7----P1^1 输
;      8               9               A              B----P1^2 入
;      C               D              E               F----P1^3 
;      |                |               |               |
;   P1^4        P1^5         P1^6        P1^7    输出
;*********************************************************
    ORG  0000H    
    LJMP  MAIN
    ORG  0003H
    AJMP  INT
    ORG   0030H 

MAIN:   MOV     P0,#0FFH;    程序启动时灯灭
     MOV      P1,#0F0H
     SETB     TCON.0;       外部中断为下降沿触发
     MOV      IE,#81H;     外部中断开中断 


     SJMP    $

 

 

INT: CLR      EA        ;进入中断服务程序
       PUSH    PSW
       LCALL   DELAY
       LCALL   KS
       JNZ       SAOMIAO
       LJMP     INT0R

SAOMIAO:MOV  DPTR,#TAB;
      ACALL    K1;       调用键盘扫描程序
      MOVC     A,@A+DPTR; 查表后将值送入累加器
      MOV      P0,A;  在P0口显示键盘值

K1: MOV      R2,#0EFH; 将扫描值送入 R2暂存
      MOV      R4,#00H; R4用于存放列值,并将00H暂存
K3:   MOV    P1,R2; 

L6:  JB         P1^0,L1; P1^0等于1跳转到L1
      MOV       A,#00H;  将第一行的行值00H送入ACC
      AJMP      LK;  跳转到键值处理程序
L1:  JB          P1^1,L2; P1.1等于1跳转到L2
      MOV       A,#04H;  将第二行的行值送入ACC
      AJMP      LK;  跳转到键值理程序进行键值处理
L2:  JB         P1^2,L3; P1.2等于1跳转到L3
      MOV       A,#08H;  将第三行的行值送入ACC
      AJMP       LK;  跳转到键值处理程序
L3:  JB         P1^3,NEXT ; P1.3等于1跳转到NEXT处
      MOV      A,#0cH;  将第四行的行值送入ACC
LK:   ADD     A,R4;  行值与列值相加后的键值送入A
    PUSH     ACC;  将A中的值送入堆栈暂存
K4:   LCALL  DELAY;  调用延时去抖动程序
      LCALL   KS;  调用按键检测程序
      JNZ       K4;  按键没有松开继续返回检测
      POP      ACC;  将堆栈的值送入ACC
RET
 
NEXT:
     INC      R4;  将列值加一
     MOV     A,R2;  
     JNB      ACC.7,INT0R; 未扫描出键值退出中断
     RL        A;  扫描未完成将A中的值右移一位进行下一列的扫描
     MOV    R2,A;  将ACC的值送入R2暂存
     AJMP    K3;  跳转到K3继续

KS:  MOV   P1,#0FH; 将P1口高四位置0低四位置1
      MOV    A,P1;  读P1口
      XRL     A,#0FH;  将A中的值与0FH相异或
RET   
 
DELAY:                 ;    10ms延时去抖动子程序2*FA*2=10ms
     MOV      R5,#02H
  L7:  MOV  R6,#0FAH
 L8:  DJNZ  R6,L8
        DJNZ  R5,L7
RET

 

INT0R: POP PSW
     MOV      P1,#0F0H
     SETB     TCON.0;  外部中断为下降沿触发
     MOV      IE,#81H; 外部中断开中断 
RETI

 

TAB:        ;  采用共阳极LED显示器
        DB        0C0H;0
        DB        0F9H;1
        DB        0A4H;2
        DB        0B0H;3
        DB        099H;4
        DB        092H;5
        DB        082H;6
        DB        0F8H;7
        DB        080H;8
        DB        090H;9
        DB        088H;A
        DB        083H;b
        DB        0C6H;C
        DB        0A1H;d
        DB        086H;E
        DB        08EH;F
END

 

 

 

 

 

 

以上便是自己设计的4*4矩阵键盘的中断设计的服务程序,52系列的单片机的P1口作为键盘的扫描与输入口,P0作为数码显示的输出口,汇编程序的精华在扫描键盘值时,采用的是行值和列值相加的方式确定键值,键盘的程序设计应不断地提醒自己有消抖的过程,即程序的延时过程!

 

现因CSDN无法上传图片,不能上传我处理的Protel电路图以及Ptoteus的仿真图。

你可能感兴趣的:(单片机的学习)