我是靠谱客的博主 知性玫瑰,最近开发中收集的这篇文章主要介绍微机原理——8255A的编程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

        • 概述
        • 写入方式选择控制字
        • 读写数据端口
          • 输出实例
        • 读写端口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
      在这里插入图片描述
  • 具体的代码
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的编程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部