• 训练要求:根据给定的电路图,设计8086 、 8255A 、8253A的综合应用程序。利用上述芯
片对一个每秒变换一次的流水灯进行仿真,其中开关控制流水灯的方向。具体的:
8086控制8253A与8255A的初始化及运行
8253A产生时间信号
8255A接收开关SW1与8253A产生的时间信号
8255A控制流水灯运行
根据要求,我们需要实现的功能有:LED灯每秒变换一次;开关的状态决定流水灯的方向
电路图:
根据电路图:开关的状态由A口的PA0读入,8253A的输出信号由A口的PA1读入,LED灯的亮灭由8255A的B口输出决定。
◎设计方案原理:74HC373用作地址锁存器达到数据线和地址线分时复用的效果。8253做定时器,实现计时的效果。8255的A口作为输入,用来捕捉开关的状态,以及8253的输出状态。8255的B口作为输出,驱动LED灯的亮灭。为使8253起到定时1S的作用,将8253设置在工作方式0,这样写入控制字后,8253的输出OUT就是低电平,计时1S后OUT变为高电平,我们通过检测A口的PA1来确定时间,当PA1为1时说明计时1S完成。然后就让B口输出左移或者右移来实现流水的效果。检测A口的PA1是为了定时1S的效果,所以我们还要加入开关控制的效果:当开关闭合时,PA0为0,设置LED由D1(D7)到D7(D1)的顺序依次亮;当开关断开时,PA0为1,设置LED由D7(D1)到D1(D7)的顺序依次亮。
开关状态读入—检测8255A口输入的PA0的状态:PA0=1,开关断开;PA0=0,开关闭合。
延时IS:我们设置8253工作在方式0,当写入控制字后,输出OUT变为低电平,计数1s后变为高电平,因此我们采取检测输出OUT即PA1的状态来判断延时是否完成。
初步实现代码
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME:CS:CODE,DS:DATA
START:
MOV AL,00010000B
OUT 30H,AL
MOV AL,4
OUT 00H,AL ;8253的初始化
MOV AL,90H
OUT 06H,AL ;8255的初始化
IN AL,08H
ROR AL,1
JNC L1 ;CF=0,开关闭合转到L1
MOV AL,01H
MOV BL,AL
OUT 02H,AL ;CF=1,开关断开,从D1开始点亮灯
N1: IN AL,08H
TEST AL,02H ;判断延时1s是否完成
JZ N1 ;ZF=1,TEST结果为0,延时未完成,继续检测
ROL BL,1
MOV AL,BL
OUT 02H,AL ;延时完成,输出左移,点亮下一个灯
LOOP N1 ;重复
L1: MOV AL,80H ;开关闭合情况
MOV BL,AL
OUT 02H,AL ;点亮D1
N2: IN AL,08H
TEST AL,02H
JZ N2 ;延时1s
ROR BL,1 ;右移输出数据,点亮上一个灯
MOV AL,BL
OUT 02H,AL
LOOP N2 ;重复
CODE ENDS
END START
这个初步的代码基本实现了LED流水灯和开关控制流水方向的效果。但也存在一个问题:每个LED灯亮的时间都不是相同的1S间隔。当然原因也能明确:我们设置的8253工作在方式0,从写入控制字到OUT输出高电平被我们检测到会有1S时间,但是每次的移位变换LED灯都不是从写入控制字开始的,因此就会出现时间上的不太对应。为解决这一问题,我们重新优化一下代码(在每次移位换灯之前都初始化一下8253,这样就能使每个灯亮1S)
最终代码:
MOV AL,00010000B
OUT 30H,AL
MOV AL,2
OUT 00H,AL ;8253的初始化
MOV AL,90H
OUT 06H,AL ;8255的初始化
IN AL,08H
ROR AL,1
JNC L1 ;CF=0,开关闭合转到L1
MOV AL,01H
MOV BL,AL
OUT 02H,AL ;CF=1,开关断开,从D1开始点亮灯
N3: MOV AL,00010000B
OUT 30H,AL
MOV AL,2
OUT 00H,AL
N1: IN AL,08H
TEST AL,02H ;判断延时1s是否完成
JZ N1 ;ZF=1,TEST结果为0,延时未完成,继续检测
ROL BL,1
MOV AL,BL
OUT 02H,AL ;延时完成,输出左移,点亮下一个灯
LOOP N3 ;重复
L1: MOV AL,80H ;开关闭合情况
MOV BL,AL
OUT 02H,AL ;点亮D1
N4: MOV AL,00010000B
OUT 30H,AL
MOV AL,4
OUT 00H,AL
N2: IN AL,08H
TEST AL,02H
JZ N2 ;延时1s
ROR BL,1 ;右移输出数据,点亮上一个灯
MOV AL,BL
OUT 02H,AL
LOOP N4 ;重复
到此,LED灯实现1S变换一次,开关控制流水方向