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

📄 rowscan.asm

📁 PIC单片机的汇编源码合集,应用比较广泛,设计程序时可做子程序来用
💻 ASM
字号:
;********************ROWSCAN********************
;本程序N*N矩阵键盘的扫描,并读取键值。
;入口参数:键的行数在SOU中,列数在SOUH中。
;出口参数: 键值在SOU中,如果没有键按下,则SOU返回0FFH。
;占用资源:W,STATUS,RD,RC,023H,024H,025H,028H,029H,1重堆栈。
;说    明:1.键值的格式为SOU高4位存放行值,低4为存放列值。
;          2.最多能扩展8*8键。
;          3.多键同时按下时,只能相应其中的一个键。
                        
            #DEFINE   ROW     PORTC   ;行扫描线
            #DEFINE   CLUMN   PORTD   ;列输入线
            #DEFINE   ROWT    TRISC   ;行扫描线口属性寄存器
            #DEFINE   CLUMNT  TRISD   ;列输入线口属性寄存器

           IFNDEF       ROWSCAN1
            #DEFINE     ROWSCAN1
            INCLUDE     "DLYNMS.ASM"


ROWSCAN     MOVLW       0FFH
            MOVWF       TEMP1       ;TEMP1暂存TRISC的掩码
            MOVF        SOU,W
            MOVWF       CNT         ;键的行数            
LOOP105     BCF         STATUS,C
            RLF         TEMP1,F
            DECFSZ      CNT,F
            GOTO        LOOP105
            MOVF        TEMP1,W
            BSF         STATUS,RP0
            ANDWF       ROWT,F      ;行线输出,未用到的口保持原状态
            BCF         STATUS,RP0

            CLRF        TEMP2       ;TEMP2暂存TRISD的掩码
            MOVF        SOUH,W      
            MOVWF       CNT         ;键的列数            
LOOP106     BSF         STATUS,C
            RLF         TEMP2,F
            DECFSZ      CNT,F
            GOTO        LOOP106
            MOVF        TEMP2,W
            BSF         STATUS,RP0
            IORWF       CLUMNT,F
            BCF         STATUS,RP0  ;设定列线的输入属性,方法同前
           
            MOVF        ROW,W
            ANDWF       TEMP1,W     ;所有的行线置0
            MOVWF       ROW
            MOVF        CLUMN,W
            ANDWF       TEMP2,W     ;屏蔽未用到的位
            XORWF       TEMP2,W     
            BTFSC       STATUS,Z    ;有按键吗?
            GOTO        DONE26      ;没有按键,返回
            CLRF        TEMP2       
            BSF         STATUS,C    ;列值TEMP2赋初值01H
LOOP107     RLF         TEMP2,F
            MOVF        CLUMN,W
            ANDWF       TEMP2,W
            BTFSC       STATUS,Z
            GOTO        ROWVALUE    ;查询到某一列是低电平,开始扫描行
            BCF         STATUS,C
            DECFSZ      SOUH,F
            GOTO        LOOP107     ;扫描下一列
            GOTO        DONE26
ROWVALUE    MOVF        SOU,W
            MOVWF       TEMP1       ;保护SOU
            MOVLW       .10
            MOVWF       SOU
            CALL        DLYNMS      ;延时10MS,消抖
            MOVF        CLUMN,W
            ANDWF       TEMP2,W
            BTFSS       STATUS,Z    ;判断列线上的低电平是否已经消失
            GOTO        DONE26      ;无效的按键
            CLRF        TEMP1
            BSF         STATUS,C    ;行值TEMP1赋初值01H
LOOP108     RLF         TEMP1,F            
            MOVF        TEMP1,W
            IORWF       ROW,F       ;将行线逐行置1
            MOVF        CLUMN,W
            ANDWF       TEMP2,W
            BTFSS       STATUS,Z
            GOTO        DONE25      ;得到行值
            BCF         STATUS,C
            DECFSZ      SOU,F
            GOTO        LOOP108
            GOTO        DONE26
DONE25      MOVF        TEMP2,W
            MOVWF       CNT         ;暂存列值
            MOVF        TEMP1,W
            MOVWF       SOUH        ;暂存行值
            CLRF        SOU         ;计算列值存放于SOU(3:0)         
LOOP109     RRF         TEMP2,F
            BTFSC       STATUS,C
            GOTO        NEXT67      ;列值计算完毕
            BCF         STATUS,C
            INCF        SOU,F
            GOTO        LOOP109
NEXT67      MOVLW       10H         ;计算行值存放于SOU(7:4)
LOOP110     RRF         TEMP1,F
            BTFSC       STATUS,C
            GOTO        DONE27      ;行值计算完毕,返回
            BCF         STATUS,C
            ADDWF       SOU,F
            GOTO        LOOP110
DONE26      MOVLW       0FFH
            MOVWF       SOU
            RETURN                  ;无键值返回
DONE27      COMF        SOUH,W
            ANDWF       ROW,F       ;行线置0    
LOOP111     MOVF        CLUMN,W
            ANDWF       CNT,W
            BTFSC       STATUS,Z    ;判断列线上的低电平是否已经消失
            GOTO        LOOP111                                    
            MOVF        SOU,W       ;键已松开,消抖并返回
            MOVWF       TEMP1
            MOVLW       .10
            MOVWF       SOU
            CALL        DLYNMS      ;延时,等待键松开
            MOVF        TEMP1,W
            MOVWF       SOU
            RETURN                  ;带键值返回
           ENDIF


 

⌨️ 快捷键说明

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