微机原理——8255A的编程

概述
  • 初始化编程:一个方式选择控制字,采用控制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
      在这里插入图片描述
  • 具体的代码
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产生什么信号,接受什么信号,然后这些信号的具体的工作逻辑先后顺序又是什么样!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值