【汇编与接口】并行接口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,芯片,并行接口,MOV,AL,BL,SI,DX,PTR 来源: https://blog.csdn.net/weixin_46068120/article/details/122767169