⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 键盘.asm

📁 开发平台,任一MCS-51单片机上,很多程序,如键盘,显示,液晶驱动
💻 ASM
字号:
键盘子程序
;;;;;;;;;;;;;;;;;;;;;

INPUT_DATE EQU P1.2
INPUT_CLOCK EQU P1.3
CHECK_1 EQU P1.4
CHECK_2 EQU P3.3
DATE_6 EQU 55H  ;替换R6
DATE_7 EQU 56H  ;替换R7 
;使用到寄存器R0,R1 作为间接寻址



ORG 0013H ;中断1的调用
LJMP LOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:

               MOV R1,#09H ;
PACE:          CLR INPUT_DATE  ;初始化74LS164使它的Q0~Q7电位为0
               CLR INPUT_CLOCK
               SETB INPUT_CLOCK
               DJNZ R1,PACE
               CLR RS1 ;选择工作寄存器组
               CLR RS0
               SETB IT1 ;设置为中断1为跳沿触发
               SETB EA  ;打开总中断开关
               SETB EX1 ;打开中断1
               CLR  EX0
               CLR  ET0
               CLR  ET1
               MOV SP,#60H
              SJMP START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP1: CLR EX1                                   ;关闭中断
       MOV R0,#30H  ;初始化R0  
       SETB CHECK_2 ;;为CHECK_2输入数据做准备
       LCALL WAIT                               ;延时消抖
       JB CHECK_2,STATION1                       ;判断是否按下键

       MOV R1,#09H
PACE5: SETB INPUT_DATE                          ;初始化74LS164使它的Q0~Q7电位为1
       CLR INPUT_CLOCK
       SETB INPUT_CLOCK
       DJNZ R1,PACE5

      CLR A                                          ;清零的目的是用A做计数
      SETB CHECK_2   ;;为CHECK_2输入数据做准备
      CLR INPUT_DATE
      CLR INPUT_CLOCK
      SETB INPUT_CLOCK
      INC A
      JNB CHECK_2,LOOP2                                         ;;;;;;;;;;;;JNB CHECK_2,LOOP2;;;;;;;;;;;;;;;
      SETB CHECK_2   ;;为CHECK_2输入数据做准备
LOOP3:SETB INPUT_DATE
      CLR INPUT_CLOCK
      SETB INPUT_CLOCK
      INC A
      SETB CHECK_2   ;;为CHECK_2输入数据做准备
      JNB CHECK_2,LOOP2
      SJMP LOOP3

LOOP2:    MOV DATE_6,A                        ;使用到DATE_6寄存器
          XRL A,#08H   ;功能键识别区
          JZ  KEY14
          MOV A,DATE_6                  
          XRL A,#01H  ;功能区键识别按下的是数字键
          JZ STATION1
          MOV A,DATE_6
          XRL A,#02H   ;功能区键识别按下的是数字键
          JZ STATION1
         ;;;;;;;;;;;;;;;;;;;;;;;;;;;
           MOV A,DATE_6     ;此区跳往查表区
          XRL A,#03H
          JZ  X1   ;跳往POCESS处理
           MOV A,DATE_6
          XRL A,#04H
          JZ  X2

          MOV A,DATE_6
          XRL A,#05H
          JZ X3
          
          MOV A,DATE_6
          XRL A,#06H
           JZ X4
          
           MOV A,DATE_6
           XRL A,#07H
           JZ X5
     
STATION1: 
               MOV R1,#09H 
PACE_1:        CLR INPUT_DATE  ;初始化74LS164使它的Q0~Q7电位为0
               CLR INPUT_CLOCK
               SETB INPUT_CLOCK
               DJNZ R1,PACE_1  
               RETI         ;返回中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


      X1: 
           RETI
      X2:
           RETI                                   ;功能键区查表
      X3: 
           RETI
      X4:
           RETI
      X5: 
           RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY14: SETB CHECK_2     ;;为CHECK_2输入数据做准备
       JNB CHECK_2,KEY14 ;防止按下数据输入键不放
       ;LJMP SPEAKE   ;;;;;;//////////////////// 
      

KEY0:
                      ;此区为输录数字区
        MOV R1,#09H
        SETB CHECK_1
        SETB CHECK_2

PACE1:  CLR INPUT_DATE  ;初始化74LS164使它的Q0~Q7电位为0
        CLR INPUT_CLOCK
        SETB INPUT_CLOCK
        DJNZ R1,PACE1

KEY1:   SETB CHECK_1  ;;为CHECK_1输入数据做准备
        SETB CHECK_2;;为CHECK_2输入数据做准备
        JNB CHECK_1,KEY2  ;判断键区
        JNB CHECK_2,KEY8  ;判断键区
        SJMP KEY1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY2:  LCALL WAIT   ;延时消抖
       SETB CHECK_1   ;为CHECK_1输入数据做准备
       JB CHECK_1,KEY1 ;;;;;;;;;;;;;;;;;;;;;;;;;;
       ;LJMP SPEAKL  ;;;;;;;;;;///////////////////////////
       MOV R1,#09H

