西电微机原理实验四

西电微机原理实验四

实验室:EⅡ-522

实验要求
  1. 流水灯实验:利用8255的A口、B口、C口循环点亮发光二极管。
  2. 根据输入控制灯的亮灭
  3. 在完成(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

你可能感兴趣的:(汇编,微机原理,西电,8086,计科)