实验五 8255和LED数码管显示实验
一、实验目的
1.掌握并行接口8255A的工作原理及使用方法。
2.了解七段数码管显示数字的原理。
3.掌握多位数码显示的接口技术。
二、实验电路
三、实验内容
1.静态显示:按图3连接好电路,将8255A的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接+5V(选中),S0、S2、S3、dp接地(关闭)。编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
2.动态显示:按图4连接好电路,七段数码管段码连接不变,位码驱动输入端S1、S0接8255C口的PC1、PC0,S2、S3接地(关闭)。编程在两个数码管上显示56。
四、编程提示
1.实验台上的七段数码管为共阴极,码段采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
五、实验程序(必须加注释)和结果
实验程序1
;************************************************
;* 键盘输入数据(0-9)控制LED数码管显示(静态显示) *
;************************************************
DATA SEGMENT
IO8255A EQU 288H ; 8255A端口A的地址
IO8255K EQU 28BH ; 8255A控制端口的地址
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ; 数码管显示的段码表
MESG1 DB 0DH,0AH,'INPUT A NUM (0--9),OTHER KEY IS EXIT:',0DH,0AH,'$' ; 提示信息
mess2 DB 'Kruanjian221 guozhihong 2022900624 AND mingruizhao2022900625',0DH,0AH,'$' ; 另一个提示信息
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,IO8255K ; 初始化8255A,设置端口A为输出方式
MOV AX,80H
OUT DX,AL
MOV ah,9
MOV dx,offset mess2
int 21h
SSS: MOV DX,OFFSET MESG1 ; 显示提示信息
MOV AH,09H
INT 21H
MOV AH,01 ; 从键盘接收字符
INT 21H
CMP AL,'0' ; 检查输入是否小于0
JL EXIT ; 若是则退出
CMP AL,'9' ; 检查输入是否大于9
JG EXIT ; 若是则退出
SUB AL,30H ; 将所得字符的ASCII码减30H,得到对应的数值
MOV BX,OFFSET LED ; BX指向数码管显示的段码表
XLAT ; 根据数值查找对应的段码
MOV DX,IO8255A ; 将段码输出到8255A的端口A
OUT DX,AL
JMP SSS ; 循环,继续接收键盘输入
EXIT: MOV AH,4CH ; 返回操作系统
INT 21H
CODE ENDS
END START
设计思路:
- 初始化
- 首先初始化数据段,设置8255A芯片,将端口A设为输出方式,并显示特定提示信息(mess2)。
- 输入获取与判断
- 显示输入提示信息(MESG1)后,从键盘接收字符。判断输入字符是否在0 - 9之间,若不在此范围则退出程序。
- 数码管显示
- 若输入在0 - 9之间,将输入字符的ASCII码转换为对应数值,通过查表(LED段码表)得到数码管显示的段码,输出到8255A的端口A以在数码管上显示相应数字,然后循环继续获取输入。
- 结束程序
- 若输入不符合要求则执行EXIT,返回操作系统
实验程序2
DATA SEGMENT
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ; 定义一个字节型数据LED,存放数码管显示0 - 9的段码值
mess2 DB 'Kruanjian221 guozhihong 2022900624 AND mingruizhao2022900625',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ; 将数据段DATA的段地址赋给AX寄存器
MOV DS,AX ; 将AX中的段地址值赋给数据段寄存器DS,完成数据段的初始化
MOV ah,9
MOV dx,offset mess2
int 21h
MOV DX,293H ; 写控制字使8255的A口、C口为输出方式,28BH为8255控制端口地址
MOV AL,80h ; 控制字80H,表示设置8255的工作方式等,这里设置A口、C口为输出
OUT DX,AL ; 将控制字通过DX指定的端口(28BH)输出,配置8255
LOOP1:
MOV AL,00H ; 先向8255的C口送数据00H,可能是用于准备进行后续操作(如清一些控制位等,具体取决于硬件连接情况)
MOV DX,292H ; 28AH为8255的C口地址
OUT DX,AL ; 将00H输出到8255的C口
MOV AL,5 ; 准备显示数字5对应的段码,这里将数字5作为索引
MOV BX,OFFSET LED ; 将LED表的偏移地址赋给BX寄存器,为查表做准备
XLAT ; 通过查表指令XLAT,根据AL中的索引(这里是5)从LED表中查出对应的段码送给AL
MOV DX,290H ; 288H为8255的A口地址,A口用于输出数码管段码
OUT DX,AL ; 将查找到的数字5对应的段码输出到8255的A口,以驱动数码管显示数字5
MOV AL,02H ; 向8255的C口送数据02H,可能用于控制数码管的其他功能,比如位选等(具体看硬件连接)
MOV DX,292H
OUT DX,AL
MOV CX,100 ; 设置循环次数为1000,用于延时,以让数码管显示数字5能保持一段时间,让人眼能看清
DELAY:
LOOP DELAY ; 循环执行,实现延时功能,每次循环CX减1,直到CX为0
MOV AL,00H ; 再次向8255的C口送数据00H,进行新一轮操作前的准备
MOV DX,292H
OUT DX,AL
MOV AL,6 ; 准备显示数字6对应的段码,这里将数字6作为索引
MOV BX,OFFSET LED ; 重新指向LED表偏移地址,为查数字6的段码做准备
XLAT ; 查表获取数字6对应的段码到AL寄存器
MOV DX,290H
OUT DX,AL ; 将数字6的段码输出到8255的A口,驱动数码管显示数字6
MOV AL,01H ; 向8255的C口送数据01H,同样可能用于控制数码管的其他相关功能,比如位选等
MOV DX,292H
OUT DX,AL
MOV CX,100 ; 设置循环次数为1000,用于延时,让数码管显示数字6能保持一段时间
DELAY1:
LOOP DELAY1 ; 循环实现延时,直到CX减为0
MOV AH,1 ; 调用BIOS中断16H的功能1,用于检测键盘是否有按键按下,若有按键按下则AL存放按键的ASCII码
INT 16H
JNZ EXIT ; 如果有按键按下(ZF标志位不为0),则跳转到EXIT标号处执行,结束程序显示
JMP LOOP1 ; 如果没有按键按下,则跳回LOOP1继续循环,实现不断切换显示数字5和6的功能
EXIT:
MOV AL,0H ; 将0H送到AL寄存器,准备关闭数码管显示(通过向A口输出0来实现,具体看硬件逻辑)
MOV DX,290H ; 指向8255的A口
OUT DX,AL ; 输出0到8255的A口,关闭数码管显示
MOV AH,4CH ; 返回操作系统的功能号,准备结束程序
INT 21H ; 调用DOS中断21H,实现返回操作系统的功能
CODE ENDS
END START
设计思路:
- 初始化数据段和代码段:
- 首先,定义了数据段(DATA)和代码段(CODE),并初始化了数据段寄存器(DS)。
- 配置8255芯片:
- 通过向8255的控制端口(28BH)写入控制字(80H),将8255的A口和C口设置为输出模式。
- 显示数字5和6:
- 在主循环(LOOP1)中,首先向8255的C口写入数据(00H),然后通过查表指令(XLAT)从LED表中获取数字5的段码,并将其输出到8255的A口,以显示数字5。
- 接着,向8255的C口写入数据(02H),可能是用于控制数码管的其他功能,比如位选等。
- 通过一个延时循环(DELAY),使数字5在数码管上保持显示一段时间。
- 然后,重复上述步骤,显示数字6。
- 检测键盘输入:
- 在每次显示数字后,通过调用BIOS中断16H的功能1来检测键盘是否有按键按下。
- 如果有按键按下,则跳转到EXIT标号处,结束程序。
- 如果没有按键按下,则跳回LOOP1,继续循环显示数字5和6。
- 结束程序:
- 在EXIT标号处,将0H输出到8255的A口,关闭数码管显示。
- 最后,通过调用DOS中断21H的功能4CH,返回操作系统。
- 若输入不符合要求则执行EXIT,返回操作系统