8255 是单片微型计算机系统中,用来扩充接口的芯片。
用上一片 8255,就可以为系统增加 3 个 8 位的 IO 接口。
在单片机的教材上,总是使用 “三总线” 的方式来连接 8255。
在这样的条件下,传输数据的速度,确实是比较快的,一般用 2 个机器周期,就可以读/写一次 8255。
但是,采用这种形式,电路设计则是相当麻烦的。首先是必须加上一个锁存器芯片(74LS373),并且,还要使用单片机的 P0、P2 引脚,以及 P3.6、P3.7。占用的引脚,也太多了吧。 而且,这些引脚,都是固定使用的,不可变通。
占用单片机自身 2 个半的并行接口,仅仅换来 3 个并行接口,真有点得不偿失啊,呵呵
如果搞清楚了 8255 的读写时序,那么,使用单片机的接口引线 “直接控制” 8255,效果则要好的多。下图就是一个 “直接控制” 8255 的电路。
由图可见,仅仅使用了单片机一个半的并行接口(P2 和 P3 的四个引脚)和 8255 进行连接,就可以了。这不但节省了引脚数目,而且非常灵活。在设计实际应用的电路板时,可以随意的就近使用引脚,而不必拘泥于图中所画的 P2、P3 等引脚。
如果想把上图中 8255 PC 所接入的拨动开关所设定的开关量输入进来,再从 8255 PA 输出,驱动 LED 发光二极管,使用如下程序即可。
;汇编语言,直接驱动 8255
;-----------------------------------
sbit RD_8255 = P3^4 ;设定相关引脚
sbit WR_8255 = P3^5
sbit A0_8255 = P3^6
sbit A1_8255 = P3^7
;-----------------------------------
ORG 00H
MOV P3, #255 ;关闭8255
MOV P2, #8BH ;PA方式0输出, PB PC输入
SETB A1_8255 ;选定控制寄存器
SETB A0_8255
CLR WR_8255 ;写入控制寄存器
SETB WR_8255
;---------------------
LOOP:
MOV P2, #255 ;输出1
SETB A1_8255 ;选定PC
CLR A0_8255
CLR RD_8255 ;读
NOP ;稍延时,以保证宽度
MOV A, P2 ;读出
SETB RD_8255 ;关闭8255
;---------------------
CLR A1_8255 ;选定PA
CLR A0_8255
MOV P2, A ;写
CLR WR_8255 ;写入
SETB WR_8255
;---------------------
SJMP LOOP
END
;-----------------------------------
程序的运行结果,可见上面给出的电路图。
如果有人喜欢用 C 语言,那么,就用下面的吧。
#include<reg52.h>
sbit RD_8255 = P3^4;
sbit WR_8255 = P3^5;
sbit A0_8255 = P3^6;
sbit A1_8255 = P3^7;
main()
{
char aa;
P3 = 255;
P2 = 0x8B; //控制字: PA输出, PB PC输入
A1_8255 = 1; A0_8255 = 1; //选中控制寄存器
WR_8255 = 0; WR_8255 = 1; //写
while(1) {
P2 = 255; //先输出1
A1_8255 = 1; A0_8255 = 0; //选中PC
RD_8255 = 0;
aa = P2;
RD_8255 = 1; //读
P2 = aa; //这就是刚刚读入的
A1_8255 = 0; A0_8255 = 0; //选中PA
WR_8255 = 0; WR_8255 = 1; //写
}
}
执行这个 C 程序,单片机工作的画面,也可见上面给出的电路图。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因为没有使用 “三总线” 方式,所以,也就没有接口地址的问题。
那么,一般的单片机教材中所说的片外地址,就没有用了。
而且,下面这些 C 语言中的头文件、宏定义,也都用不上了:
#include<absacc.h>
#define PA XBYTE[0xE000] //PA口地址
#define PB XBYTE[0xE001] //PB口地址
#define PC XBYTE[0xE002] //PC口地址
#define CON XBYTE[0xE003] //控制字地址
呵呵,经过做而论道这么一弄,书上的好多知识,统统都没有用了,罪过罪过 ...
按照这种方式,读写 IO 口外接设备的速度,确实是降低了一些,多用了几个微秒。但是,对于速度要求不太敏感的场合,还是非常适用的。
按照这种方式,还节省了一个锁存器芯片,那么,PCB 板的面积,也可以缩小,这就直接使硬件成本得到降低。
有时,一个产品,是否能够占领市场,成本才是关键,读写速度慢上几个微秒,对性能的影响极其微小。
--本文完--