总结:
A口可以工作在方式0方式1或方式2;
B口可以工作在方式0或方式1;
C口只能工作在方式0。
方式0:是基本型输入输出方式,端口 和 外设 之间没有联络信号。
方式1:是选通型输入输出方式,端口与外设之间必须有联络线,CPU与8255A可以用查询方式或中断方式交换信息。
方式2:是双向数据传输方式,只有A口可工作在方式2.
输入选通信号。由外设发往8255A,外设数据写入相应端口的输入缓冲器中。
输入缓冲器满。由8255A发往外设,读数据前,先查询该引脚,只有当IBF=1时,此时CPU才能从A口或B口读取数据,当CPU操作完后,IBF=0。
中断请求信号,在中断允许前提下,8255A接收到一个端口数据后(IBF=1),向CPU发出中断信号。
注意:中断方式时,必须要先讲与INTE对齐的C口引脚置1。
不管是工作在方式几,当控制口地址超过八位,就要利用DX作为中间值过渡。
方式选择控制字—>控制口
格式:
MOV AL,方式控制字
OUT 控制口地址,AL
;若超过八位
MOV AL,方式控制字
MOV DX,控制口地址
OUT DX,AL
MOV AL,方式选择命令字
OUT 控制口地址,AL
MOV AL,允许中断(或禁止中断)的命令字
OUT 控制口地址,AL
输入查询测试 IBF,输出查询测试 OBF
SCAN:IN AL,C口
TEST AL,IBF对应的C的引脚号(二进制)
JZ SCAN
IN AL,A口
例子:
A口查询一个字符,地址在218H~21BH
SCAN:MOV DX,21BH //C口
IN AL,DX
TEST AL,00100000H //因为IBF对应的是PC5,因为要测D5是否为0
JZ SCAN
MOV DX,218H //A口
IN AL,DX
说明:这是一个很经典的例子,由给出的地址可知,它们分别对应的A B C口地址,这里需要注意一个点,若地址超过八位,需要借助DX。