180 likes | 334 Vues
8.2.4 8255A 的应用举例 例 8.4 8255A 初始化编程。设 8255A 的 A 口工作方式 1 输出, B 口工作方式 1 输入, PC 4 和 PC 5 输入,禁止 B 口中断。设片选信号 CS 由 A 9 A 2 =10000000 确定。试编写程序对 8255A 进行初始化。 根据题意,设计接口电路如图 8.26 所示。. 图 8.26 8255 方式 1 接口电路及控制字. 初始化程序如下: MOV AL , 10101110B ;控制字送 AL
E N D
8.2.4 8255A的应用举例 例8.4 8255A初始化编程。设8255A的A口工作方式1输出,B口工作方式1输入,PC4和PC5输入,禁止B口中断。设片选信号CS由A9A2=10000000确定。试编写程序对8255A进行初始化。 根据题意,设计接口电路如图8.26所示。
初始化程序如下: MOV AL,10101110B ;控制字送AL MOV DX,1000000011B ;8255A控制字寄存器地址送DX OUT DX,AL ;控制字送8255A的控制寄存器 MOV AL,00001101B ;PC6置1,允许A口中断 OUT DX,AL MOV AL,00000100B ;PC2置0,禁止B口中断 OUT DX,AL
例8.5利用8255A对非编码键盘进行管理。 图8.27 矩阵键盘接口
图中8255A的A口工作于方式0输出,B口工作于方式0输入。键盘工作过程如下:首先进行第1次键盘扫描(判断是否有键按下)。使A口PA3PA0输出均为0,然后读入B口的值,查看PB3PB0是否有低电平,若没有低电平,则说明没有键按下,继续进行扫描。若PB3PB0中有一位为低电平,使用软件延时1020 ms以消除抖动,若低电平消失,则说明低电平是由干扰或按键的抖动引起的,必须再次扫描,否则,则确认有键按下,接着进行第2次扫描(行扫描,判断所按键的位置)。首先通过A口输出使PA0=0,PA1=1,PA2=1,PA3=1对第0行进行扫描,此时,读入B口的值,判断PB3PB0中是否有某一位为低电平,若有低电平,则说明第0行某一列上有键按下。如果没有低电平,接着使A口输出PA0=1,PA1=0,PA2=1,PA3=1对第1行进行扫描,按上述方法判断,直到找到被按下的键,并识别出其在矩阵中的位置,从而可根据键号去执行该键对应的处理程序。
;判断是否有键按下 MOV AL,82H ;初始化8255A,A口方式0输出,B口方式0输入 OUT 83H,AL ;将工作方式控制字送控制寄存器 MOV AL,00H OUT 80H,AL ;使PA3=PA2=PA1=PA0=0 LOOA:IN,AL,81H;读B口,判断PB3PB0是否有一位为低电平 AND AL,0FH CMP AL,0FH 设图中8255A的A口、B口和控制寄存器的地址分别为80H、81H和83H,其键盘扫描程序如下:
JZ LOOA ;PB3PB0没有一位为低电平时转LOOA继续扫描JZ LOOA ;PB3PB0没有一位为低电平时转LOOA继续扫描 CALL D20ms ;PB3PB0有一位为低电平时调用延时20 ms子程序 IN AL,81H ;再次读入B口值。如果PB3PB0仍有一位为低电平, AND AL,0FH ;说明确实有键按下,继续往下执行,以判断是哪个 CMP AL,0FH ;键按下;如果延时后PB3PB0中低电平不再存在, JZ LOOA ;说明是由干扰或抖动引起的,则转LOOA继续扫描 ;判断哪一个键按下
START: MOV BL,4 ;行数送BL MOV BH,4 ;列数送BH MOV AL,0FEH ;D0=0,准备扫描0行 MOV CL,0FH ;键盘屏蔽码送CL MOV CH,0FFH ;CH中存放起始键号 LOP1: OUT 80H,AL ;A口输出,扫描一行 ROL AL,1 ;修改扫描码,准备扫描 MOV AH,AL ;下一行暂时保存 IN AL,81H ;读B口,以便确定所 ;按键的列值
AND AL,CL CMP AL,CL JNZ LOP2 ;有列线为0,转LOP2,找列值 ADD CH,BH ;无键按下,修改键号,以方便下一行找键号 MOV AL,AH ;恢复扫描码 DEC BL ;行数减1 JNZ LOP1 ;行未扫描完转LOP1 JMP START ;重新扫描 LOP2:INC CH ;键号加1 ROR AL,1 ;右移一位
JC LOP2 ;无键按下,查下一列线 MOV AL,CH ;已找到,键号送AL CMP AL,0 JZ KEY0 ;是0号键按下,转KEY0执行 CMP AL,1 JZ KEY1 ;是1号键按下,转KEY1执行 CMP AL,0EH JZ KEY14 ;是14号键按下,转KEY14执行 JMP KEY15 ;不是0~14号键,一定是15号键, ;转KEY15执行
例8.6利用8255A作为两机并行通信接口。 两台PC机通过8255A构成如图8.28所示的并行数据传送接口,A机发送数据,B机接收数据。A机一侧的8255A工作于方式1输出,从PA7PA0发送由CPU写入A口的数据,PC3、PC7和PC6提供A机一侧8255A的A口工作于方式1时的联络信号INTR、OBF和ACK。B机一侧的8255A工作于方式0输入,从PA7PA0接收A机送来的数据,PC4和PC0选作联络信号。
其工作过程如下:A机将数据从A口送出后,经PC7送出OBF有效信号(请参阅图8.21和图8.22),B机查询到OBF信号(经B机一侧8255A的PC4引脚)有效后,从A口读入数据,并通过软件在PC0上产生一个ACK有效信号,该信号的上升沿使A机的8255A的PC3上产生有效的INTR信号,A机CPU查询到INTR有效(PC3为高电平)时,接着发送下一个数据,如此不断重复,直到发送完所有的数据为止。其工作过程如下:A机将数据从A口送出后,经PC7送出OBF有效信号(请参阅图8.21和图8.22),B机查询到OBF信号(经B机一侧8255A的PC4引脚)有效后,从A口读入数据,并通过软件在PC0上产生一个ACK有效信号,该信号的上升沿使A机的8255A的PC3上产生有效的INTR信号,A机CPU查询到INTR有效(PC3为高电平)时,接着发送下一个数据,如此不断重复,直到发送完所有的数据为止。 假设两台PC机传送1 KB数据,发送缓冲区为0300:0000H,接收缓冲区为0400:0000H,A、B两机的8255A的端口地址均为300H303H。驱动程序如下:
;A机的发送程序 MOV AX,0300H MOV ES,AX ;设置A机发送数据缓冲区段地址 MOV BX,0 ;设置A机发送数据缓冲区偏移地址 MOV CX,03FFH ;设置发送字节数 ;对A机8255A进行初始化 MOV DX,303H ;指向A机8255A的控制寄存器 MOV AL,10100000B ;8255A指定为工作方式1输出 OUT DX,AL MOV AL,00001101B ;置发送中断允许INTEA=1 OUT DX,AL ; ;发送数据 …
MOV DX,300H ;向A口写第1个数据,产生第一个OBF MOV AL,ES:[BX] ;信号,对方查询到OBF信号有效后, ;读入数据,并通过软件,在PC0上发出 ; ACK信号,该信号上升沿使A机8255A ;的PC3产生有效的INTR信号, ;A机CPU查询到 OUT DX,AL ;该信号有效后,再接着发下一个数据 INC BX ;缓冲区指针加1 DEC CX ;计数器减1 LOOP0:MOV DX,302H ;指向8255A的C口,读有关状态信息 LOOP1:IN AL,DX ; AND AL,08H ;查询中断请求信号INTR(PC3)=1? JZ LOOP1 ;若INTR=0则等待,否则向A口发数据 …
MOV DX,300H MOV AL,ES:[BX] OUT DX,AL INC BX ;缓冲区指针加1 LOOP LOOP0 ;数据未送完,继续 MOV AX,4C00H INT 21H ;返回DOS ;B机接收数据 MOV AX,0400H MOV ES,AX ;设B机接收缓冲区段地址 MOV BX,0 ;设B机接收缓冲区偏移地址 MOV CX,3FFH ;置接收字节数计数器 … …
;对B机的8255A初始化 MOV DX,303H ;指向B机8255A的控制寄存器 MOV AL,10011000B ;设A口和C口高4位为方式0输入 OUT DX,AL ;C口低4位为方式0输出 MOV AL,00000001B ;置PC0=ACK=1 OUT DX,AL LOOP0:MOV DX,302H ;指向C口 LOOP1:IN AL,DX ;查A机的OBF(B机的PC4)=0? AND AL,10H ;即查询A机是否发来数据 JNZ LOOP1 ;若未发来数据,则等待 MOV DX,300H ;发来数据,则从A口读数据
IN AL,DX MOV ES:[BX],AL ;存入接收缓冲区 MOV DX,303H ;产生ACK信号,并发回A机 MOV AL,0 ;PC0置0 OUT DX,AL ; NOP ;延时,使所产生的有效ACK信号(低电平)持续 NOP MOV AL,01H ;PC0置1,使ACK变为高电平,注意在此信号作 OUT DX,AL ;用下,A机8255A的PC3变为高电平 INC BX ;缓冲区指针加1 DEC CX ;计数器减1 JNZ LOOP0 ;不为0,继续 MOV AX,4C00H ; INT 21H ;返回