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

📄 control.asm

📁 VGA视频切换矩阵源玛,采用PIC单片机16F628实现8*8的视频切换.
💻 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 + -