概述
文章目录
- 概述
- 写入方式选择控制字
- 读写数据端口
- 输出实例
- 读写端口C的
- 端口C的分组
- 对端口C进行数据输出两种方法
- 从C端口的读取数据的两种情况
- 修改C端口的位控制字
- 端口C被端口A组或者端口B组征用,表示的状态字
- 8255A的具体编程应用
- 工作方式零
- 初始化编程
- 用8255A方式0与打印机接口
- 打印机接口的信号与时序
- 具体的编程
- 初始化编程,写入控制端口
- 定义打印机的具体工作
- 轮询打印机是否处于忙碌状态
- 定义打印机不忙碌的工作
- 定义数据已经送到端口PA上,打印机接收的过程
- 数据处理完毕之后的收尾过程
- 分析与总结
概述
-
初始化编程:一个方式选择控制字,采用控制I/O地址:A0A1=11,通过特定的值进行调控的
-
在工作过程中:通过数据端口对外设数据进行读写:
- 数据读写利用端口A、B和C中的I/O地址,A0A1分别等于00,01,10
写入方式选择控制字
- 根据分布确方式控制字
- 1 01 1 0 0 0 0 1B或者16进制B1H
- 初始化的程序段
- 注意:这里并不是用A0和A1,注意调换,写控制字地址是11,默认对应是A0和A1,这里应该是对应应A1和A2
读写数据端口
- 初始化编程后:
- 当数据端口作为输入接口时,执行输入IN指令,将从输入设备得到外设数据
- 当数据端口作为输出接口时,执行输出out指令,将把CPU的数据送给输出设备
- 8225A具有锁存输出数据的能力
- 对输出方式的端口同样可以输入
- 不是读取外设数据
- 读取的是上一次CPU给外设的数据
输出实例
- 利用8255A的输出锁存能力,实现对输出端口B的PB7位置位的程序段
- 具体的程序:写B端口,A1和A2对应的是01,默认A0是0,最后四位就是1010,对应十六进制就是A
- PB0到PB7,总共是8位,改变最后一位,对其进行取反,使用异或。1000 0000
- 基本的步骤:修改控制字位对端口B的写,然后读出内容,并对其进行取反,然后再写入
读写端口C的
端口C的分组
- C端口被分成两个4位端口,两个端口只能以方式0工作,可分别选择输入和输出
- 在控制上,C端口上半部分和A端口编为A组,C端口的下半部分和B端口的编为B组
- 当A和B端口工作方式全在方式一或者方式二时,C端口全部被征用
- 剩余引脚仍旧工作在方式0
对端口C进行数据输出两种方法
- 通过端口C的I/O地址的:
- 向端口C直接写入数据。数据被写入C端口的输出锁存器,并从输出引脚输出,对设置为输入的引脚无效
- 通过控制端口
- 向C端口写入位控制字,使C端口的某个引脚输出1或者0,或者置位复位内部的中断允许触发器
从C端口的读取数据的两种情况
修改C端口的位控制字
- 下面请对比方式选择控制字,对于控制字而言,第一位是1就是方式选择控制字,第一位是0就是位控制字
端口C被端口A组或者端口B组征用,表示的状态字
- 这里需要回顾一下对应输入和输出的基本方式
8255A的具体编程应用
工作方式零
初始化编程
- 确定各个端口的工作方式
- 端口A为方式0输入,用来读取键盘扫描码,00 1
- 端口B工作于方式0输出,控制扬声器 1 和最后一位 1
- 端口C为方式0输入,读取系统状态和配置 0 0
- 根据工作方式确定控制字的写入
- 具体的位分布:1 00 1 1 0 0 1 B
- 具体的位分布:1 00 1 1 0 0 1 B
- 具体的代码
mov al,1001 1001b;方式控制字
out 63h,al;输出到I/O地址,用来控制对应的字
用8255A方式0与打印机接口
打印机接口的信号与时序
- CPU端的数据准备完毕,将数据发送给DA0~DA7
- 同时发出数据选通信号strobe,低信号有效,表示数据已经被送到了锁存器中
- 打印机开始接收数据,在busy信号线上发出的忙信号。
- 打印机处理输入的数据时,撤销忙信号,同时送出一个响应信号ACK
具体的编程
初始化编程,写入控制端口
- 注意,这里是使用A1和A2进行修改和控制的
- 设定各个端口的工作方式
- 端口A全部用来输出,工作方式0
- 端口C的上半组用来输出信号strobe信号
- 端口C的下半组用来接收信号Busy信号
- 控制字的具体值为:1 00 0 0 0 0 1
- 要让信号能够发生,得将strobe信号置为高电平,然后等待触发信号的产生
mov dx,0fffeh ;控制端口的地址为FFFEH
mov al,1000 0001B ;写入计算出来的的方式控制字
out dx,al
mov al,0 000 111 1B ;使用位控制运算将C的第七位置为1,确保可以接受产生strobe信号
out dx,al
定义打印机的具体工作
轮询打印机是否处于忙碌状态
- 打印机能否工作要查询当前打印机是否处于busy状态,也就是PC2的值,判定是否处于高电位,高电位就是忙,低电位就是有空,可以接受工作
- 轮询打印机的工作状态确定下一步的工作是否开展
printc proc
push ax
push dx
prn: ;读端口C,要求A1和A0处于10状态
mov dx,0fffch
;将地址对应的寄存器读入其中,并判定第三位是否为高电位
in al,dx
and al,04h
;处于高电位表示当前的状态是高电平,在等待轮询
jnz prn
.....
;下述用来定义打印机不忙的状态
定义打印机不忙碌的工作
- PA端口输出对应的数据,输出到Data总线上,读取到PA读写的地址线上
mov dx,0fff8h ;对端口A进行读写操作,获取对应地址
mov al,ah ;默认数据是保存在ah中的
out dx,al ;将al中的数据输出到dx对应地址中
定义数据已经送到端口PA上,打印机接收的过程
- PC2已经检测到了打印机是空闲的,已经将数据传到了端口PA的输出锁存器上,产生通过PC7产生strobe信号,打印机自己处理,然后在产生strobe的高电平。
mov dx,0fffeh ;从PC7端送出低脉冲信号给strobe,产生strobe信号,将PC7置为低电平
mov al,0000 1110B
out dx,al ;输出到dx对应的PC端的具体地址
nop
nop ;产生一定强度的时间延迟,让计算机用来处理
mov al,0 000 111 0B ;产生一定strobe的高电平,使之可以继续发送数据
out dx,al
数据处理完毕之后的收尾过程
- 恢复现场,并返回主程序
pop dx
pop ax
ret
printc endp
分析与总结
- 主要是根据时序图进行编程,明白8255A产生什么信号,接受什么信号,然后这些信号的具体的工作逻辑先后顺序又是什么样!!
最后
以上就是知性玫瑰为你收集整理的微机原理——8255A的编程的全部内容,希望文章能够帮你解决微机原理——8255A的编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复