📄 control.asm
字号:
;操作说明:上电后,默认的4个输出通道输出的都是1号输入信号
;不停的按动信号选择键,则相应的输出通道输出1号输入信号→2号输入信号→3号输入信号→4号输入信号→1号输入信号
;*******************************************************************************
;************************** 4路输入/输出型VGA切换程序 **************************
;*******************************************************************************
#INCLUDE "P16F628.INC"
IN_OUT_DDR EQU TRISB
IN_OUT_PORT EQU PORTB
RB0 EQU 0H
RB1 EQU 1H
RB2 EQU 2H
RB3 EQU 3H
RB4 EQU 4H
RB5 EQU 5H
RB6 EQU 6H
RB7 EQU 7H
RA0 EQU 0H
RA1 EQU 1H
RA2 EQU 2H
RA3 EQU 3H
RA4 EQU 4H
RA5 EQU 5H
RA6 EQU 6H
RA7 EQU 7H
;定义按键脚
KEY0 EQU RB7
KEY1 EQU RB6
KEY2 EQU RB5
KEY3 EQU RB4
;******************************************************************************
;定义信号输入/输出控制脚
IN_SEL0 EQU RB2
IN_SEL1 EQU RB3
OUT_SEL0 EQU RB0
OUT_SEL1 EQU RB1
;******************************************************************************
CONTROL_DDR EQU TRISA
CONTROL_PORT EQU PORTA
;定义数据锁存/写入脚
LATCH EQU RA1
WRITE EQU RA0
;******************************************************************************
;定义按键去抖动延迟时间
TIMER15S1 EQU 30H
TIMER15S2 EQU 31H
TIMER15S3 EQU 32H
TIMER15S4 EQU 33H
;******************************************************************************
;定义各按键轮流次序寄存器
out_reg0 EQU 34H
out_reg1 EQU 35H
out_reg2 EQU 36H
out_reg3 EQU 37H
;******************************************************************************
;定义要操作的输入/输出通道号
in_numble EQU 38H
out_numble EQU 39H
;******************************************************************************
ORG 0H ;复位入口
GOTO MAIN
;******************************************************************************
;中断子程序
;65ms中断,里面设置了4个以65ms为单位的按键去抖动时间
;******************************************************************************
ORG 4H ;中断入口
BTFSS INTCON,T0IF ;
RETFIE ;
BCF INTCON,T0IF ;
INCF TIMER15S1,F ;
INCF TIMER15S2,F ;
INCF TIMER15S3,F ;
INCF TIMER15S4,F ;
RETFIE
;******************************************************************************
;操作子程序
;入口in_numble:选择的输入信号通道号,从0到3代表1到4号输入通道号。
;入口out_numble:选择从哪个通道输出,从0到3代表1到4号输出通道号。
;出口:无
;******************************************************************************
SEL_INX_OUTY:
CLRWDT ;
CHECK_IN0:
MOVLW 0H ;
XORWF in_numble,W ;检测是否选择了1号输入通道
BTFSS STATUS,Z ;
GOTO CHECK_IN1
BCF IN_OUT_PORT,IN_SEL0
BCF IN_OUT_PORT,IN_SEL1
GOTO CHECK_OUT0 ;
CHECK_IN1:
MOVLW 1H ;
XORWF in_numble,W ;检测是否选择了2号输入通道
BTFSS STATUS,Z ;
GOTO CHECK_IN2
BSF IN_OUT_PORT,IN_SEL0
BCF IN_OUT_PORT,IN_SEL1
GOTO CHECK_OUT0 ;
CHECK_IN2:
MOVLW 2H ;
XORWF in_numble,W ;检测是否选择了3号输入通道
BTFSS STATUS,Z ;
GOTO CHECK_IN3
BCF IN_OUT_PORT,IN_SEL0
BSF IN_OUT_PORT,IN_SEL1
GOTO CHECK_OUT0 ;
CHECK_IN3:
MOVLW 3H ;
XORWF in_numble,W ;检测是否选择了4号输入通道
BTFSS STATUS,Z ;
RETURN ;
BSF IN_OUT_PORT,IN_SEL0
BSF IN_OUT_PORT,IN_SEL1
GOTO CHECK_OUT0 ;
CHECK_OUT0:
MOVLW 0H ;
XORWF out_numble,W ;检测是否选择了1号输出通道
BTFSS STATUS,Z ;
GOTO CHECK_OUT1 ;
BCF IN_OUT_PORT,OUT_SEL0
BCF IN_OUT_PORT,OUT_SEL1
GOTO SEND_DATA ;
CHECK_OUT1:
MOVLW 1H ;
XORWF out_numble,W ;检测是否选择了2号输出通道
BTFSS STATUS,Z ;
GOTO CHECK_OUT2 ;
BSF IN_OUT_PORT,OUT_SEL0
BCF IN_OUT_PORT,OUT_SEL1
GOTO SEND_DATA ;
CHECK_OUT2:
MOVLW 2H ;
XORWF out_numble,W ;检测是否选择了3号输出通道
BTFSS STATUS,Z ;
GOTO CHECK_OUT3 ;
BCF IN_OUT_PORT,OUT_SEL0
BSF IN_OUT_PORT,OUT_SEL1
GOTO SEND_DATA ;
CHECK_OUT3:
MOVLW 3H ;
XORWF out_numble,W ;检测是否选择了4号输出通道
BTFSS STATUS,Z ;
RETURN ;
BSF IN_OUT_PORT,OUT_SEL0
BSF IN_OUT_PORT,OUT_SEL1
GOTO SEND_DATA ;
SEND_DATA: ;写入数据
BCF CONTROL_PORT,WRITE
NOP
NOP
BSF CONTROL_PORT,WRITE
NOP
NOP
BCF CONTROL_PORT,WRITE
NOP
NOP
;锁存数据
BCF CONTROL_PORT,LATCH
NOP
NOP
BSF CONTROL_PORT,LATCH
NOP
NOP
BCF CONTROL_PORT,LATCH
NOP
NOP
RETURN
;******************************************************************************
;初始化子程序
;入口:无
;出口:无
;功能:初始化IO,并让所有的输出通道选择1号输入信号
;******************************************************************************
INIT_PORT:
BSF STATUS,RP0 ;
MOVLW 7H
MOVWF OPTION_REG ;使能RB口的弱上拉功能,并使定时器0有1:256的前分频器
MOVLW 0FCH
MOVWF CONTROL_DDR ;设置LATCH/WRITE为输出,其余为输入
MOVLW 0F0H
MOVWF IN_OUT_DDR ;设置KEY0-KEY3为输入,其余为输出
BCF STATUS,RP0 ;
CLRF CONTROL_PORT
CLRF IN_OUT_PORT ;
MOVLW 0H
MOVWF in_numble ;
MOVLW 0H ;1号输出通道输出1号输入信号
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
MOVLW 0H
MOVWF in_numble ;
MOVLW 1H ;2号输出通道输出1号输入信号
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
MOVLW 0H
MOVWF in_numble ;
MOVLW 2H ;3号输出通道输出1号输入信号
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
MOVLW 0H
MOVWF in_numble ;
MOVLW 3H ;4号输出通道输出1号输入信号
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
RETURN
;******************************************************************************
;主程序
;功能:完成4个按键的状态查询,并根据按键的状态进行切换选择输入信号
;******************************************************************************
MAIN:
CALL INIT_PORT ;初始化IO
BSF INTCON,T0IE ;允许定时器0中断
BSF INTCON,GIE ;打开全局中断
LOOP:
CLRWDT ;
CHECK_KEY0: ;检测按键1
BTFSC IN_OUT_PORT,KEY0
GOTO CLR_TIME0 ;
MOVLW 3H ;去抖动
SUBWF TIMER15S1,W ;
BTFSS STATUS,C ;
GOTO CHECK_KEY1 ;
MOVLW 4H ;检测按键是否循环了4次
SUBWF out_reg0,W ;
BTFSC STATUS,C ;
CLRF out_reg0 ;
MOVF out_reg0,W ;选择相应的输入信号给1号输出通道
MOVWF in_numble ;
MOVLW 0H
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
INCF out_reg0,F ;
WAIT0:
CLRWDT ;
BTFSS IN_OUT_PORT,KEY0
GOTO WAIT0 ;检测按键有无松开
CLR_TIME0:
CLRF TIMER15S1 ;
GOTO CHECK_KEY1
;******************************************************************************
CHECK_KEY1: ;检测按键2
BTFSC IN_OUT_PORT,KEY1
GOTO CLR_TIME1 ;
MOVLW 3H ;去抖动
SUBWF TIMER15S2,W ;
BTFSS STATUS,C ;
GOTO CHECK_KEY2 ;
MOVLW 4H ;检测按键是否循环了4次
SUBWF out_reg1,W ;
BTFSC STATUS,C ;
CLRF out_reg1 ;
MOVF out_reg1,W ;选择相应的输入信号给2号输出通道
MOVWF in_numble ;
MOVLW 1H
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
INCF out_reg1,F ;
WAIT1:
CLRWDT ;
BTFSS IN_OUT_PORT,KEY1
GOTO WAIT1 ;检测按键有无松开
CLR_TIME1:
CLRF TIMER15S2 ;
GOTO CHECK_KEY2
;******************************************************************************
CHECK_KEY2: ;检测按键3
BTFSC IN_OUT_PORT,KEY2
GOTO CLR_TIME2 ;
MOVLW 3H ;去抖动
SUBWF TIMER15S3,W ;
BTFSS STATUS,C ;
GOTO CHECK_KEY3 ;
MOVLW 4H ;检测按键是否循环了4次
SUBWF out_reg2,W ;
BTFSC STATUS,C ;
CLRF out_reg2 ;
MOVF out_reg2,W ;选择相应的输入信号给3号输出通道
MOVWF in_numble ;
MOVLW 2H
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
INCF out_reg2,F ;
WAIT2:
CLRWDT ;
BTFSS IN_OUT_PORT,KEY2
GOTO WAIT2 ;检测按键有无松开
CLR_TIME2:
CLRF TIMER15S3 ;
GOTO CHECK_KEY3
;******************************************************************************
CHECK_KEY3: ;检测按键4
BTFSC IN_OUT_PORT,KEY3
GOTO CLR_TIME3 ;
MOVLW 3H ;去抖动
SUBWF TIMER15S4,W ;
BTFSS STATUS,C ;
GOTO LOOP ;
MOVLW 4H ;检测按键是否循环了4次
SUBWF out_reg3,W ;
BTFSC STATUS,C ;
CLRF out_reg3 ;
MOVF out_reg3,W ;选择相应的输入信号给4号输出通道
MOVWF in_numble ;
MOVLW 3H
MOVWF out_numble ;
CALL SEL_INX_OUTY ;
INCF out_reg3,F ;
WAIT3:
CLRWDT ;
BTFSS IN_OUT_PORT,KEY3
GOTO WAIT3 ;检测按键有无松开
CLR_TIME3:
CLRF TIMER15S4 ;
GOTO LOOP ;循环
;******************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -