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

📄 1_5.asm

📁 实现简单的I/O扩展
💻 ASM
字号:
;------------------------------------------
;文件名"1_5.ASM"
;作者:求是科技
;功能:实现了简单的I/O扩展
;------------------------------------------
STATUS		EQU		03H			;定义状态寄存器地址
PORTA		EQU		05H			;定义端口A的数据寄存器地址
TRISA		EQU		85H			;定义端口A的方向寄存器
PORTB		EQU		06H			;定义端口B的数据寄存器地址
TRISB		EQU		86H			;定义端口B的方向寄存器

RP1			EQU		06H			;定义状态寄存器中的页选位RP1
RP0			EQU		05H			;定义状态寄存器中的页选位RP0

STATUS_IN	EQU		30H			;存放输入的状态值

DATA1		EQU		20H			;定义外循环变量
DATA2		EQU		21H			;定义内循环变量
TEMP		EQU		22H			;定义临时变量存储端口D的输入
COUNT1		EQU		130			;定义存储外循环次数的变量
COUNT2		EQU		0FFH		;定义存储内循环次数的变量
;------------------------------------------

		ORG		00H				;
		GOTO	MAIN			;

;-------------------主程序开始--------------------
MAIN
	NOP						;设置一条ICD必须的空操作
;-------------------初始化------------------------
	BSF		STATUS,RP0			;转到BANK1
	BCF		STATUS,RP1			;
	MOVLW	00H					;将00H送到W
	MOVWF	TRISA				;设置PORTA的方向为输出
	MOVLW	0FFH				;将FFH送到W
	MOVWF	TRISB				;设置PORTB的方向为输入
	BCF		STATUS,RP0			;转到BANK0
	BCF		STATUS,RP1			; 

;-------------------初始化结束---------------------
	MOVLW	0FDH				;将FDH送到W
	MOVWF	PORTA				;使能74LS244,准备读入状态值
	MOVF 	PORTB,0				;读入输入的状态值
	MOVWF	STATUS_IN			;将读入的值存到30H中
	MOVLW	0FFH	  			;将FB送到W
	MOVWF	PORTA				;准备输出状态值
	BSF		STATUS,RP0			;转到BANK1
	BCF		STATUS,RP1			;
	MOVLW	00H					;将00H送到W
	MOVWF	TRISB				;设置PORTB的方向为输出
	BCF		STATUS,RP0			;转到BANK0
	BCF		STATUS,RP1			; 
LOOP	
MOVF	STATUS_IN,0			;将状态值读到W
	MOVWF	PORTB				;按获得的状态值,点亮LED
	CALL	DELAY				;延时
	CLRF	PORTB				;熄灭所有的LED
	CALL	DELAY				;延时
	GOTO 	LOOP				;循环	

;---------------延时子程序-------------------	

DELAY
	MOVLW	COUNT1		;设置外部循环的次数
	MOVWF	DATA1		;
LOOP1
	MOVLW	COUNT2		;设置内部循环的次数
	MOVWF	DATA2		;
LOOP2
	DECFSZ	DATA2,1		;内部循环变量自减1,为0则跳转
	GOTO	LOOP2		;
	DECFSZ	DATA1,1		;外部循环变量自减1,为0则跳转
	GOTO	LOOP1		;
	RETURN				;返回主程序
;---------------延时子程序结束-------------------

	END	
;---------------程序结束-------------------
;------------------------------------------
;文件名"1_5.ASM"
;作者:求是科技
;功能:在实现了简单的I/O扩展
;------------------------------------------
STATUS		EQU		03H			;定义状态寄存器地址
PORTA		EQU		05H			;定义端口A的数据寄存器地址
TRISA		EQU		85H			;定义端口A的方向寄存器
PORTB		EQU		06H			;定义端口B的数据寄存器地址
TRISB		EQU		86H			;定义端口B的方向寄存器

RP1			EQU		06H			;定义状态寄存器中的页选位RP1
RP0			EQU		05H			;定义状态寄存器中的页选位RP0

STATUS_IN	EQU		30H			;存放输入的状态值

DATA1		EQU		20H			;定义外循环变量
DATA2		EQU		21H			;定义内循环变量
TEMP		EQU		22H			;定义临时变量存储端口D的输入
COUNT1		EQU		130			;定义存储外循环次数的变量
COUNT2		EQU		0FFH		;定义存储内循环次数的变量
;------------------------------------------

		ORG		00H				;
		GOTO	MAIN			;

;-------------------主程序开始--------------------
MAIN
	NOP						;设置一条ICD必须的空操作
;-------------------初始化------------------------
	BSF		STATUS,RP0			;转到BANK1
	BCF		STATUS,RP1			;
	MOVLW	00H					;将00H送到W
	MOVWF	TRISA				;设置PORTA的方向为输出
	MOVLW	0FFH				;将FFH送到W
	MOVWF	TRISB				;设置PORTB的方向为输入
	BCF		STATUS,RP0			;转到BANK0
	BCF		STATUS,RP1			; 

;-------------------初始化结束---------------------
	MOVLW	0FDH				;将FDH送到W
	MOVWF	PORTA				;使能74LS244,准备读入状态值
	MOVF 	PORTB,0				;读入输入的状态值
	MOVWF	STATUS_IN			;将读入的值存到30H中
	MOVLW	0FFH	  			;将FB送到W
	MOVWF	PORTA				;准备输出状态值
	BSF		STATUS,RP0			;转到BANK1
	BCF		STATUS,RP1			;
	MOVLW	00H					;将00H送到W
	MOVWF	TRISB				;设置PORTB的方向为输出
	BCF		STATUS,RP0			;转到BANK0
	BCF		STATUS,RP1			; 
LOOP	
MOVF	STATUS_IN,0			;将状态值读到W
	MOVWF	PORTB				;按获得的状态值,点亮LED
	CALL	DELAY				;延时
	CLRF	PORTB				;熄灭所有的LED
	CALL	DELAY				;延时
	GOTO 	LOOP				;循环	

;---------------延时子程序-------------------	

DELAY
	MOVLW	COUNT1		;设置外部循环的次数
	MOVWF	DATA1		;
LOOP1
	MOVLW	COUNT2		;设置内部循环的次数
	MOVWF	DATA2		;
LOOP2
	DECFSZ	DATA2,1		;内部循环变量自减1,为0则跳转
	GOTO	LOOP2		;
	DECFSZ	DATA1,1		;外部循环变量自减1,为0则跳转
	GOTO	LOOP1		;
	RETURN				;返回主程序
;---------------延时子程序结束-------------------

	END	
;---------------程序结束-------------------

⌨️ 快捷键说明

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