本文主要是介绍西电微机原理实验四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
西电微机原理实验四
实验室: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 ; 将数据段地址传送给数据段寄存器DSNOP MOV DX,COM_ADD ; 将串口地址传送给DX寄存器MOV AL,82H ; 设置AL寄存器的值为82HOUT DX,AL INPUT: ; 清零操作MOV AX, 0FFFFH MOV DX, PA_ADDOUT DX, AXMOV DX, PC_ADDOUT DX, AX; 输入操作MOV DX, PB_ADDIN al, DXmov ah, 0; 判断CMP al, 0FFH ;全1JZ low1 CMP al, 0 ;全0JZ high1 MOV DX, PA_ADD OUT DX, alJMP INPUT
; 处理输入值为0-7的情况
low1:MOV al, 7FH ; 设置AL寄存器的值为7FHMOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
low2: ROL al, 1 ; 将AL寄存器的值左循环移位1位OUT DX, al CALL DelayCMP al, 7FHJNE low2MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFFOUT DX, AX
; 处理输入值为8-15的情况
low3:MOV al, 7FHMOV DX, PC_ADD
low4:ROL al, 1OUT DX, al CALL DelayCMP al, 7FHJNE low4 JMP INPUT; 处理输入值为15-8的情况
high1:MOV al, 0FEHMOV DX, PC_ADD
high2: ROR al, 1OUT DX, al CALL DelayCMP al, 0FEHJNE high2MOV AX, 0FFFFHOUT DX, AX
; 处理输入值为7-0的情况
high3:MOV al, 0FEHMOV DX, PA_ADD
high4:ROR al, 1OUT DX, al CALL DelayCMP al, 0FEHJNE high4 JMP INPUTDelay PROC NEAR
Delay1:
XOR CX,CXLOOP $RET
Delay ENDPSTART 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 ; 将数据段地址传送给数据段寄存器DSNOP MOV DX,COM_ADD ; 将串口地址传送给DX寄存器MOV AL,82H ; 设置AL寄存器的值为82HOUT DX,AL INPUT: ; 清零操作MOV AX, 0FFFFH MOV DX, PA_ADDOUT DX, AXMOV DX, PC_ADDOUT DX, AX; 输入操作MOV DX, PB_ADDIN al, DXmov ah, 0; 判断CMP al, 0D0H JZ midcmp al, 0FH JZ lar1 cmp al, 0F0H JZ ral1CMP al, 0FFH ;全1,JZ low1 CMP al, 0 ;全0JZ high1 MOV DX, PA_ADD OUT DX, alJMP INPUT
; 处理输入值为0-7的情况
mid:shl al,4shr al,4shr ah,4add al,ahmov ah,0mov dx, PA_ADD ;00001101out dx,axjmp INPUT; 处理输入值为0-7的情况
ral1:MOV al, 7FH ; 设置AL寄存器的值为7FHMOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
ral2: ROR al, 1 ; 将AL寄存器的值左循环移位1位OUT DX, al CALL DelayCMP al, 7FHJNE low2MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFFOUT DX, AX
; 处理输入值为8-15的情况
ral3:MOV al, 7FHMOV DX, PC_ADD
ral4:ROL al, 1OUT DX, al CALL DelayCMP al, 7FHJNE low4 JMP INPUT; 处理输入值为0-7的情况
lar1:MOV al, 7FH ; 设置AL寄存器的值为7FHMOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
lar2: ROL al, 1 ; 将AL寄存器的值左循环移位1位OUT DX, al CALL DelayCMP al, 7FHJNE low2MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFFOUT DX, AX
; 处理输入值为8-15的情况
lar3:MOV al, 7FHMOV DX, PC_ADD
lar4:ROR al, 1OUT DX, al CALL DelayCMP al, 7FHJNE low4 JMP INPUT; 处理输入值为0-7的情况
low1:MOV al, 7FH ; 设置AL寄存器的值为7FHMOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
low2: ROL al, 1 ; 将AL寄存器的值左循环移位1位OUT DX, al CALL DelayCMP al, 7FHJNE low2MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFFOUT DX, AX
; 处理输入值为8-15的情况
low3:MOV al, 7FHMOV DX, PC_ADD
low4:ROL al, 1OUT DX, al CALL DelayCMP al, 7FHJNE low4 JMP INPUT; 处理输入值为15-8的情况
high1:MOV al, 0FEHMOV DX, PC_ADD
high2: ROR al, 1OUT DX, al CALL DelayCMP al, 0FEHJNE high2MOV AX, 0FFFFHOUT DX, AX
; 处理输入值为7-0的情况
high3:MOV al, 0FEHMOV DX, PA_ADD
high4:ROR al, 1OUT DX, al CALL DelayCMP al, 0FEHJNE high4 JMP INPUTDelay PROC NEAR
Delay1:
XOR CX,CXLOOP $RET
Delay ENDPSTART ENDP
CODE ENDS
END START
这篇关于西电微机原理实验四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!