无条件传送方式
1 |6 ?! s$ s* q3 g$ m5 E- j 有些简单的输入设备,如按键、开关等,相对CPU而言,其状态很少发生变化。只要CPU需要,可随时读取其状态。有些简单的输出设备,如LED数码管、交通信号灯等,可以随时接受CPU发来的显示数据。cPu与这些设备进行数据传输时,可以认为它们总是准备好的,不需要了解它们的状态,输入时直接用输入指令,输出时直接用输出指令。这就是无条件传送方式。
; c: I4 o) U4 |* ^5 b& }" d( E/ M5 r" s 1.无条件传送输入接口电路
: y7 E- [7 k& J# B: c 图4.2所示是一个典型的无条件传送输入接口电路,实际上也是一个典型的无条件输入端口(字节型)。它由三态缓冲器、地址译码器和负与逻辑所组成。三态缓冲器可采用74LS244(八同相三态缓冲器/驱动器)。来自输入设备的数据可认为一直出现在三态缓冲器的输入端。设端口地址为1COH,读取设备数据可用下面的8086/8088汇编语言程序(片段):
# s, u' z8 V3 i/ k v5 B# ?
: U4 b3 @+ x, ]2 Z
: ^' F9 V V+ ]: f, q
) I; l# A8 k6 @* L% r5 I
5 Q, w3 `; q4 i) n5 s2 x 第一条指令是将端口地址送到Dx寄存器,第二条是真正读取端口数据的输入指令。
8 `3 R1 q; H! d' \8 H3 e x
第二条指令在执行时,微处理器进入I/O读周期。端口地址(1CO H)在T1期间出现在地址/数据复用线上,在ALE的后沿时被送到地址锁存器中,图中的地址译码器的输出随后变为有效(低电平)。M/
V2 y2 H! q6 s9 J3 f8 {; n. B
- ]6 a( p, i: H8 @) }! E8 O4 i
, x ]+ u7 H0 F
在该周期的开始就变为低电平。当读信号
0 `1 r% M, ~2 K! b: y) W
0 v8 W4 |# [5 N# C% H
到来时,负与门输出一个负脉冲,使三态缓冲器开放,于是,外设的数据经过三态缓冲器出现在系统总线上。cPU在T4的开始将该数据读入到寄存器AL中。这个
( h9 y. Q" {# d+ U/ c1 j- {. bI/O读周期(8086)的简化时序如图4.3所示。
6 G6 A/ x$ X1 e# `, ^ Z8 `* V `% e
" [' S! k6 s4 y6 {3 K7 R) n! a% q( F" M- S5 `! o* f
$ h0 ?8 z, q3 S( U, C' u/ D/ l% r
" j( o5 u1 F- v 在c语言程序中,读取端口1COH的数据可用下面的语句:
# X& U5 `) C9 |$ s
a=inportb(0x1CO);
% u* Q& l" K. M
2.无条件传送输出接口电路
6 T, z5 I+ i1 ?. Z 图4.4所示是一个典型的无条件传送输出接口电路,实际上也是一个典型的无条件输出端口(字节型)。它由寄存器(或锁存器)、地址译码器和负与逻辑所组成。寄存器可采用
* f" ]/ c5 D. Z# r8 i
74LS273(8个D型触发器共用时钟)。设端口地址为264H,输出数据至该端口可用下面的
& Y) ^( B$ ^' [" |, e# n$ v. x8086/8088汇编语言程序(片段):
) m4 M9 S$ @! M Z2 R: H6 H
" x0 U v7 l+ D% P: [# _
! v/ y* t y6 e& l E5 [# {2 {7 l8 P1 Y5 Q/ f- S A& W0 p
+ j; j: [; o. s5 \
其中的DATA是用符号表示的数据(0~255)。头两条指令是为第三条指令做准备(要输出的数据和端口地址)。第三条指令在执行时,微处理器进入I/O写周期。端口地址(264H)在T1期间出现在地址/数据复用线上,在ALE的后沿时被送到地址锁存器中,于是,图中的地址译码器的输出变为有效(低电平)。要输出的数据从T2的中间开始出现在地址/数据复用线上。M/
, D+ L5 p0 D/ {# c. k( j8 L
- Y3 p1 z& B3 } q# T# q7 n在该周期的开始就变为低电平。当写信号
% |2 }8 j6 [& y" m+ n5 u) z* T
# S' ?* p8 C) v7 J
到来时,负与门输出一个负脉冲,负脉冲的后沿(上升沿)将复用线上的数据送到寄存器中(寄存器的CP端为时钟脉冲输入端,CP的英文全称是Clock Pulse)。此后外设就可以利用该寄存器中的数据去完成 具体的输出(如打印)。如图4.5所示为上述I/0写周期(8086)的简化时序。
" s( Y, p0 C' e* C+ l3 ~
" e" @- A# \/ z* E/ ~$ B
' e; Q3 M# I6 ?( @, d/ [0 j
' M0 h- Z+ `- b* {( V
2 v* i0 g& I* ^- x; l Y. ~. j1 ^9 b
5 @; L+ f! [3 t% ?- k2 l% j2 p, ^ j在c语言程序中,输出数据DATA至端口264H可用下面的语句:
! Y* a* d9 N+ H, F outportb(0x264,DATA);
% K; s* H, g* L8 j
显然,这比上面三条指令要简洁、直观。