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

📄 5io15key.asm

📁 使用5个IO口来扩展15个按键
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;塔式键盘,用5个IO,扩展15个按键,先扫描最右侧5个按键发0FFH,如无键按下再扫描其余十个按键
;;分别发0FEH,右移5次,建立一个特征值表TAB,用扫描到的特征值与表比较,比较次数即为对应按键
;;查表送P0显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY         EQU      40H                  ;键值               
N           EQU      41H                  ;5列,扫描5次
SIGN        EQU      42H                  ;扫描信号,初始值为0FEH即11111110
            ORG      0000H
            LJMP     MAIN
            ORG      0030H
MAIN:
            MOV      SP,#50H
            MOV      N,#05H               ;5列,左移5次
            MOV      SIGN,#0FEH           ;从P2.0开始扫描
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;========================发全1判断接地5键是否按下=========================;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCANKEY:               
            MOV      P2,#0FFH             ;扫描最右侧5个按键发11111111
            MOV      A,P2                 ;读P2状态                                    
            CJNE     A,#0FFH,KEY2         ;有键按下跳KEY3
            LJMP     KEY3                 ;无键按下扫描其他10个按键
KEY2:
            LCALL    DELAY                ;去抖         
            MOV      P2,#0FFH
            MOV      A,P2
            MOV      R3,A                 ;特征值暂存R3
            MOV      R2,#00H              ;比较次数赋初值
            CJNE     A,#0FFH,SCANNEXT     ;再次扫描有键按下则比较
            LJMP     KEY3                 ;无键按下扫描其他10个按键               
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;===========再判断其余10按键是否按下,分别置其中一列为0其余为1============;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY3:                                                     
            MOV      A,SIGN               ;先判断其余10键是否按下,如有按下先消抖
            MOV      P2,A
            MOV      A,P2                    
            CJNE     A,SIGN,KEY4            
            LJMP     KEY5
KEY4:     
            LCALL    DELAY                ;去抖
            MOV      A,SIGN                  ;发送扫描信号
            MOV      P2,A
            MOV      A,P2                 ;读P2状态
            MOV      R3,A                 ;特征值暂存R3 
            MOV      R2,#00H              ;比较次数赋初值              
            CJNE     A,SIGN,SCANNEXT      ;再次扫描有键按下则比较         
KEY5:            
            MOV      A,SIGN
            RL       A
            MOV      SIGN,A               ;扫描下一列
            DJNZ     N,KEY3               ;扫描5列              
            LJMP     MAIN                 ;扫描完毕进行下一轮扫描                                                
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;==========================用所得键值与TAB表比较==========================;;
;;===========================比较次数即为特征值============================;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCANNEXT:   
            MOV      A,R2
            MOV      DPTR,#TAB            ;查表逐个比较
            MOVC     A,@A+DPTR
            MOV      KEY,A                ;表中的内容暂存在KEY
            MOV      A,R3
            CJNE     A,KEY,KEY1           ;不相等则继续查找
            LJMP     DISPLAY  
KEY1:       
            INC      R2                   
            LJMP     SCANNEXT
DISPLAY:    MOV      A,R2
            MOV      DPTR,#DISCODE
            MOVC     A,@A+DPTR
            MOV      P0,A
            LJMP     MAIN
DELAY:
            MOV      R6,#2
   D01:     MOV      R5,#25
            NOP
   D02:     DJNZ     R5,D02
            DJNZ     R6,D01
            RET
            
TAB:
            DB  0FEH     ;1  11111110
            DB  0FCH     ;2  11111100
            DB  0FDH     ;3  11111101
            DB  0FAH     ;4  11111010 
            DB  0F9H     ;5  11111001
            DB  0FBH     ;6  11111011
            DB  0F6H     ;7  11110110
            DB  0F5H     ;8  11110101
            DB  0F3H     ;9  11110011
            DB  0F7H     ;A  11110111
            DB  0EEH     ;B  11101110
            DB  0EDH     ;C  11101101
            DB  0EBH     ;D  11101011
            DB  0E7H     ;E  11100111
            DB  0EFH     ;F  11101111
DISCODE:     
            DB  03FH     ;0
            DB  006H     ;1
            DB  05BH     ;2
            DB  04FH     ;3
            DB  066H     ;4
            DB  06DH     ;5
            DB  07DH     ;6
            DB  007H     ;7
            DB  07FH     ;8
            DB  06FH     ;9     
            DB  077H     ;A
            DB  07CH     ;B
            DB  039H     ;C
            DB  05EH     ;D
            DB  079H     ;E
            DB  071H     ;F
            END

⌨️ 快捷键说明

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