目录
题目
在某一8086系统中接有一个打印机,8255A作为输出接口,工作在方式0。试编一程序将寄存器DL中的内容传送到打印机打印。
分析
打印机接口简介:25芯D型连接器,在计算机机箱上是孔状插座。
打印机的主要引脚:
- D7~D0:8条数据引脚
- STB:打印机数据选通
- BUSY:打印机忙
- 缺纸、联机、出错、初始化等引脚
打印机具体工作过程:
- 需要打印时,查询打印机是否忙?BUSY有效,则告诉接口,打印机正在打印数据。BUSY无效,表示打印机空闲,可以通过8255A发送一个字符给打印机。
- 数据线D7—D0出现有效数据;
- 打印机的STB有效,通知打印机,接口给打印机一个数据,数据从数据线进入打印机。为使打印机接收数据,要生成一个选通脉冲(初始值是1,置0,再置1)。
- 需要让PC0位输出一个1-0-1变化的选通信号
题目分析控制字
A口:方式0、输出数据
上C口:方式0、PC4输入状态信号
下C口:方式0、PC0输出选通信号
方式控制字为:10001000B=88H
思考问题
1. 如何测试BUSY状态? 使用TEST指令
TEST指令与AND指令作用相似,但是运算完后不改变原值
BUSY接的是PC4,我们需要测试C口PC4是1还是0
- 若是1,说明打印机忙,循环回到起点,继续检测BUSY状态
- 若是0,则可以继续进行下一步操作
again:in AL, c_port ;读C口数据
test AL,00010000b
jnz again;若PC4为1,则回到循环
2. 如何让C口的某一位变化?使用置位/复位控制字:只对C口的某一位有效
置位/复位控制字:当将端口A定义为方式1或者方式2,或者将端口B定义为方式1时,要求使用端口C的某些位作控制使用,这时需要使用专门的控制字对端口C的各位进行置位/复位操作。
在本题中,我们需要让PC0位输出一个1-0-1变化的选通信号,因此只需要写3个分别代表101的置位复位控制字,即可完成一根线上输入不同电平的操作
- 设置PC0为1的置位复位控制字(设置C口的PC0位为1)
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
- 设置PC0为0的置位复位控制字(设置C口的PC0位为0)
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
三次写控制字的操作,便可以实现输出101的选通信号
mov AL,00000001b ;置PC0为1
out ctrl_port,AL
mov AL, 00000000b ;发选通信号,置PC0为0
out ctrl_port,AL
mov AL, 00000001b ;置PC0为1
out ctrl_port,AL
通信号
完整代码 (使用子程序段)
PRINTER PROC
;设置工作方式,初始化
MOV AL,88H
OUT CTR_PORT,AL
PRINT: IN AL,C_PORT
TEST AL,00010000B ;测试PC4是否为1
JNZ PRINT
MOV AL,DL ;把要打印的字符放入AL中
OUT A_PORT,AL ;把字符从A口输出,进入打印机
MOV AL,00000001B ;发送选通信号,置位PC0为1
OUT CTRL_PORT,AL
MOV AL,00000000B ;发送选通信号,复位PC0为0
OUT CTRL_PORT,AL
MOV AL,00000001B ;发送选通信号,置位PC0为1
OUT CTRL_PORT,AL
RET ;子程序结束标志,返回主程序
PRINTER ENDP