微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机 汇编程序 44矩阵按键的中断控制。

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

时间:10-02 整理:3721RD 点击:
             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子程序都正常,就是不能复位开始数码管流水效果时,按下按键产生中断?

这是开始是8位数码管产生流水效果,直到按键中断型号产生后,44矩阵按键按下对应的0到F的键后显示出来的汇编程序。

这前写出了一个地方,
            ORG  13H
             JMP  KEY
把这里的KEY改成TIM0,
可是还不没有产生效果,如果把中断1口接到独立按键就会使流水灯效果暂停

你是不是中断没有开完,外部中断涉及到两个寄存器,TCON和IE,外部中断应该要开EA,EX1,IT1吧。

我开了MOV   IE, #84H     ;使能外部中断1
IT1复位不是0电平使用低电平触发吗?难道这个要用边沿触发才行?

电平触发方式是按照电平的高或者低来触发,所以用的时候,必须在发生触发事件后立即将电平拉到非触发电平上,如果不这样做的话,会导致程序一直在触发事件程序入口处,而不会执行其他地方的程序

你做的是不是相当于这个,按下按键显示按键上的数。


恩,差不多,我已经解决了,是在中断触发前我没把矩阵接口低位置低电平。我又改成边沿触发,效果达成了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top