51单片机 汇编程序 44矩阵按键的中断控制。

2019-07-16 02:31发布

             ORG  00H
             MOV  R3, #0
             JMP  START
             ORG  13H
             JMP  KEY
             ORG  23H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
    CORD_H   EQU  30H
    CORD_L   EQU  31H
    CORD_HL  EQU  32H
    CORD_B   EQU  R3

       MOV   IE, #84H     ;使能外部中断1

       MOV   R0, #3FH
       MOV   R1, #00H
MAIN:
       CJNE  CORD_B, #1H, C1
       JMP   C2
   C1:
       CALL  initial_condition
       JMP   MAIN
   C2:         
       MOV   R1, #0EFH
       CALL  KEY
       CALL  DISPLAY
       JMP   MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
initial_condition:  
       MOV   DPTR, #LABTE0
   I1:
       CLR   A
       MOVC  A,@A+DPTR
       CJNE  A,#88H, I2
      
       RET

   I2:
       MOV   R0, A
       CALL  DISPLAY
       CALL  DELAY
       INC   DPTR
       JMP   I1
      
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
DISPLAY:                 /*显示按键对应信息*/
  WEI_LATCH:      
       MOV  P0, R1
       SETB P2.3
       CLR  P2.3
  DUAN_LATCH:
       MOV  P0, R0
       SETB P2.2
       CLR  P2.2
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY:
       MOV   P1, #0F0H
       MOV   A,  P1
       ANL   A,  #0F0H      
       CJNE  A,#0F0H,KEEPKEY       /*不相等说明有按键按下,*/
       RET
KEEPKEY:
       CALL  FILTER  
       MOV   P1, #0F0H      
       MOV   A,  P1         
       ANL   A,  #0F0H
       MOV   CORD_H, A      

       MOV   P1, #0FH
       MOV   A, P1
       ANL   A, #0FH
      
       ORL   A, CORD_H
       MOV   CORD_HL, A
         
SETKEY:                       /*判断按下按键是哪个对应的数字或字母*/
       MOV   DPTR, #LABTE1
       MOV   R2, #00H
  S1:           
       MOV   A, R2
       MOVC  A, @A+DPTR
       CJNE  A, CORD_HL, S2    /*CORD_HL能否用B代替?*/         /*将按键获得的代码,与表1中的代码对比,不相等跳入S2*/
       MOV   33H, R2
       JMP   S3                /*相等跳入S3去值*/
  S2:                         /*不相等时DPTR向下移1为,并计数*/
       INC   R2
       CJNE  A,#88H,S1
       RET                 
  S3:                          /*载入按键对应的值*/      
       MOV   DPTR, #LABTE2      
       MOV   A, R2                                    
       MOVC  A,@A+DPTR
       MOV   R0, A
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0:                            /*中断子程序*/
       MOV   CORD_B, #1
       POP   DPL
       POP   DPH
       MOV   DPTR, #0023H          /*返回从新的地址开始(START)*/
       PUSH  DPL
       PUSH  DPH
       RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FILTER:                  /*防抖动延迟*/
        MOV  R4, #60
    E1:
        MOV  R5, #248
        DJNZ R5, $
        DJNZ R4, E1
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:                     /*流水效果延迟*/
        MOV  R4, #5
    D1:
        MOV  R5, #60
    D2:
        MOV  R6, 248
        DJNZ R6,$
        DJNZ R5,D2
        DJNZ R4,D1
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LABTE1:                               ;按键扫描码
    DB  7EH, 0BEH, 0DEH, 0EEH
    DB  7DH, 0BDH, 0DDH, 0EDH
    DB  7BH, 0BBH, 0DBH, 0EBH
    DB  77H, 0B7H, 0D7H, 0E7H
    DB  88H
LABTE2:                                ;扫描后显示对应的数字和字母(段选)
    DB  3FH, 06H, 5BH, 4FH
    DB  66H, 6DH, 7DH, 07H
    DB  7FH, 6FH, 77H, 7CH
    DB  58H, 5EH, 79H, 71H
    DB  88H
LABTE0:                                   ;数码管流水效果
    DB  01H, 02H, 04H, 08H, 10H, 20H
    DB  88H
           END

————————————————————————————————
为什么initial_condition,KEY,DISPLAY子程序都正常,就是不能复位开始数码管流水效果时,按下按键产生中断????



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。