500 likes | 611 Views
第八章 并行接口. 第一节 并行接口概述. 一、并行接口与串行接口结构. 回下页. 就绪 / 忙信号. 速度取决于 就绪 / 忙信号. 传输需求. 选通信号. 并行数据线. 无格式要求. 空闲 — 可为 0 长度. …. …. 单条数据线. 起始 标志位. 串行 数据位. 停止 标志位. 约定的格式. 约定的速度. 二、并行与串行接口通信方式 1 、并行通信方式 一般采用异步互锁方式。. 2 、串行通信方式 一般采用起止式异步方式。. 转上页. 第二节 可编程芯片 82C55. 一、 8255 的基本功能.
E N D
第一节 并行接口概述 一、并行接口与串行接口结构 回下页
就绪/忙信号 速度取决于 就绪/忙信号 传输需求 选通信号 并行数据线 无格式要求 空闲—可为0长度 … … 单条数据线 起始 标志位 串行 数据位 停止 标志位 约定的格式 约定的速度 二、并行与串行接口通信方式 1、并行通信方式 一般采用异步互锁方式。 2、串行通信方式 一般采用起止式异步方式。 转上页
第二节 可编程芯片82C55 一、8255的基本功能 ⑴具有2个8位I/O口(A口和B口)和2个4位I/O口(C口上半部和C口下半部),输入时具有缓冲、输出时具有锁存功能,A口具有双向功能; ⑵对A组和B组支持多种工作方式(0、1、2),实现无条件、查询、中断方式传输; ⑶C口在方式1和方式2时,部分引脚作为A口和B口的状态口(其余引脚作为数据口),并可按位进行操作。
二、8255的内部结构和外部引脚 1、内部结构
CPU侧引脚: D0-D7,A1A0, CS,RD、WR 2、外部引脚 外设侧引脚: PA0-PA7, PB0-PB7, PC0-PC3, PC4-PC7
I/O端口地址:8255提供4个端口(使用A1A0)。 命令:初始化—设置工作方式; 操 作—对A口、B口、C口读/写(整字节读/写); 对C口按位置位/复位(状态口部分位只可读) 端口与命令关系表: 回下页
三、8255操作及编程 1、初始化编程 —设置工作方式控制字 初始化仅需设置工作方式控制字(各口工作模式)。 I/O端口:A1A0=11 工作方式控制字与C口按位操作冲突控制: 工作方式控制字—D7=1; C口按位置/复位—D7=0。 转上页 回下页 回10页
例1:要求使8255的A口工作于方式1作输入,B口工作于方式0作输出,C口上半部输入,下半部输出,8255的端口地址为60H~63H。请写出初始化程序。例1:要求使8255的A口工作于方式1作输入,B口工作于方式0作输出,C口上半部输入,下半部输出,8255的端口地址为60H~63H。请写出初始化程序。 控制字为:10111000B=0B8H 初始化程序为: MOV AL,0B8H OUT 63H,AL 转上页 回下页
2、C口按位置位/复位操作 目的:当C口作为状态口时,有些位不可写,需要用按位置位/复位操作对可写位进行操作。 例2:如上例,若A口在方式1输入、中断传输方式时,应当使C口内部REG D4=1,则按位置位操作为: MOV AL,00001001B OUT 63H,AL 转上页 转8页 回19页
四、8255的工作方式 1、方式0—基本I/O方式(无条件I/O方式) A口、B口、C口(上半部及下半部)均可用作输入或输出(单向),实现无条件方式传输; CPU可用IN/OUT指令实现数据传输。
例3:用8255(起始地址为60H)发出一个正向脉冲,编写相应程序。例3:用8255(起始地址为60H)发出一个正向脉冲,编写相应程序。 (可作为第6章频率计数时STC需要的1个脉冲) MOV AL,80H ;PA口方式0输出,PB口方式0输出 OUT 63H,AL ;PC口高、低4位均输出 MOV AL,0 OUT 60H,AL MOV AL,2 OUT 60H,AL MOV AL,0 ;PA1产生一个正向脉冲 OUT 60H,AL 转第6章计数例题中STC信号
例4:假设有一个4×4的矩阵键盘通过并行接口芯片8255(起始端口地址为60H)与微机相连,画出8255与键盘电路连接图并编写键盘扫描程序。例4:假设有一个4×4的矩阵键盘通过并行接口芯片8255(起始端口地址为60H)与微机相连,画出8255与键盘电路连接图并编写键盘扫描程序。 分析:键盘行线连8255输出口(输出0); 键盘列线连8255输入口(无按键时为1); 键盘有键按下时,8255输入口某位为0。 回下页
置行数=4、首行PA口=0FEH PA口输出0 读PB口 PA口输出 Y 置下行PA口参数,并保存 PB=0F? N 读PB口 检测各行: PA口某位 输出0, 读PB口, 检测并取得 按键值 当前行列PB 循环右移一位 N 按键非当前行? Y Y 置下行起始键号, 恢复下行PA口参数 找到列号, 并处理按键 CF=1? N 处理 按键 键号 加1 N 扫描完所有行? Y 程序流程图: 转上页 回下页
汇编程序: MOV AL,82H OUT 63H,AL ;初始化 BEGIN:MOV AL,0 OUT 60H,AL ;A口输出0 WAIT:IN AL,61H AND AL,0FH CMP AL,0FH JZ WAIT ;等待按键 MOV DL,4 ;行数 MOV AL,0FEH;0行PA MOV CH,0 ;键号0~15 SROW: OUT 60H,AL RCL AL,1 MOV AH,AL ;下行PA IN AL,61H AND AL,0FH CMP AL,0FH JNZ SCOL ;有键按下 ADD CH,4 ;下行键号 MOV AL,AH;当前行PA DEC DL JNZ SROW ;扫描下行 JMP BEGIN SCOL:RCR AL,1 ;找列号 JNC PROCE INC CH JMP SCOL PROCE:……;按键处理程序 转上页
2、方式1—选通I/O方式 可采用查询、中断方式进行通信。 (1)方式1的输入 回下页 回21页 回22页
外设给出 外设给出 PA0~PA7 STBA A口REG 8255给出 IBFA 软件设置 INTEA 允许=1、禁止=0 8255给出 INTRA CPU给出 (读C口REG) (读A口REG) b)状态REG产生变化,可产生INTRA中断请求; 中断产生条件:STBA=1、IBFA=1、INTEA=1 RD ①REG及引脚信息产生过程(内部逻辑自动实现): a)选通信号触发将A、B口引脚信息存入内部REG; c)CPU对A口REG的读操作使IBFA及INTRA复位。 注意:对C口REG的读操作不触发任何信号变化 转上页 回下页 回20页 回19页
D7 D6 D5 D4 D3 D2 D1 D0 A组状态 B组状态 输入时 输入时 I/O I/OIBFAINTEA INTRA INTEB IBFB INTRB ②状态口(C口)信息字与引脚: a)C口REG作为状态口,格式如下 b)PC4、PC2引脚仅用作触发A口、B口锁存引脚信息到内部REG,与C口REG(INTE)无对应关系; c)INTEA和INTEB为中断允许位,CPU可通过对C口的按位置位/复位操作方法设置为允许/禁止。 转上页 回24页 回21页
③查询方式通信(读取数据)编程: a)编程思路—利用数据口与状态口的内部控制逻辑; STBA有效→IBFA或/和INTRA有效→…→读A口REG →IBFA或/和INTRA无效→外设使STBA有效 b)编程方法—CPU检测(读C口REG)到IBFA或INTRA有效时,可读取A口数据(A口REG为有效数据)。 …… MOV AL,10110000B ;A口方式1输入,C口上半部输出 OUT PORTCN,AL MOV AL,00001001B ;置INTEA=1,允许中断 OUT PORTCN,AL ;若只查询IBFA时,可省略 WAIT:IN AL,PORTC ;读C口REG TEST AL,00100000B ;只检测IBFA JZ WAIT IN AL,POTRA;当IBFA=1时,A口REG数据有效 ……;处理完当前数据后,JMP WAIT 转17页 转10页
④中断方式通信(读取数据)编程: a)编程思路—利用数据口与状态口的内部控制逻辑; STBA有效→IBFA和INTRA有效→…→读A口REG →IBFA和INTRA无效→外设使STBA有效 b)编程方法—在中断服务程序中读A口数据(肯定有效)。 …… MOV AL,10110000B ;A口方式1输入,C口上半部输出 OUT PORTCN,AL MOV AL,00001001B ;必须置INTEA=1,允许中断 OUT PORTCN,AL ; …… RECVINT PROC ;中断服务程序 IN AL,POTRA;A口REG数据肯定是有效的 …… IRET RECVINT ENDP 转17页
⑤对C口数据口引脚的操作: PC7、PC6为C口的数据口引脚,对应C口REG的D7、D6位。 引脚信号方向—初始化(工作方式字)时设定; 操作实现—输出时用对C口按位置位/复位方法, 输入时可用对C口(字节)读操作方法。 例5:实现A口方式1输入时,用PC6输出高电平; A口方式1输入时,用PC6采集信号。 ;PC6输出高电平 MOV AL, 0B0H;A口方式1输入 OUT 63H,AL ;C口上半部输出 MOV AL, 00001101B OUT 63H,AL ;PC6采集信号 MOV AL, 0B8H;A口方式1输入 OUT 63H,AL ;C口上半部输入 IN AL,62H AND AL,40H ;01000000 转18页 回25页 转16页
与输入方式引脚的区别: 联络信号从STB、IBF变成了ACK、OBF; C口数据口引脚从PC6、PC7变成了PC4、PC5。 (2)方式1的输出 回下页 回24页 转16页
CPU给出 WRA A口REG 8255给出 OBFA 8255给出 PA0~PA7 软件设置 INTEA 允许=1,禁止=0 INTRA 8255给出 外设给出 ACKA CPU给出 (读C口REG) (读C口REG) b)ACKA信号变化,可产生INTRA中断请求; 中断产生条件:ACKA=0→1、INTEA=1 RD c)CPU对A口REG的写操作使OBFA有效及INTRA复位。 ①REG及引脚信息产生过程(内部逻辑自动实现): a)CPU写操作触发将数据送到A口、B口引脚; 转上页 回下页 回25页 回31页
D7 D6 D5 D4 D3 D2 D1 D0 A组状态 B组状态 输入时 输入时 I/O I/OIBFAINTEA INTRA INTEB IBFB INTRB 输出时 输出时 OBFAINTEA I/O I/O INTRA INTEB OBFB INTRB ②状态口(C口)信息字与引脚: a)C口REG作为状态口,格式如下 b)PC6、PC2引脚仅用作通知引脚数据已取走,触发状态REG变化,与C口REG(INTE)无对应关系; c)INTEA和INTEB为中断允许位,CPU可通过对C口的按位置位/复位操作方法设置为允许/禁止。 转上页 转22页 转18页
③查询方式通信(写入数据)编程: a)编程思路—利用数据口与状态口的内部控制逻辑; WRA有效(写A口REG)→OBFA有效或/和INTRA无效→… →ACKA有效→OBFA无效或/和INTRA有效→WRA有效 b)编程方法—CPU写完数据后,检测(读C口REG)到OBFA无效或INTRA有效时,可再次向A口写数据。 ④中断方式通信(写入数据)编程: a)编程思路—利用数据口与状态口的内部控制逻辑; WRA有效(写A口REG)→OBFA有效和INTRA无效→… →ACKA有效→OBFA无效和INTRA有效→WRA有效 b)编程方法—在中断服务程序中向A口写数据。 ⑤对C口数据口引脚(PC5、PC4)操作:同方式1输入 转21页 转23页
3、方式2 –双向选通I/O方式 是方式1的输入方式和输出方式的组合。 只有A口才有此方式。
主机→打印机 主机←打印机 主机←打印机 STROBE:输出,用于通知打印机接收数据; BUSY:输入,有效表示打印机正在接收并处理数据; ACK:输入,表示数据已取走,通知主机可传送下个数据。 五、8255应用举例 1、Centronics并行打印接口标准 回下页
读PC7(BUSY) Y N PC7=1? Y 待发送的是结束符? N PA口输出数据, PC0发一个脉冲 结束 2、Centronics并行打印接口应用 例6:假设利用8255的A口方式0与打印机相连,编程实现将内存缓冲区BUFF中字符串(以$结束)打印输出。 转上页
DATA SEGMENT BUFF DB ‘HELLO,WORLD!’,13,10,‘$’ PORTA EQU 60H PORTB EQU 61H PORTC EQU 62H PORTCN EQU 63H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFF MOV AL,88H ;A口方式0输出,C口上半部输入 OUT PORTCN,AL ;C口下半部输出 MOV AL,01H ;置位PC0,STB#无效 OUT PORTCN,AL 回下页
WAIT:IN AL,PORTC ;读打印机状态,若“忙”则等待 TEST AL,80H JZ WAIT MOV AL,[SI] CMP AL,‘$’ JZ PRINT_OVER OUT PORTA,AL ;发送数据 INC SI MOV AL,00H ;手工产生STB#, OUT PORTCN, AL ;打印机接收并打印数据 MOV AL,01H OUT PORTCN,AL JMP WAIT PRINT_OVER: …… 转上页
设计:CPU写数据后,8255A会使OBF有效,作为打印机的STB信号,打印机的ACK信号可用于使8255A产生中断。设计:CPU写数据后,8255A会使OBF有效,作为打印机的STB信号,打印机的ACK信号可用于使8255A产生中断。 打印输出过程中的应答信号均自动产生。 8255 打印机 D7-D0 D7-D0 PA7-PA0 D7-D0 IOW WR IOR RD (OBFA)PC7 STB (ACKA)PC6 ACK A1 A1 A0 A0 (INTR)PC3 A7-A2=011000 至8259 例7:假设利用8255的A口方式1与打印机相连,编程实现将内存缓冲区BUFF中字符串打印输出。 思考:利用8255的B口实现该功能时如何接线? 回下页 转23页
DATA SEGMENT ;定义BUFF,PORTA、PORTB、PORTC、PORTCN DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ;保存原来和设置新中断向量 MOV SI,OFFSET BUFF MOV AL,0C0H ;A口方式1输出,C口上半部输出 OUT PORTCN,AL MOV AL,0DH ;置INTEA=1 OUT PORTCN,AL ;中断方式通信时,必须置位 MOV AL,[SI] ;发送第一个字符 OUT PORTA, AL ;发送完后会自动产生OBF# INC SI …… MOV AH,4CH INT 21H 转上页
SENDSRV PROC ;中断服务程序 …… MOV AL,[SI] CMP AL,‘$’ JZ PRT_OVER OUT PORTA, AL ;打印机产生的ACK#, ;可触发8255再次产生中断 INC SI PRT_OVER:…… ;中断手工结束方式时,需发EOI命令 IRET SENDSRV ENDP CODE ENDS END START
3、8255A应用之一—检测LS138 使用8255A(端口地址60H~63H)实现对74LS138功能的检测,画出检测电路图,编写相应程序。
8255A 74LS138 15 1 Y0 D7-D0 A 14 2 PA2-PA0 D7-D0 B 74LS138 13 3 C IOW WR 12 5 11 IOR RD G2B PA5-PA3 4 10 G2A 6 9 A1 A1 G1 7 Y7 A0 A0 PB7-PB0 CS A7-A2=011000 思路: 8255A的PA口输出到74LS138的CBA、Gx等入端, PB口检测74LS138的Yx; 8255A采用方式0枚举所有输入,检测输出。 电路图: 回下页
CODE SEGMENT ASSUME CS:CODE START:MOV AL,82H ;A口方式0输出,B口方式0输入 OUT 63H,AL MOV DL,3FH ;DL为PA口输出的数据 TST: MOV AL,DL OUT 60H,AL ;PA口输出数据到138的入端 CALL DELAY1US ;延时1μs IN AL,61H ;读138的Yx(PB口数据) MOV AH,AL MOV AL,DL AND AL,38H ;只留下G1、G2A#、G2B#(00111000) CMP AL,20H ;判断是否为00100000 JNZ GN100 ;非G1=1,G2A#=G2B#=0时转S2 转上页
;当G1=1,G2A#=G2B#=0时,应某一Yx有效 G100: MOV AL,DL AND AL,07H ;只取CBA数据(00000111) ROR AH,AL ;将有效位移至位0 CMP AH,0FEH JNZ ERROR JMP NEXT GN100:MOV AL,AH ;当非G1=1,G2A#=G2B#=0时,Yx应全无效 CMP AL,0FFH JNZ ERROR NEXT: DEC DL JNZ TST JMP SUCCESS ERROR:……;显示检测出错信息 SUCCESS:……;显示检测正确信息
4、8255A应用之二—指示灯定时控制 用8259、8254、8255A(端口地址分别为10H~11H、20H~23H、30H~33H)实现指示灯的控制(轮流点亮8个指示灯之一,每秒换一个灯),74LS138负责I/O芯片片选译码(I/O地址线共10根)。已知有一个1kHz的标准脉冲信号源可用。为节省CPU时间,要求采用中断方式完成功能。 思路: ⑴ 74LS138负责所有芯片的译码; ⑵ 8254负责产生定时信号给8259产生中断; ⑶ 8255A负责对灯的控制,在中断服务程序中完成。 回40页
15 1 Y0 A 14 2 B 74LS138 13 CPU MEM 3 C 12 5 11 数据总线 4 10 地址总线 6 9 控制总线 G1 7 Y7 A4 A5 A6 AEN A7 A8 A9 IO/M G2A G2B 74LS138连接电路: 回下页
CPU MEM 数据总线 地址总线 控制总线 D7-D0 IR0 IR4 IR7 Y1 A3 A2 A1 CS CS CS A0 D7-D0 D7-D0 RD WR RD WR RD WR CLK0 GATE0 OUT0 CLK1 GATE1 OUT1 PA7 PA0 8259A Y2 A3 A2 Y3 A3 A2 A1 A0 A1 A0 8255A 8254 8259A、8254、8255A的CPU侧连接电路: 转上页 转38页
+5V 设计: (1)8254采用方式2,每秒产生一个负脉冲; 思考:当需要采用多片8254时,如何实现? (2)8259A采用边沿触发,防遗漏和重复中断; 思考:采用电平触发时,8254负脉冲是否够宽或太宽? (3)8255A输出1时灯不亮,输出0时灯亮; (4)8254的T/C0的GATE由8255A提供0→1的变化。 转下页
CPU MEM 数据总线 地址总线 控制总线 +5V D7-D0 IR0 IR4 IR7 1kHz CS CS CS A0 D7-D0 D7-D0 RD WR RD WR RD WR CLK0 GATE0 OUT0 CLK1 GATE1 OUT1 PA7 PA0 PC0 8259A A1 A0 A1 A0 × × 8254 8255A 8259A、8254、8255A的外设侧连接电路: 回上页 转下页
实现功能的对应程序: DATA SEGMENT CTRL DB 11111110B ;用于控制8个灯中的一个 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START:MOV AX, DATA MOV DS, AX MOV SI, OFFSET CTRL MOV AL,10000000B ;设置8255工作于方式0, ;A组输出,C口输出 OUT 33H,AL MOV AL,00000000B ;置PC0为低电平 OUT 33H,AL 回上页
MOV AL,00100101B ;8254的T/C0工作于方式3, ;只写高字节,BCD码 OUT 23H,AL MOV AL,10H ;T/C0计数初值为1000 OUT 20H,AL MOV AL,00010010B ;8259的ICW1:边沿触发, OUT 10H,AL ;不要ICW3、ICW4 MOV AL,00001000B ;8259的ICW2:起始中断类型为08H OUT 11H,AL MOV AL,11101111B ;开放8259的IR4中断 OUT 11H,AL ;保存原来的0CH中断向量 MOV AX,CODE MOV DS,AX MOV DX,OFFSET CTRLLAMP MOV AX,250CH ;写入新的0CH中断向量 INT 21H
MOV AL,00000001B ;设置PC0从0到1,8254开始计数 OUT 33H,AL …;CPU进行其它工作 EXIT:MOV AH,0 ;退出程序 INT 21H CTRLLAMP PROC ;中断服务程序 PUSH AX MOV AL,[SI] ;取当前应打开的灯的数据 OUT 30H,AL ROL AL ;产生下次应打开的灯的数据 MOV [SI],AL ;将下次应打开的灯的数据保存 POP AX IRET CTRLLAMP ENDP CODE ENDS END START
甲机8255 乙机8255 PA7-PA0 PB7-PB0 D7-D0 D7-D0 D7-D0 D7-D0 PB7-PB0 PA7-PA0 (OBFA)PC7 PC2(STBB) IOW IOW WR WR (ACKA)PC6 PC5(I/O) IOR IOR RD RD (STBB)PC2 PC7(OBFA) (I/O)PC5 PC6(ACKA) A1 A1 A1 A1 (INTRA)PC3 PC3(INTRA) A0 A0 A0 A0 (INTRB)PC0 PC0(INTRB) A9-A2=00011000 A9-A2=00011000 至A机8259 至B机8259 5、8255应用之三—中断方式双机双向8位通信 主程序:完成2个中断服务程序入口填入向量表, 8255初始化(中断方式),必要的数据准备; 中断服务程序:发送或接收数据、处理数据、返回。
DATA SEGMENT SENDBUFF DB ‘HELLO,WORLD!’,13,10,‘$’ RECVBUFF DB 64 DUP(?) ……;定义PORTA、PORTB、PORTC、PORTCN OLDOC DD ? OLD0D DD ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,350CH ;保存原来的0CH中断向量 INT 21H MOV WORD PTR OLD0C,BX MOV WORD PTR OLD0C+2,ES MOV AX,350DH ;保存原来的0CH中断向量 INT 21H MOV WORD PTR OLD0D,BX MOV WORD PTR OLD0D+2,ES
MOV AX,CODE ;写入新的0CH中断向量 MOV DS,AX MOV DX,OFFSET SENDSVR MOV AX,250CH INT 21H MOV AX,CODE ;写入新的0DH中断向量 MOV DS,AX MOV DX,OFFSET RECVSVR MOV AX,250DH INT 21H MOV AX,DATA ;恢复DS MOV DS,AX MOV SI,OFFSET SENDBUFF MOV DI,OFFSET RECVBUFF
MOV AL,0A6H ;8255A口方式1输出,B口输入 OUT PORTCN,AL ;C口上半部输出 MOV AL,0DH ;置INTEA=1 OUT PORTCN,AL MOV AL,05H ;置INTEB=1 OUT PORTCN,AL MOV AL,0BH ;? OUT PORTCN,AL MOV AL,[SI] ;发送第一个字符 OUT PORTA, AL ;发送完后会自动产生OBFA# INC SI …… MOV AH,4CH INT 21H
RECVSVR PROC ;接收 PUSHA IN AL,PORTB MOV [DI],AL INC DI ……;处理 MOV AL,0AH;产生脉冲 OUT PORTCN, AL MOV AL,0BH OUT PORTCN,AL POPA IRET RECVSVR ENDP CODE ENDS END START SENDSVR PROC ;发送 PUSHA MOV AL,[SI] CMP AL,‘$’ JZ EXIT OUT PORTA, AL INC SI JMP EXIT EXIT: POPA IRET SENDSVR ENDP 思考:如何实现双机间16位单向传输?