西电微机原理实验四
2023-12-21 21:49:41
西电微机原理实验四
实验室:EⅡ-522
实验要求
- 流水灯实验:利用8255的A口、B口、C口循环点亮发光二极管。
- 根据输入控制灯的亮灭
- 在完成(1)基础上,增加通过读取开关控制流水灯的循环方向和循环方式。
跟上一次实验基本相同,换了个芯片,然后控制的范围从八颗发光二极管变为了十六颗发光二极管
基础版
简单实现了功能1和2,全1左移,全0右移
COM_ADD EQU 0273H
PA_ADD EQU 0270H
PB_ADD EQU 0271H
PC_ADD EQU 0272H
_STACK SEGMENT STACK
DW 100 DUP(?)
_STACK ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CODE SEGMENT
START PROC NEAR
ASSUME CS:CODE, DS:_DATA, SS:_STACK
MOV AX,_DATA ; 将数据段地址加载到AX寄存器
MOV DS,AX ; 将数据段地址传送给数据段寄存器DS
NOP
MOV DX,COM_ADD ; 将串口地址传送给DX寄存器
MOV AL,82H ; 设置AL寄存器的值为82H
OUT DX,AL
INPUT:
; 清零操作
MOV AX, 0FFFFH
MOV DX, PA_ADD
OUT DX, AX
MOV DX, PC_ADD
OUT DX, AX
; 输入操作
MOV DX, PB_ADD
IN al, DX
mov ah, 0
; 判断
CMP al, 0FFH ;全1
JZ low1
CMP al, 0 ;全0
JZ high1
MOV DX, PA_ADD
OUT DX, al
JMP INPUT
; 处理输入值为0-7的情况
low1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
low2:
ROL al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
low3:
MOV al, 7FH
MOV DX, PC_ADD
low4:
ROL al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT
; 处理输入值为15-8的情况
high1:
MOV al, 0FEH
MOV DX, PC_ADD
high2:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high2
MOV AX, 0FFFFH
OUT DX, AX
; 处理输入值为7-0的情况
high3:
MOV al, 0FEH
MOV DX, PA_ADD
high4:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high4
JMP INPUT
Delay PROC NEAR
Delay1:
XOR CX,CX
LOOP $
RET
Delay ENDP
START ENDP
CODE ENDS
END START
完整版
增加了一些功能:
- 输入为11010000时,流水灯展示00001101
- 输入为00001111时,前8颗发光二极管左移,后8颗发光二极管右移
- 输入为11110000时,前8颗发光二极管右移,后8颗发光二极管左移
这个版本的代码还没有在试验箱上跑过,本来我是想验证完基础版后加上的,但当时我的试验箱出了一些问题,浪费了我好多时间,所以实验的时候只跑了基础版,应该是没有问题的
COM_ADD EQU 0273H
PA_ADD EQU 0270H
PB_ADD EQU 0271H
PC_ADD EQU 0272H
_STACK SEGMENT STACK
DW 100 DUP(?)
_STACK ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CODE SEGMENT
START PROC NEAR
ASSUME CS:CODE, DS:_DATA, SS:_STACK
MOV AX,_DATA ; 将数据段地址加载到AX寄存器
MOV DS,AX ; 将数据段地址传送给数据段寄存器DS
NOP
MOV DX,COM_ADD ; 将串口地址传送给DX寄存器
MOV AL,82H ; 设置AL寄存器的值为82H
OUT DX,AL
INPUT:
; 清零操作
MOV AX, 0FFFFH
MOV DX, PA_ADD
OUT DX, AX
MOV DX, PC_ADD
OUT DX, AX
; 输入操作
MOV DX, PB_ADD
IN al, DX
mov ah, 0
; 判断
CMP al, 0D0H
JZ mid
cmp al, 0FH
JZ lar1
cmp al, 0F0H
JZ ral1
CMP al, 0FFH ;全1,
JZ low1
CMP al, 0 ;全0
JZ high1
MOV DX, PA_ADD
OUT DX, al
JMP INPUT
; 处理输入值为0-7的情况
mid:
shl al,4
shr al,4
shr ah,4
add al,ah
mov ah,0
mov dx, PA_ADD ;00001101
out dx,ax
jmp INPUT
; 处理输入值为0-7的情况
ral1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
ral2:
ROR al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
ral3:
MOV al, 7FH
MOV DX, PC_ADD
ral4:
ROL al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT
; 处理输入值为0-7的情况
lar1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
lar2:
ROL al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
lar3:
MOV al, 7FH
MOV DX, PC_ADD
lar4:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT
; 处理输入值为0-7的情况
low1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
low2:
ROL al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
low3:
MOV al, 7FH
MOV DX, PC_ADD
low4:
ROL al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT
; 处理输入值为15-8的情况
high1:
MOV al, 0FEH
MOV DX, PC_ADD
high2:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high2
MOV AX, 0FFFFH
OUT DX, AX
; 处理输入值为7-0的情况
high3:
MOV al, 0FEH
MOV DX, PA_ADD
high4:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high4
JMP INPUT
Delay PROC NEAR
Delay1:
XOR CX,CX
LOOP $
RET
Delay ENDP
START ENDP
CODE ENDS
END START
文章来源:https://blog.csdn.net/m0_62201229/article/details/135139561
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!