8255并行接口实验
2020-12-09 16:09 知乎 阅读:553
汇编语言–8255并行接口实验
实验题目
- 基本输入输出实验。编写程序,使8255的A口为输出,B口为输入,完成拨动开关到数据灯的数据传输。要求只要开关拨动,数据灯的显示就发生相应改变。
- 流水灯显示实验。编写程序,使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