8.2.3 I/O程序举例
下面我们通过几个I/O程序的例子,说明使用I/O指令直接在端口级上输入输出的方法。
这是一个最基本的直接控制扬声器发出声音的程序。程序通过I/O指令使设备控制寄存器(I/O端口地址为61H)的第1位交替为0和1,而端口61H的第1位和扬声器的脉冲门相连,当第1位由0变为1,延迟一会又由1变为0时,脉冲门就先打开后关闭,产生了一个脉冲电流。这个脉冲电流被放大后送到扬声器使之发出了声音。61H端口的第0位和一个振荡器(2号定时器)相连,现在不用振荡器产生声音,所以把第0位置零。
SOUND程序中的第2条指令IN AL,61H取得设备控制寄存器的开关量,然后由第3条指令AND将第0位和第1位置零,2~7位保持不变,XOR指令将第1位置为1,然后把这个开关量输出到61H端口以控制接通扬声器。在第二次循环执行XOR指令时,第1位又由1变为0,也就是关闭了扬声器,这样在脉冲电流的驱动下,扬声器就发出了声音。
另外两条指令:
MOV CX,1400h
WAIT1: LOOP WAIT1
是用来控制脉冲门开关的时间,这个时间值根据PC机的主频是可以改变的,主频越快的的机器,这个时间值就应该越大。因为程序里用一个固定的值1400h控制输出脉冲1和0的变化,因此扬声器接通和关闭的时间间隔总是相同的,结果发出的声音是一个没有变化的纯音。
通常一个外设的数据端口是8位的,而状态与控制信息只需一位或两位,所以不同外设的状态和控制位可共用一个端口。
|
|