1 / 18

8.2.4 8255A 的应用举例

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

kirk-pitts
Télécharger la présentation

8.2.4 8255A 的应用举例

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 8.2.4 8255A的应用举例 例8.4 8255A初始化编程。设8255A的A口工作方式1输出,B口工作方式1输入,PC4和PC5输入,禁止B口中断。设片选信号CS由A9A2=10000000确定。试编写程序对8255A进行初始化。 根据题意,设计接口电路如图8.26所示。

  2. 图8.26 8255方式1接口电路及控制字

  3. 初始化程序如下: 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

  4. 例8.5利用8255A对非编码键盘进行管理。 图8.27 矩阵键盘接口

  5. 图中8255A的A口工作于方式0输出,B口工作于方式0输入。键盘工作过程如下:首先进行第1次键盘扫描(判断是否有键按下)。使A口PA3PA0输出均为0,然后读入B口的值,查看PB3PB0是否有低电平,若没有低电平,则说明没有键按下,继续进行扫描。若PB3PB0中有一位为低电平,使用软件延时1020 ms以消除抖动,若低电平消失,则说明低电平是由干扰或按键的抖动引起的,必须再次扫描,否则,则确认有键按下,接着进行第2次扫描(行扫描,判断所按键的位置)。首先通过A口输出使PA0=0,PA1=1,PA2=1,PA3=1对第0行进行扫描,此时,读入B口的值,判断PB3PB0中是否有某一位为低电平,若有低电平,则说明第0行某一列上有键按下。如果没有低电平,接着使A口输出PA0=1,PA1=0,PA2=1,PA3=1对第1行进行扫描,按上述方法判断,直到找到被按下的键,并识别出其在矩阵中的位置,从而可根据键号去执行该键对应的处理程序。

  6. ;判断是否有键按下 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口,判断PB3PB0是否有一位为低电平 AND AL,0FH CMP AL,0FH 设图中8255A的A口、B口和控制寄存器的地址分别为80H、81H和83H,其键盘扫描程序如下:

  7. JZ LOOA ;PB3PB0没有一位为低电平时转LOOA继续扫描JZ LOOA ;PB3PB0没有一位为低电平时转LOOA继续扫描 CALL D20ms ;PB3PB0有一位为低电平时调用延时20 ms子程序 IN AL,81H ;再次读入B口值。如果PB3PB0仍有一位为低电平, AND AL,0FH ;说明确实有键按下,继续往下执行,以判断是哪个 CMP AL,0FH ;键按下;如果延时后PB3PB0中低电平不再存在, JZ LOOA ;说明是由干扰或抖动引起的,则转LOOA继续扫描 ;判断哪一个键按下

  8. 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口,以便确定所 ;按键的列值

  9. 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 ;右移一位

  10. 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执行

  11. 例8.6利用8255A作为两机并行通信接口。 两台PC机通过8255A构成如图8.28所示的并行数据传送接口,A机发送数据,B机接收数据。A机一侧的8255A工作于方式1输出,从PA7PA0发送由CPU写入A口的数据,PC3、PC7和PC6提供A机一侧8255A的A口工作于方式1时的联络信号INTR、OBF和ACK。B机一侧的8255A工作于方式0输入,从PA7PA0接收A机送来的数据,PC4和PC0选作联络信号。

  12. 图8.28 两台PC机并行通信接口电路

  13. 其工作过程如下: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的端口地址均为300H303H。驱动程序如下:

  14. ;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 ; ;发送数据 …

  15. 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口发数据 …

  16. 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 ;置接收字节数计数器 … …

  17. ;对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口读数据

  18. 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 ;返回

More Related