9.1 I/O系统概述
状态:缓冲区空还是满,是否还能接收
IO/#M信号是高电平表示访问端口
IO/#M=1表示现在访问端口
9.2 简单接口电路
三态门:当C端高电平,则XY导通,否则不导通
- 19号管脚低电平,右侧四个三态门导通;1号管脚低电平,左侧四个三态门导通
I0到I7高电平,表示K0到K7都是断开的;哪个开关闭合则读入的相应的I端应为0
A0和A1没有接入,则是部分译码
对数据保持或锁存
IOW通过CPU控制,会变高电平,D触发器导通
读写控制信号一定要作为译码器的输入,保证时序上的准确性
这个0是给编译器看的
9.3 基本I/O方法
高电平,发光管亮
查询发现空闲才进行数据交换
QRD:请求信号
HOLD:总线请求输入端
HLDA:请求应答信号(表示可以由DMA控制,它放弃对总线的控制权)
DACK:告诉外设,已经得到总线控制权
后两种对硬件要求高,成本贵
9.4 简单I/O接口电路实例详解
其他位与0屏蔽掉,只保留了第五位与1
74LS273——8D 锁存器
- 译码电路部分设计方法与前面相似
- 状态端口地址低三位是011(当是011时,译码器会选中Y3),因此Y3端作为状态端口的译码信号,Y3和IOR两个都为低电平时,状态端口开门;
- 要输出,则CP端要开门,低三位满足000时,Y0端会输出低电平,(这时执行OUT指令,使得IOW为低电平,两个相或输出0,当IOW负脉冲结束,自动变为高电平;这种跳变使得或门输出端变为高电平,此时一瞬间触发导通74LS273中的8个D触发器——>数据进行输出
- 先开始两三句初始化变量的偏移地址、数据串的长度;
- 接着三句是从输入端口读入一个字节的数
- 20H的来源:因为读入的当中只有bit5是有意义的状态信息,因此其他位都与上0,仅留下bit5
- 如果不忙,则输出数据
所有输入端接到电源上并到一起,叫做共阳极
如何得知这四个开关哪个是0哪个是1,一个个去(做)看开关状态太过麻烦,应该如何做?
- 将七段码的编码表定义到数据段起名叫Seg7
- 将变量的偏移地址取出给BX
- 让AH清零
- 获取端口地址状态(F1H中读入一个数到AL),软件编程时端口地址必须选择一个确定的端口地址,读入的数中因为只有0~3低四位表示开关状态,高四位是总线的随机值。所以要屏蔽掉高四位,保留低四位状态
- AND指令执行完,结果写回AL,则此时AL中就是确定四个开关的状态
- 开关的组合状态送给SI
- BX是Seg7变量的偏移地址,BX+SI即为开关状态所对应码值的单元(Seg7中的某个单元)
- 从F0输出
- 故这样做,不需要一个个去看开关的状态
9.5 中断技术
- 中断控制器管理外部可屏蔽中断源及其优先级,默认0高7低,可通过软件编程形式改变优先级
- 链式响应法:回应链上离它最近的中断源
NMI中断:外部可屏蔽中断,有INTA响应周期,类型码太多且不固定,需要响应哪一个端提出请求,必须要去接受类型码,而内部中断直接自动送给由CPU识别
陷阱中断(TF中断)优先级虽低,但它可以中断其他所有类型的中断
优先级由高到低:内部中断、NMI中断、INTR中断
9.6 本章小结