第 11 章
教学重点 8255A的工作方式和编程 8255A的应用 简易键盘的扫描程序 LED数码管的多位显示 第11章 并行接口 教学重点 8255A的工作方式和编程 8255A的应用 简易键盘的扫描程序 LED数码管的多位显示
并行数据传输方式 以计算机的字长,通常是8位、16位或32位为传输单位, 一次传送一个字长的数据 适合于外部设备与微机之间进行近距离、大量和快速的 信息交换 例如:微机与并行接口打印机、磁盘驱动器 微机系统中最基本的信息交换方法 例如:系统板上各部件之间,接口电路板上各部件之间
11.1 并行接口电路8255A 具有多种功能的可编程并行接口电路芯片 分3个端口,共24个外设引脚 共三种输入输出工作方式 最基本的接口电路:三态缓冲器和锁存器 与CPU间、与外设间的接口电路:状态寄存器和控制寄存器 还有端口的译码和控制电路、中断控制电路 分3个端口,共24个外设引脚 共三种输入输出工作方式
11.1.1 8255A的内部结构和引脚 数据 总线 缓冲器 内部控制线 内部数据线 D0~D7 A组 控制 端口A 端口C 上部 B组 下部 读写 逻辑 PC0~PC3 PB0~PB7 PC4~PC7 PA0~PA7 RD WR A0 A1 CS RESET
1. 外设数据端口 端口A:PA0~PA7 端口B:PB0~PB7 端口C:PC0~PC7 常作数据端口,功能最强大 常作数据端口 1. 外设数据端口 端口A:PA0~PA7 A组,支持工作方式0、1、2 端口B:PB0~PB7 B组,支持工作方式0、1 端口C:PC0~PC7 仅支持工作方式0 A组控制高4位PC4~PC7 B组控制低4位PC0~PC3 端口A:PA0~PA7 常作数据端口,功能最强大 端口B:PB0~PB7 常作数据端口 端口C:PC0~PC7 可作数据、状态和控制端口 分两个4位,每位可独立操作 控制最灵活,最难掌握
2. 与处理器接口 D0 ~ D7数据线 A0 ~ A1地址线 RD*读信号 WR*写信号 CS*片选信号 RESET复位信号 2. 与处理器接口 D0 ~ D7数据线 A0 ~ A1地址线 RD*读信号 WR*写信号 CS*片选信号 RESET复位信号 CS* A1 A0 I/O地址 读操作RD* 写操作WR* 0 0 0 0 0 1 0 1 0 0 1 1 60H 61H 62H 63H 读端口A 读端口B 读端口C 非法 写端口A 写端口B 写端口C 写控制字
11.1.2 8255A的工作方式 方式0:基本输入输出方式 方式1:选通输入输出方式 方式2:双向选通传送方式 适用于无条件传送和查询方式的接口电路 方式1:选通输入输出方式 适用于查询和中断方式的接口电路 方式2:双向选通传送方式 适用于与双向传送数据的外设
方式0输入时序 data 输入端口 D0~D7 RD CS,A1,A0 请体会这里8255A的数据缓冲作用
8255A对CPU通过它输出给外设的数据进行锁存 方式0输出时序 WR data 输出端口 D0~D7 CS,A1,A0 8255A对CPU通过它输出给外设的数据进行锁存
方式1输入引脚:A端口 数据选通信号 表示外设已经准备好数据 PA7~PA0 PC4 STBA PC5 IBFA 输入缓冲器满信号 INTEA IBFA INTRA STBA 中断允许触发器 输入缓冲器满信号 表示A口已经接收数据 中断请求信号 请求CPU接收数据
方式1需借用端口C用做联络信号 同时还具有中断请求和屏蔽功能 方式1输入引脚:B端口 PC2 PC1 PC0 PB7~PB0 INTEB IBFB INTRB STBB 数据选通信号 表示外设已经准备好数据 输入缓冲器满信号 表示A口已经接收数据 中断请求信号 请求CPU接收数据 中断允许触发器 方式1需借用端口C用做联络信号 同时还具有中断请求和屏蔽功能
方式1输入联络信号 STB*——选通信号,低电平有效 IBF——输入缓冲器满信号,高电平有效 INTR——中断请求信号,高电平有效 由外设提供的输入信号,当其有效时,将输入设备送来 的数据锁存至8255A的输入锁存器 IBF——输入缓冲器满信号,高电平有效 8255A输出的联络信号。当其有效时,表示数据已锁存在 输入锁存器 INTR——中断请求信号,高电平有效 8255A输出的信号,可用于向CPU提出中断请求,要求CPU 读取外设数据
STB*和IBF是外设和8255A间 的一对应答联络信号, 为的是可靠地输入数据 方式1输入时序 data INTR IBF 输入端口 D0~D7 STB RD STB*和IBF是外设和8255A间 的一对应答联络信号, 为的是可靠地输入数据
方式1中断控制 8255A的中断由中断允许触发器INTE控制 置位允许中断,复位禁止中断 对INTE的操作通过写入端口C的对应位实现,INTE触发器 对应端口C的位是作应答联络信号的输入信号的哪一位, 只要对那一位置位/复位就可以控制INTE触发器 选通输入方式下 端口A的INTEA对应PC4 端口B的INTEB对应PC2
方式1输出引脚:A端口 外设响应信号 表示外设已经接收到数据 PA7~PA0 PC6 ACKA PC7 OBFA 输出缓冲器满信号 INTEA OBFA INTRA ACKA 中断允许触发器 输出缓冲器满信号 表示CPU已经输出了数据 中断请求信号 请求CPU再次输出数据
方式1输出引脚:B端口 外设响应信号 表示外设已经接收到数据 PB7~PB0 PC2 ACKB PC1 OBFB 输出缓冲器满信号 INTEB OBFB INTRB ACKB 外设响应信号 表示外设已经接收到数据 输出缓冲器满信号 表示CPU已经输出了数据 中断请求信号 请求CPU再次输出数据 中断允许触发器
端口A的INTEA对应PC6 端口B的INTEB对应PC2 方式1输出联络信号 OBF*——输出缓冲器满信号,低有效 8255A输出给外设的一个控制信号,当其有效时,表示 CPU已把数据输出给指定的端口,外设可以取走 ACK*——响应信号,低有效 外设的响应信号,指示8255A的端口数据已由外设接受 INTR——中断请求信号,高有效 当输出设备已接受数据后,8255A输出此信号向CPU提出 中断请求,要求CPU继续提供数据 端口A的INTEA对应PC6 端口B的INTEB对应PC2
OBF*和ACK*是外设和8255A间 的一对应答联络信号, 为的是可靠地输出数据 方式1输出时序 INTR data 输出端口 D0~D7 WR OBF ACK OBF*和ACK*是外设和8255A间 的一对应答联络信号, 为的是可靠地输出数据
方式2双向方式 方式2将方式1的选通输入输出功能组合成一个双 向数据端口,可以发送数据和接收数据 只有端口A可以工作于方式2,需要利用端口C的 5个信号线,其作用与方式1相同 方式2的数据输入过程与方式1的输入方式一样 方式2的数据输出过程与方式1的输出方式有一点 不同:数据输出时8255A不是在OBF*有效时向 外设输出数据,而是在外设提供响应信号ACK* 时才送出数据
方式2双向引脚 PA7~PA0 用PC6设置INTE1(输出) PC6 ACKA 用PC4设置INTE2(输入) 输入和输出中断通过 PC7 OBFA INTRA ACKA PC4 PC5 IBFA STBA INTE2 用PC6设置INTE1(输出) 用PC4设置INTE2(输入) 输入和输出中断通过 或门输出INTRA信号
方式2双向时序 data-out INTR data-in PA0~PA7 D0~D7 IBF WR OBF ACK STB RD
11.1.3 8255A的编程 初始化编程:一个方式控制字 工作过程中:通过数据端口对外设数据进行读写 采用控制I/O地址:A1A0=11 工作过程中:通过数据端口对外设数据进行读写 数据读写利用端口A、B和C的I/O地址,A1A0依次等于00、01、10 IBM PC/XT机上,端口A、B、C和控制端口的I/O地址 为60H、61H、62H和63H
1. 写入方式控制字:控制字格式
1. 写入方式控制字:示例 要求: 方式控制字:10110001B或B1H 初始化的程序段: 1. 写入方式控制字:示例 要求: A端口:方式1输入 C端口上半部:输出,C口下半部:输入 B端口:方式0输出 方式控制字:10110001B或B1H 初始化的程序段: mov dx,0fffeh ;假设控制端口为FFFEH mov al,0b1h ;方式控制字 out dx,al ;送到控制端口
2. 读写数据端口 初始化编程后: 8255A具有锁存输出数据的能力 当数据端口作为输入接口时,执行输入IN指令将从输入设备得到外设数据 2. 读写数据端口 初始化编程后: 当数据端口作为输入接口时,执行输入IN指令将从输入设备得到外设数据 当数据端口作为输出接口时,执行输出OUT指令将把CPU的数据送给输出设备 8255A具有锁存输出数据的能力 对输出方式的端口同样可以输入 不是读取外设数据 读取的是上次CPU给外设的数据
2. 读写数据端口:示例 利用8255A的输出锁存能力,可实现按位输出控制 对输出端口B的PB7位置位的程序段: 2. 读写数据端口:示例 利用8255A的输出锁存能力,可实现按位输出控制 对输出端口B的PB7位置位的程序段: mov dx,0fffah ;B端口假设为FFFAH in al,dx ;读出B端口原输出内容 or al,80h ;使PB7=1 out dx,al ;输出新的内容
3. 读写端口C:归纳1 在控制上,C端口上半部和A端口编为A组,C端口下半部和B端口编为B组
3. 读写端口C:归纳2 当A和B端口工作在方式 1或方式2时,C端口的 部分或全部引脚将被征 用 其余引脚仍可设定工作在方式0
3. 读写端口C:归纳3 对端口C的数据输出有两种办法 通过端口C的I/O地址:向C端口直接写入字节数据。这 一数据被写进C端口的输出锁存器,并从输出引脚输出, 但对设置为输入的引脚无效 通过控制端口:向C端口写入位控字,使C端口的某个引 脚输出1或0,或置位复位内部的中断允许触发器
端口C的位控制字 位控制字写入控制端口 特别便于置位复位内部中断允许 触发器INTE
3. 读写端口C:归纳4 读取的C端口数据有两种情况 未被A和B端口征用的引脚:将从定义为输入的端口读到 引脚输入信息;将从定义为输出的端口读到输出锁存器 中的信息 被A和B端口征用作为联络线的引脚:将读到反映8255A 状态的状态字
端口C的状态字 A组 B组 方式1输入 方式1输出 方式2双向 D7 D6 D5 D4 D3 D2 D1 D0 I/O IBFA INTEA INTRA INTEB IBFB INTRB 方式1输出 OBFA OBFB 方式2双向 INTE1 INTE2 ×
11.2 8255A的应用 作为通用的并行接口电路芯片,825A具有广泛 的应用 应用在IBM PC/XT微机上 应用于打印机接口电路 连接简易键盘 驱动LED数码管 ……
11.2.1 8255A在IBM PC/XT上的应用 工作在基本输入/输出方式0 系统的初始化编程: mov al,10011001b ;方式控制字99H out 63h,al
打印机接口的信号与时序 主机把数据送给引脚DATA0~DATA7 同时送出数据选通信号STROBE* 打印机在BUSY信号线上发出忙信号 打印机处理好输入的数据时 撤消忙信号 同时又送出一个响应信号ACK* BUSY DATA0~7 ACK STROBE
11.2.2 用8255A方式0与打印机接口 BUSY DATA0~7 8255A PC7 PC2 PA0~PA7 打印机 STROBE
8255A的初始化 例11.1 mov dx,0fffeh ;控制端口地址:FFFEH mov al,10000001B out dx,al ;A端口方式0输出,C端口上输出、下输入 mov al,00001111B ;端口C的复位置位控制字,使PC7=1 例11.1
打印子程序:查询 例11.1 printc proc push ax push dx prn: mov dx,0fffch ;读取端口C in al,dx ;查询打印机状态 and al,04h ;PC2=BUSY=0? jnz prn ;PC2=1,打印机忙,则循环等待 例11.1
打印子程序:输出 例11.1 mov dx,0fff8h ;PC2=0,打印机不忙,则输出数据 mov al,ah out dx,al ;将打印数据从端口A输出 例11.1
打印子程序:打印 例11.1 mov dx,0fffeh ;从PC7送出控制低脉冲 mov al,00001110B ;置STROBE*=0 out dx,al nop ;产生一定宽度的低电平 nop mov al,00001111B ;置=1 ;最终,STROBE*产生低脉冲信号 例11.1
打印子程序:返回 pop dx pop ax ret printc endp 例11.1
11.2.3 用8255A方式1与打印机接口 1000pf 2K 15 3 2 14 4 1 LS123 单稳 电路 +5V DATA0~7 PC6 INTR PC3 PC7 PA0~PA7 打印机 ACK OBF STROBE
8255A方式1与打印机接口时序配合 PA0~PA7 (DATA0~7) ACK OBF STROBE 方式1时序 打印机时序
8255A的初始化 例11.2 mov dx,0fffeh mov al,0a0h out dx,al mov al,0ch ;使INTEA(PC6)为0,禁止中断 …… mov cx,counter ;打印字节数送CX mov bx,offset buffer ;取字符串首地址 call prints ;调用打印子程序 例11.2
打印子程序:输出 例11.2 prints proc push ax ;保护寄存器 push dx print1: mov al,[bx] ;取一个数据 mov dx,0fff8h out dx,al ;从端口A输出 例11.2
打印子程序:查询 例11.2 mov dx,0fffch print2: in al,dx test al,80h ;检测(PC7)为1否? jz print2 ;为0,说明打印机没有响应,继续检测 例11.2
打印子程序:返回 例11.2 inc bx ;为1,说明打印机已接受数据 loop print1 ;准备取下一个数据输出 pop dx ;打印结束,恢复寄存器 pop ax ret ;返回 prints endp 例11.2
11.2.4 双机并行通信接口 PA0~PA7 PC4 PC0 8255A 甲方(发送) PC7 PC6 已方(接收)
甲机的初始化 例11.3 mov dx,0fffeh mov al,0a0h out dx,al ;工作方式字:端口A方式1输出 mov al,0dh ;使PC6(INTEA)=1,允许中断 例11.3
甲机发送程序 例11.3 trsmt: mov dx,0fffch in al,dx ;查询PC3(INTRA)=1? and al,08h jz trsmt mov dx,0fff8h ;发送数据 mov al,ah out dx,al 例11.3
乙机的初始化 例11.3 mov dx,0fffeh mov al,98h out dx,al ;工作方式字:端口A方式0输入 ;使PC0(ACK*)=1,因尚未收到数据 例11.3
乙机:查询接收 例11.3 receive: mov dx,0fffch in al,dx ;查询PC4(OBF*)=0? and al,10h jnz receive mov dx,0fff8h ;接收数据 mov ah,al 例11.3
乙机:接收响应 例11.3 mov dx,0fffeh mov al,00h ;使PC0(ACK*)=0 out dx,al nop ;适当延时,产生一定宽度的低脉冲 mov al,01h ;使PC0(ACK*)=1 out dx,al ;产生低脉冲ACK*信号 例11.3
请在对比过程中,掌握例题、习题和完成实验要求 要求⑴类似习题11.8 要求⑵对应例题11.2 实验5 并行接口实验 请在对比过程中,掌握例题、习题和完成实验要求 要求⑴类似习题11.8 要求⑵对应例题11.2 提示
11.3 键盘及其接口 键盘是微机系统最常使用的输入设备 小键盘:适用于单板机或以微处理器为基础的仪器,实 现数据、地址、命令及指令等的输入 11.3 键盘及其接口 键盘是微机系统最常使用的输入设备 小键盘:适用于单板机或以微处理器为基础的仪器,实 现数据、地址、命令及指令等的输入 独立键盘:通过5芯电缆与PC微机主机连接
11.3.1 简易键盘的工作原理 最简单的线性结构键盘 每一个引脚连接一个键 输入0/1反映健是否高低 +5V
11.3.1 简易键盘的工作原理 常用的矩阵结构键盘 检 测 线 控制线 +5V 每行连接一个引脚 每列连接一个引脚 11.3.1 简易键盘的工作原理 常用的矩阵结构键盘 每行连接一个引脚 每列连接一个引脚 利用控制线为低、 读取检测线来识别闭合键 +5V 控制线 检 测 线
1. 扫描法 先使第0行接低电平,其余行为高电平,然后看 第0行是否有键闭合(通过检查列线电位实现) 1. 扫描法 先使第0行接低电平,其余行为高电平,然后看 第0行是否有键闭合(通过检查列线电位实现) 此后,再将第1行接地,然后检测列线是否有变 为低电位的线。如此往下一行一行地扫描,直 到最后一行 在扫描过程中,当发现某一行有键闭合时,便 在扫描中途退出 通过组合行线和列线可识别此刻按下的是哪一 键
第1段:是否有键按下 键盘扫描程序 key1: mov al,00 mov dx,rowport out dx,al ;使所有行线为低电平 mov dx,colport in al,dx ;读取列值 cmp al,0ffh ;判定是否有列线为低电平 jz key1 ;无闭合键,循环等待 call delay ;有,延迟20ms清除抖动 键盘扫描程序
第2段:识别按键(扫描) 键盘扫描程序 mov cx,8 ;行数送CX mov ah,0feh ;扫描初值送AH key2: mov al,ah mov dx,rowport out dx,al ;输出行值(扫描值) mov dx,colport in al,dx ;读进列值 键盘扫描程序
第2段:识别按键(判断) 键盘扫描程序 cmp al,0ffh ;判断有无低电平的列线 jnz key3 ;有,则转下一步处理 rol ah,1 ;无,则移位扫描值 loop key2 ;准备下一行扫描 jmp key1 ;所有行都没有键按下,则返回继续检测 key3: …… ;此时,al=列值,ah=行值 键盘扫描程序
条件:连接行线和列线的接口电路 必须支持动态改变输入、输出方式 2. 反转法 首先,将行线作为控制线接一个输出端口,将 列线作为检测线接一个输入端口 CPU通过输出端口将行线(控制线)全部设置为低电平, 然后从输入端口读取列线(检测线) 然后,将行线和列线的作用互换,即将列线作 为控制线接输出端口,行线作为检测线接输入 端口 将刚才读得的列值从列线所接端口输出,再读取行线的 输入值 这样,当一个键被按下时,必定可以读得一对 唯一的行值和列值 条件:连接行线和列线的接口电路 必须支持动态改变输入、输出方式
第1段:是否有键按下 键盘扫描程序 …… ;设置行线接输出端口,列线接输入端口 key2: mov al,00 mov dx,rowport out dx,al ;设置行线全为低 mov dx,colport in al,dx ;读取列值 cmp al,0ffh jz key2 ;无闭合键,循环等待 push ax ;有闭合键,保存列值 push ax 键盘扫描程序
第2段:识别按键(反转法) 键盘扫描程序 …… ;设置行线接输入端口,列线接输出端 mov dx,colport pop ax out dx,al ;输出列值 mov dx,rowport in al,dx ;读取行值 pop bx ;组合行列值 mov ah,bl ;此时,al=行值,ah=列值 键盘扫描程序
行列值表和键代码表 键盘扫描程序 ;键盘的行列值表 table dw 0fefeh ;键0的行列值(键值) dw 0fdfeh ;键1的行列值 dw 0fbfeh ;键2的行列值 …… ;其他键的行列值 ;键盘的键代码表 char db …… ;键0的代码值 db …… ;键1的代码值 …… ;其他键的代码值 键盘扫描程序
第3段:查找键代码 键盘扫描程序 mov si,offset table mov di,offset char mov cx,64 ;CX=键的个数 key3: cmp ax,[si] ;与键值比较 jz key4 ;相同,说明查到 inc si ;不相同,继续比较 inc si inc di loop key3 jmp key1 ;全部比较完,仍无相同,说明是重键 键盘扫描程序
第4段:等待按键释放 键盘扫描程序 key4: mov al,[di] ;获取键代码送AL …… ;判断按键是否释放,没有则等待 call delay ;按键释放,延时消除抖动 …… ;后续处理 键盘扫描程序
3. 抖动和重健问题 机械按键存在抖动现象 重键指两个或多个键同时闭合 3. 抖动和重健问题 机械按键存在抖动现象 当按下或释放一个键时,往往会出现按键在闭合位置和 断开位置之间跳几下才稳定到闭合状态 抖动的持续时间通常不大于10ms 采用硬件消抖电路或软件延时方法解决 重键指两个或多个键同时闭合 出现重键时,读取的键值必然出现有一个以上的0 是否给予识别和识别哪一个键
重健问题的处理 简单情况:不予识别,认为是错误的按键 通常情况:只承认先识别出来的键 正常的组合键:都识别出来 连锁法:直到所有键都释放后,读入下一个键 巡回法:等被识别的键释放以后,就可以对其他闭合键作识别,而不必等待全部键 释放 正常的组合键:都识别出来
11.3.2 PC机键盘的工作原理 DB PB6 PB7 PA IRQ1 T1 P10 P21 P11 P22 P20 4 GND 1 CLOCK 2 DATA 5 +5V 3 RESET PC机键盘 系统板 8048 8255A 8259A LS322 串 并 转 换 器 键 盘 阵 列 按键 选通
接通扫描码反映该键在键盘上的位置 断开扫描码(接通扫描码最高位置1) =接通扫描码+80H 1. PC机键盘的工作过程 键盘电路正常工作时不断地扫描键盘矩阵 有按键,则确定按键位置之后以串行数据形式发送给系 统板键盘接口电路 键按下时,发送该键的接通扫描码 键松开时,发送该键的断开扫描码 若一直按住某键,则以拍发速率(每秒2~30次)连续 发送该键的接通扫描码 接通扫描码反映该键在键盘上的位置 断开扫描码(接通扫描码最高位置1) =接通扫描码+80H
2. 键盘接口电路的工作过程 接收一个串行形式字符以后,进行串并转换 然后产生键盘中断IRQ1请求,等待读取键盘数据 2. 键盘接口电路的工作过程 接收一个串行形式字符以后,进行串并转换 然后产生键盘中断IRQ1请求,等待读取键盘数据 CPU响应中断,则进入09H键盘中断服务程序: ① 读取键盘扫描码:用IN AL,60H即可 ② 响应键盘:系统使PB7=1 ③ 允许键盘工作:系统使PB7=0 ④ 处理键盘数据 ⑤ 给8259A中断结束EOI命令,中断返回
3. PC机键盘中断服务程序 09H号中断服务程序(kbint过程) 键盘I/O功能程序(kbget子程序) 功能调用(主程序) 完成常规的操作 处理键盘数据:将获取的扫描码通过查表转换为对应的ASCII码送缓冲区。对于不能 显示的按键,则转换为0,且不再送至缓冲区 键盘I/O功能程序(kbget子程序) 从缓冲区中读取转换后的ASCII码 功能调用(主程序) 循环显示键入的字符
键盘缓冲区 中断服务程序与子程序之间传递参数 先进先出循环队列 队列空 进队列 出队列 队列满 buffer 1 2 9 队列始端 队列末端
键盘缓冲区 例11.4 buffer db 10 dup(0) bufptr1 dw 0 ;队列头指针 1 2 9 bufptr1 队列始端 bufptr2 队列末端 例11.4
键盘代码表 例11.4 scantb db 0,1,’1234567890-=’,08h ;键盘第1排的按键,从ESC到退格 db 0,’qwertyuiop[]’,0dh ;键盘第2排的按键,从Tab到回车 …… db 0,0,’789-456+1230.’ ;右边小键盘,从Num Lock到Del 例11.4
设置中断向量1 例11.4 mov ax,3509h int 21h push es push bx ;保存09H号原中断向量 cli ;关中断 push ds ;设置09H号新中断向量 mov ax,seg kbint mov ds,ax mov dx,offset kbint 例11.4
设置中断向量2 例11.4 mov ax,2509h int 21h pop ds in al,21h ;允许IRQ1中断,其他不变 push ax and al,0fdh out 21h,al sti ;开中断 例11.4
调用并显示 例11.4 start1: call kbget ;获取按键的ASCII码 cmp al,1 jz start2 ;是ESC键,则退出 push ax ;保护字符 mov dl,al ;显示字符 mov ah,2 int 21h pop ax ;恢复字符 例11.4
处理回车符 例11.4 cmp al,0dh ;该字符是回车符吗? jnz start1 ;不是,取下一个按键字符 mov dl,0ah ;是回车符,则再进行换行 mov ah,2 int 21h jmp start1 ;继续取字符 例11.4
恢复中断向量 例11.4 start2: cli pop ax out 21h,al pop dx pop ds mov ax,2509h int 21h sti mov ax,4c00h ;返回DOS 例11.4
子程序:判断缓冲区空否 例11.4 kbget proc kbget1: push bx ;保护BX cli mov bx,bufptr1 ;取头指针 cmp bx,bufptr2 ;与尾指针相等否? jnz kbget2 ;不相等,说明缓冲区有字符,转移 sti ;相等,说明缓冲区空 pop bx jmp kbget1 ;等待缓冲区有字符 例11.4
子程序:获取按键字符 例11.4 kbget2: mov al,buffer[bx] ;取字符送AL inc bx ;队列头指针增量 cmp bx,10 ;是否指向队列末端 jc kbget3 ;没有,转移 mov bx,0 ;指针指向队列末端,则循环,指向始端 kbget3: mov bufptr1,bx ;设定新队列头指针 sti pop bx ret kbget endp 例11.4
中断服务程序:响应键盘 例11.4 kbint proc sti ;开中断 push ax ;保护寄存器 push bx in al,60h ;读取键盘扫描码 push ax in al,61h ;使PB7=1,响应键盘 or al,80h out 61h,al and al,7fh ;使PB7=0,允许键盘 例11.4
中断服务程序:数据处理 例11.4 test al,80h ;是断开扫描码? jnz kbint2 ;是,则退出 pop ax test al,80h ;是断开扫描码? jnz kbint2 ;是,则退出 mov bx,offset scantb ;是接通扫描码,取表首地址 xlat ;将扫描码转换成ASCII码 cmp al,0 ;是否为合法的ASCII码? jz kbint2 ;不是,则退出 例11.4
中断服务程序:指针增量 例11.4 mov bx,bufptr2 mov buffer[bx],al ;将ASCII码存入缓冲区队列尾 inc bx ;队列尾指针增量 cmp bx,10 ;是否指向队列末端? jc kbint1 ;没有,转移 mov bx,0 ;指针指向队列末端,则循环,指向始端 例11.4
中断服务程序:判断缓冲区满否 例11.4 kbint1: cmp bx,bufptr1 jz kbint2 ;若队列满,则退出 mov bufptr2,bx ;队列不满,设置新的队列尾指针 buffer 41H 31H 1 32H 2 39H 9 队列始端 bufptr2 bufptr1 队列末端 例11.4
中断服务程序:中断返回 例11.4 kbint2: mov al,20h ;向8259A发送普通中断结束命令 out 20h,al pop bx ;恢复寄存器 pop ax iret ;中断返回 kbint endp 例11.4
认真阅读教材中扫描法和反转法识别按键的程序段 延时子程序也可以采用实时时钟的硬件延时,它更精 确 延时子程序可以采用软件延时程序 实验6 小键盘实验 认真阅读教材中扫描法和反转法识别按键的程序段 延时子程序也可以采用实时时钟的硬件延时,它更精 确 延时子程序可以采用软件延时程序 提示
11.4 LED数码管及其接口 发光二极管LED是最简单的显示设备 由7段LED就可以组成的LED数码管
1. LED数码管的工作原理 主要部分是7段发光管 顺时针分别称为a、b、c、d、e、f、g 有的产品还附带有一个小数点h 通过7个发光段的不同组合 主要显示0~9 也可显示A~F(16进制数) 还可显示个别特殊字符:-、P h g f e d c b a
LED数码管的结构 共阳极 共阴极 阳极 +5V a b c d e f g h 阴极 a b c d e f g h
2. 单个LED数码管的显示 a PA0 b PA1 c 驱 PA2 d 动 PA3 e 电 PA4 f 路 PA5 g PA6 h PA7
单个数码管的显示 软件译码 LEDtb db 3fh,06h,5bh,…… ;显示代码表 …… mov al,1 ;AL←要显示的数字 mov bx,offset LEDtb xlat ;换码:AL←DS:[BX+AL] mov dx,port out dx,al ;输出显示 软件译码
3. 多个LED数码管的显示 8个数码管:用2个8位输出端口控制 硬件上用公用的驱动电路来驱动各数码管 软件上用扫描方法实现数码显示
位控制端口电路 D7 D6 D5 D4 D3 D2 D1 D0 阳极 位0 位1 位2 D0~D7 位控制 反 相 寄 存 驱 动 bitport, IOW
位控制端口作用 控制哪个(位)数码管显示 当位控制端口的控制码某位为低电平时,经反相驱动, 便在相应数码管的阳极加上了高电平,这个数码管就 可以显示数据 位控制:Di=0,相应位发光 D7 D6 D5 D4 D3 D2 D1 D0 位7 位6 位5 位4 位3 位2 位1 位0
段控制端口电路 位0 阳极 位1 位2 a b c d e f g h … … D0 D1 D2 D3 D4 D5 D6 D7 正 相 寄 存 驱 动 D0~D7 段控制 segport, IOW
通过位、段控制端口的共同作用 才能确定哪个数码管显示什么数码 段控制端口作用 控制哪个段显示,决定具体显示什么数码 段控制端口送出显示代码到数码管相应段 此端口由8个数码管共用 通过位、段控制端口的共同作用 才能确定哪个数码管显示什么数码 段控制:Di=0,相应段发光 D7 D6 D5 D4 D3 D2 D1 D0 h g f e d c b a
数码缓冲区 例11.5 ;数据段 LEDdt db 8 dup(0) ;数码缓冲区 ;主程序 mov si,offset LEDdt call LEDdisp ;调用显示子程序 例11.5
获取显示代码 例11.5 LEDdisp proc push ax push bx push dx mov bx,offset LEDtb mov ah,0feh ;指向最左边数码管 LED1: lodsb ;取出要显示的数字 xlat cs:LEDtb ;得到显示代码:AL←CS:[BX+AL] 例11.5
数码显示 例11.5 mov dx,segport ;segport为段控制端口 out dx,al ;送出段码 mov al,ah ;取出位显示代码 mov dx,bitport ;bitport为位控制端口 out dx,al ;送出位码 call delay ;实现数码管延时显示 例11.5
显示下位数码 例11.5 rol ah,1 ;指向下一个数码管 cmp ah,0feh ;最右边的数码管? jnz LED1 ;显示下一个数字 pop dx pop bx pop ax ret ;8位数码管都显示 LEDtb db 0c0h,0f9h, …… LEDdisp endp 例11.5
软件延时 例11.5 timer = 10 ;延时常量 delay proc push bx push cx mov bx,timer delay1: xor cx,cx delay2: loop delay2 ;内循环:216次循环 例11.5
通过控制重复频率和延时时间 就可以得到各种显示效果 软件延时 dec bx jnz delay1 pop cx pop bx ret delay endp 通过控制重复频率和延时时间 就可以得到各种显示效果 例11.5
请认真阅读教材中8位数码管显示子程序 延时子程序建议采用实时时钟的硬件延时,它更精确, 也便于控制时间 延时子程序可以采用软件延时程序 实验7 LED数码管显示实验 请认真阅读教材中8位数码管显示子程序 延时子程序建议采用实时时钟的硬件延时,它更精确, 也便于控制时间 延时子程序可以采用软件延时程序 提示
11.5 并行打印机接口 一般采用Centronics标准接口或其简化接口 Centronics接口是的一个并行接口协议 11.5 并行打印机接口 一般采用Centronics标准接口或其简化接口 Centronics接口是的一个并行接口协议 这个协议规定了36脚簧式插头座和信号含义 其中前11条线是关键信号,他们是8条数据线、3 条联络线(选通、响应和打印机忙) 还有一些特殊控制线、状态线 PC系列机的并行打印机接口是一个25针插口
1. 控制打印机的输出信号 SLCTIN*选择输入——相当于打印机选中信号 INIT*初始化——使打印机被复位成初始状态 1. 控制打印机的输出信号 SLCTIN*选择输入——相当于打印机选中信号 INIT*初始化——使打印机被复位成初始状态 AUTOFEEDXT*自动走纸——使打印机打印后 自动走纸一行 STROBE*选通——用于使打印机接收数据的选 通信号。负脉冲的宽度在接收端应大于0.5s, 数据才可靠地存入打印机数据缓冲区
2. 反映打印机状态的输入信号 BUSY忙——表示打印机不能接收数据 2. 反映打印机状态的输入信号 BUSY忙——表示打印机不能接收数据 ACK*响应——打印机接收一个数据字节后就回 送一个响应的负脉冲信号(脉宽约为5s),表 示打印机已准备好接收新数据 PE纸用完——说明打印机无纸 SLCT选择——表示处于联机选中状态 ERROR*错误——当打印机处于无纸、脱机或错 误状态之一时,这个信号变为低电平
3. 输出数据线 打印时序 DATA0~DATA7——8位并行数据信号线 打印数据通过它们送至打印机 3. 输出数据线 DATA0~DATA7——8位并行数据信号线 打印数据通过它们送至打印机 8位数据的可靠输出通过选通STROBE*、响应ACK*和 忙BUSY三个联络信号控制 打印时序
打印机时序 BUSY DATA0~7 ACK STROBE
第11章教学要求 2. 掌握8255A的各种工作方式、编程及方式0/1的应用 1. 掌握8255A的结构特点和引脚功能 3. 理解简易键盘的工作原理、抖动和重键问题及解决方法 4. 掌握键盘扫描程序(扫描法、行反转法)的编写
第11章教学要求(续) 习题11(第 274 页)—— 6. 掌握LED数码管的工作原理和多位显示方法 5. 了解PC机键盘的工作原理 7. 了解并行打印机接口的引脚定义和接口时序 习题11(第 274 页)—— 11.4 11.7 11.8 11.10 11.11 11.15