题目一 8255简单编程实现LED灯开关
要求:采用并行接口8255A编写一个用开关量控制LED灯的程序,在微机原理实验仪上调试,运行后可以看到LED灯在对应开关量控制下点亮或熄灭
将实验台8255接口A0、A1孔对应连接实验仪器上地址总线的A0、A1孔,8255A的CS孔连接地址端口的320H孔(则8255A的端口地址分别为A口地址320H, B口地址321H,C口地址322H,控口地址323H)。8255A的PA0~PA7孔对应接开关量发生器0~7孔,PB0~PB7孔对应接LED灯0~7孔。
在实验仪器上,当开关向上拨动时产生低电平,向下拨动时产生高电平。当LED灯接收低电平时点亮,接收高电平时熄灭。
分析
-
A口地址320H, B口地址321H,C口地址322H,控口地址323H,故控制字需要写入323H - A口输入,B口输出,工作方式0,由此可得控制字为:10010000=90H
1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
- 把控制字放入AL寄存器中(MOV AL,90H),把323H放入DX寄存器中(MOV DX,323H),OUT DX,AL;把AL中的寄存器输出到控口中
- 要从A口输入:MOV DX,320H, IN AL,DX;因为320H>0FFH,所以需要放入DX寄存器中再与AL进行操作
- 要从B口输出:MOV DX,321H, OUT DX,AL
- 因为要实时监测开关的状态,所以设置一个死循环,不停执行以便于实时监测开关的输入信号是开还是关,开关拨动的次数与循环的次数无关,不管拨不拨动开关循环都会一刻不停的执行;当然也可以加入延时操作让其自动停止
代码
死循环
CODE SEGMENT
ASSUME CS: CODE
START: MOV AL, 90H ; 方式0,A口输入,B口输出
MOV DX, 323H
OUT DX, AL
AGAIN: MOV DX, 320H
IN AL, DX
MOV DX, 321H
OUT DX, AL
JMP AGAIN
CODE ENDS
END START
加入延时操作自动退出
CODE SEGMENT
ASSUME CS: CODE
SSS=325
START: MOV AL, 82H ; 方式0,B口输入,C口输出
MOV DX, 343H;设置控制端口地址
OUT DX, AL
AGAIN: MOV DX, 320H
IN AL, DX
MOV DX, 321H
OUT DX, AL
;设置延时5s
MOV AL,5
;调用子程序
CALL DELAY
MOV AH,4CH
INT 21H
;延时5s子程序
DELAY PROC
D0: MOV CX,1000
D1: MOV BX,SSS
D2:DEC BX
JNZ D2
DEC CX
JNZ D1
DEC AL
JNZ D0
RET
DELAY ENDP
CODE ENDS
END START
题目二 8255简单编程实现开关向下拨动LED灯亮
题目:假设端口起始地址为340H,连线并编写程序实现通过B口输入开关状态,并通过C口输出到LED灯,使得开关向上拨动时LED灯熄灭。