8255并行接口实验
2020-12-09 16:09 知乎 阅读:553

汇编语言–8255并行接口实验

实验题目

  1. 基本输入输出实验。编写程序,使8255的A口为输出,B口为输入,完成拨动开关到数据灯的数据传输。要求只要开关拨动,数据灯的显示就发生相应改变。
  2. 流水灯显示实验。编写程序,使8255的A口和B口均为输出,数据灯D7~D0由左向右,每次仅亮一个灯,循环显示,D15~D8与D7~D0正相反,由右向左,每次仅点亮一个灯,循环显示

第一个题目代码

;=========================================================
; 文件名: A82551.ASM
; 功能描述: A口为输入,B口为输出,将读入的数据输出显示
;           IOY0
;=========================================================

IOY0         EQU   0600H          ;片选IOY0对应的端口始地址
MY8255_A     EQU   IOY0+00H*2     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*2     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*2     ;8255的C口地址
MY8255_MODE  EQU   IOY0+03H*2     ;8255的控制寄存器地址

SSTACK	SEGMENT STACK
		DW 32 DUP(?)
SSTACK	ENDS
CODE	SEGMENT
		ASSUME CS:CODE
START:	
        ;初始化8255
        MOV DX, MY8255_MODE
		MOV AL, 82H
		OUT DX, AL

AA1:	
        ;将8255 B端口的状态给AL,虽然这里是把B的地址送给AL,但是可以理解成把B端口
        ;状态给AL,例如B端口为0010(1代表拨动的那个开关),则把0010给AL
        ;后面通过把AL给8255A端口,控制灯
        MOV DX, MY8255_B
		IN  AL, DX
		
		;调用子程序 起延时作用,因为一个脉冲很短,但是灯的亮与不亮有时间间隔,需要延迟时间
		CALL DELAY
		
		;把AL的值赋给8255的A端口
		MOV DX, MY8255_A
		OUT DX, AL
		
		JMP AA1
		
DELAY:	PUSH CX
		MOV CX, 0F00H
AA2:	PUSH AX
		POP  AX
		LOOP AA2
		POP  CX
		RET
CODE	ENDS
		END  START

第二个题目代码

;=========================================================
; 文件名: A82552.ASM
; 功能描述: A口为输出,B口为输出,流水灯显示
;=========================================================

IOY0         EQU   0600H          ;片选IOY0对应的端口始地址
MY8255_A     EQU   IOY0+00H*2     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*2     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*2     ;8255的C口地址
MY8255_MODE  EQU   IOY0+03H*2     ;8255的控制寄存器地址

SSTACK	SEGMENT STACK
		DW 32 DUP(?)
SSTACK	ENDS
CODE	SEGMENT
		ASSUME CS:CODE
START:	
     	;初始化8255
		MOV DX, MY8255_MODE
		MOV AL, 80H
		OUT DX, AL
		
		;8001H=1000 0000 0000 0001
		;假设这里1控制灯亮,这时的80001H就代表灯D15和D0亮
		;后面分开控制BH、BL中1的移动,就可以控制灯的移动
		;比如BH=1000 0000 亮一次后 做循环移位操作(向左或向右),就可以实现灯的流水效果
		;把1理解成灯亮,1移动,1到的位置灯亮,所以1不得移动,形成流水灯
		MOV BX, 8001H

AA1:	
		MOV DX, MY8255_A
		MOV AL, BH
		OUT DX, AL
		ROR BH, 1;右移移位
		
		MOV DX, MY8255_B
		MOV AL, BL
		OUT DX, AL
		ROL BL, 1;左移一位	
		
		;延时
		CALL DELAY
		CALL DELAY
		JMP AA1

DELAY:	PUSH CX
		MOV CX, 0F000H
AA2:	PUSH AX
		POP  AX
		LOOP AA2
		POP  CX
		RET
CODE	ENDS
		END  START

变式

题目二改成:
D15~D0依次灯亮,形成流水灯。也就是从左到右,依次亮,一次只可以亮一个灯。
代码


;=========================================================
; 文件名: A82552.ASM
; 功能描述: A口为输出,B口为输出,流水灯显示
;=========================================================

IOY0         EQU   0600H          ;片选IOY0对应的端口始地址
MY8255_A     EQU   IOY0+00H*2     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*2     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*2     ;8255的C口地址
MY8255_MODE  EQU   IOY0+03H*2     ;8255的控制寄存器地址

SSTACK	SEGMENT STACK
		DW 32 DUP(?)
SSTACK	ENDS
CODE	SEGMENT
		ASSUME CS:CODE
START:	MOV DX, MY8255_MODE
		MOV AL, 80H
		OUT DX, AL
		;一次一个灯亮,那么初始值只有一个1就行了
		;这里取01H=00000 0000 0000 0001
		;当然02H=0000 0000 0000 0010 也行
		MOV BX, 01H
AA1:	MOV DX, MY8255_A
		MOV AL, BH
		OUT DX, AL
		MOV DX, MY8255_B
		MOV AL, BL
		OUT DX, AL
		ROR BX, 1	;这里就只需要移位bx就行了,就移bx中唯一的一个1
		CALL DELAY
		CALL DELAY
		JMP AA1
DELAY:	PUSH CX
		MOV CX, 0F000H
AA2:	PUSH AX
		POP  AX
		LOOP AA2
		POP  CX
		RET
CODE	ENDS
		END  START

类似文章