📄 rowscan.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 + -