Java教程

【汇编与接口】并行接口8255芯片实验

本文主要是介绍【汇编与接口】并行接口8255芯片实验,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 题目要求
  • 连线图
  • 流程图
  • 代码及注释

题目要求

本实验要实现:用按键并通过8255并行接口来控制数码管的显示。具体如下:
(1)用8255的PA口控制数码管的段码。
(2)用8255的PC口控制数码管的位码。
(3)初始状态时,在最右侧数码管上显示0,自此,可用按键控制数码管的后续显示,具体为:

  • 按一下‘l’键,显示数字的数码管向左移一位。若已到了最左端,则跳到最右端继续显示。
  • 按一下‘r’键,显示数字的数码管向右移一位。若已到了最右端,则跳到最左端继续显示。
  • 按一下‘u’键,显示数字的数码管不动,但其中显示的数字加1。若加到10,则设为0。
  • 按一下‘d’键,显示数字的数码管不动,但其中显示的数字减1。若减到-1,则设为9。
  • 按一下‘e’键,显示数字的数码管灭掉,演示结束。
  • 按任何其他的键,数码管无反应。

连线图

连线图

流程图

流程图

代码及注释

DATA SEGMENT
	IO8255_A EQU 288H
	IO8255_C EQU 28AH
	IO8255_K EQU 28BH
	LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH			;保存各个数字的数码管亮的十六进制数
	BUFFER DB 0		;BUFFER存储当前输出的数字
	BZ DW ?			;BZ存储位码
	CHAR DB ?		;CHAR存储当前输入的字母L/R/U/D/E
DATA ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
	MOV DS,AX
	MOV DX,IO8255_K		;K命令口
	MOV AL,80H			;命令口写入80H,即10000000B,意味方式0,PA,PB,PC口均为输出口
	OUT DX,AL
	MOV SI,OFFSET LED	;SI指向LED,方便找到要显示的数字
	MOV BL,BUFFER
	MOV BH,01
	MOV BYTE PTR BZ,BH
	MOV BH,0
	ADD SI,BX
	MOV AL,BYTE PTR [SI]	;AL中存入0,也即将从PA口输出数字0的段码
	MOV DX,IO8255_A		;从PA口输出数字0段码,显示数字为0
	OUT DX,AL
	MOV AL,BYTE PTR BZ
	MOV DX,IO8255_C		;从PC口输出位码,最后一位将用于显示
	OUT DX,AL
LOOPALL:
MOV SI,OFFSET LED
MOV AH,01
	INT 21H
	MOV CHAR,AL			;从键盘输入一个字母,将其存入CHAR
	MOV BL,108
	CMP CHAR,BL			;与L的ASCII码比较,查看是否为L
	JNZ NEXT1
	CALL LEFT			;是L则调用LEFT子程序,否则进行下一个比较
NEXT1:MOV BL,114
	CMP CHAR,BL			;与R的ASCII码比较,查看是否为R
	JNZ NEXT2
	CALL RIGHT			;是R则调用RIGHT子程序,否则进行下一个比较
NEXT2:MOV BL,117
	CMP CHAR,BL			;与U的ASCII码比较,查看是否为U
	JNZ NEXT3
	CALL UP				;是U则调用UP子程序,否则进行下一个比较
NEXT3:MOV BL,100
	CMP CHAR,BL			;与D的ASCII码比较,查看是否为D
	JNZ NEXT4
	CALL DOWN			;是D则调用DOWN子程序,否则进行下一个比较
NEXT4:MOV BL,101
	CMP CHAR,BL			;与E的ASCII码比较,查看是否为E
	JNZ LOOPALL
	JMP EXIT				;是E则跳转到EXIT退出,否则回到循环开头
LEFT:MOV BL,BYTE PTR BZ
	ROL BL,1				;位码循环左移一位,使用ROL保证到最左端可以回到最右端
	MOV BYTE PTR BZ,BL
	MOV SI,OFFSET LED
	MOV BL,BUFFER		;BUFFER中数字直接使用
	MOV BH,0
	ADD SI,BX
	MOV AL,BYTE PTR [SI]
	MOV DX,IO8255_A		;PA口输出段码
	OUT DX,AL
	MOV AL,BYTE PTR BZ
	MOV DX,IO8255_C		;PC口输出位码
	OUT DX,AL
	RET

RIGHT:MOV BL,BYTE PTR BZ
	ROR BL,1				;位码循环右移一位,使用ROR保证到最右端可以回到最左端
	MOV BYTE PTR BZ,BL
	MOV SI,OFFSET LED
	MOV BL,BUFFER
	MOV BH,0
	ADD SI,BX
	MOV AL,BYTE PTR [SI]
	MOV DX,IO8255_A
	OUT DX,AL
	MOV AL,BYTE PTR BZ
	MOV DX,IO8255_C
	OUT DX,AL
	RET

UP:MOV BL,BUFFER
	INC BL				;当前数字自增1
	MOV BH,0
	MOV DL,9
	CMP BL,DL			;如果数字加一后大于9,则将数字置零
	JNA NU				;否则跳到NU
	MOV BL,0
NU:MOV BUFFER,BL		;将新的数字存入BUFFER
	MOV SI,OFFSET LED
	ADD SI,BX
	MOV AL,BYTE PTR [SI]	
	MOV DX,IO8255_A
	OUT DX,AL
	MOV AL,BYTE PTR BZ
	MOV DX,IO8255_C
	OUT DX,AL
	RET

DOWN:MOV BL,BUFFER
	SUB BL,1				;当前数字自减1
	MOV BH,0			;若自减后小于0则将数字置9
	JNC ND				;否则跳到ND
	MOV BL,9
ND:MOV BUFFER,BL		;将新的数字存入BUFFER
	MOV SI,OFFSET LED
	ADD SI,BX
	MOV AL,BYTE PTR [SI]
	MOV DX,IO8255_A
	OUT DX,AL
	MOV AL,BYTE PTR BZ
	MOV DX,IO8255_C
	OUT DX,AL
	RET

EXIT:MOV DX,IO8255_A		;数码管熄灭
	MOV AL,0
	OUT DX,AL
	MOV AX,4C00H		;程序中断
	INT 21H
CODE ENDS
	END START
这篇关于【汇编与接口】并行接口8255芯片实验的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!