PACE2: SETB INPUT_DATE  ;该区使74LS164使它的Q0~Q7电位为1
       CLR INPUT_CLOCK
       SETB INPUT_CLOCK
       DJNZ R1,PACE2

KEY3: CLR  A         ;数字键区扫描
      SETB CHECK_1
      CLR INPUT_DATE
      CLR INPUT_CLOCK
      SETB INPUT_CLOCK
      SETB CHECK_1   ;为CHECK_1输入数据做准备
      JNB CHECK_1,KEY17 ;跳往KEY17数字处理区(如果此时CHECK_1为0则A里的数为0)



      CLR A
KEY4: SETB INPUT_DATE
      CLR INPUT_CLOCK
      SETB INPUT_CLOCK
      INC  A
      SETB CHECK_1  ;为CHECK_1输入数据做准备
      JNB CHECK_1,KEY17 ;跳往KEY17数字处理区
      JB CHECK_1,KEY4

KEY17: SETB CHECK_1  ;为CHECK_1输入数据做准备
       JNB CHECK_1,KEY17  ;防止手按在按键未放开
       JB CHECK_1,KEY7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY8:  SETB CHECK_2 ;为CHECK_2输入数据做准备
        LCALL WAIT
       JB CHECK_2,KEY1 ;;;;;;;;;;;;;;;;;;;;;;;

       MOV R1,#09H

PACE3: SETB INPUT_DATE  ;该区使74LS164使它的Q0~Q7电位为1
       CLR INPUT_CLOCK
       SETB INPUT_CLOCK
       DJNZ R1,PACE3

KEY9: MOV A,#08H      ;功能键区数字键扫描
      SETB CHECK_2
      CLR INPUT_DATE
      CLR INPUT_CLOCK
      SETB INPUT_CLOCK
      SETB CHECK_2 ;为CHECK_2输入数据做准备
      JNB CHECK_2,KEY18   ;跳往KEY18按键处理区(如果此时CHECK_2为0则A里的数为0)

      SETB INPUT_DATE
      CLR INPUT_CLOCK
      SETB INPUT_CLOCK
      INC A
      SETB CHECK_2 ;为CHECK_2输入数据做准备
      JNB CHECK_2,KEY18

KEY20: SETB INPUT_DATE
       CLR INPUT_CLOCK
       SETB INPUT_CLOCK
       INC A
       SETB CHECK_2  ;为CHECK_2输入数据做准备
       JNB CHECK_2,SAMSUNG
       JB CHECK_2,KEY20

KEY21:  LJMP KEY0     ;防止按下功能键区不是数字键

KEY18: SETB CHECK_2  ;为CHECK_2输入数据做准备
       JNB CHECK_2,KEY18 ;防止手按在按键未放开
       JB CHECK_2,KEY7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SAMSUNG: SETB CHECK_2   ;为CHECK_2输入数据做准备
         JNB CHECK_2,SAMSUNG ;防止手按在按键未放开
         JB CHECK_2,SAMSUNG10

SAMSUNG10:XRL A,#0FH    ;判断停止输入数据;
          JZ  KEY13   ;判断停止输入数据;
          JNZ  KEY21    ;判断停止输入数据;

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY7:  CLR IE1    ;软件清除中断1请求标志位 (保险)

      MOV @R0,A  ;此时@R0里的数据就是所按的数字键代表的数字
      INC R0     ;使R0指向下一字节
      ;LCALL LCM ;调用显示
      MOV A,R0
      XRL A,#38H  ;防止益处///////////////
      JZ  KEY13
      LJMP KEY0

KEY13: CLR IE1    ;软件清除中断1请求标志位 (保险)
       MOV R1,#040H

       MOV A,R0
       
KEY16: DEC R0
       MOV A,@R0 ;倒序存放数据区
       MOV @R1,A
       INC R1
       CJNE R0,#030H, KEY16

               MOV R1,#09H 
PACE_2:        CLR INPUT_DATE  ;初始化74LS164使它的Q0~Q7电位为0
               CLR INPUT_CLOCK
               SETB INPUT_CLOCK
               DJNZ R1,PACE_2  
       
          RETI   ;返回中断
;;;;;;;;;;;;;;;;;;;;;;;
WAIT: MOV DATE_7,#142     ;延时子程序 (35.074ms)
WAIT1: MOV DATE_6,#122
WAIT2:DJNZ DATE_6,WAIT2
DJNZ DATE_7,WAIT1
RET
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -