当前位置:首页 > 8255
  • 8255是什么芯片?8255引脚图及功能工作原理及应用电路分析

    8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。 1)与CPU连接部分 根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。各信号的引脚编号如下: (1)数据总线DB:编号为D0~D7,用于8255与CPU传送8位数据。 (2)地址总线AB:编号为A0~A1,用于选择A、B、C口与控制寄存器。 (3)控制总线CB:片选信号、复位信号RST、写信号、读信号。当CPU要对8255进行读、写操作时,必须先向8255发片选信号选中8255芯片,然后发读信号或写信号对8255进行读或写数据的操作。 2)与外设接口部分 根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。各通道的引脚编号如下: (1)A口:编号为PA0~PA7,用于8255向外设输入输出8位并行数据。 (2)B口:编号为PB0~PB7,用于8255向外设输入输出8位并行数据。 (3)C口:编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。 3)控制器部分 8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图7.5所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下: (1)A组控制器:控制A口与上C口的输入与输出。 (2)B组控制器:控制B口与下C口的输入与输出。 8255芯片概述 8255芯片是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。 8255芯片特性 (1)一个并行输入、输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。 (2)具有24个可编程设置的I/O口,即3组8位的I/O口为PA口,PB口和PC口。它们又可分为两组12位的I/O口,A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定。 8255引脚及功能   RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。 CS:芯片选择信号线,当这个输入引脚为低电平时,即/CS=0时,表示芯片被选中,允许8255与CPU进行通讯;/CS=1时,8255无法与CPU做数据传输。 RD:读信号线,当这个输入引脚为低跳变沿时,即/RD产生一个低脉冲且/CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。 WR:写入信号,当这个输入引脚为低跳变沿时,即/WR产生一个低脉冲且/CS=0时,允许CPU将数据或控制字写入8255。 D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。 8255具有3个相互独立的输入/输出通道端口,用+5V单电源供电,能在以下三种方式下工作。 方式0————基本输入输出方式;方式1————选通输入/出方式;方式2————双向选通输入/输出方式; PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入锁存器。 工作于三种方式中的任何一种; PB0~PB7:端口B输入输出线,一个8位的I/O锁存器, 一个8位的输入输出缓冲器。 不能工作于方式二; PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入缓冲器。端口C可以通过工作方式设定而分成2个4位的端口, 每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。‘不能工作于方式一或二。 A1,A0:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器。 当A1=0,A0=0时,PA口被选择; 当A1=0,A0=1时,PB口被选择; 当A1=1,A0=0时,PC口被选择; 当A1=1.A0=1时,控制寄存器被选择. 8255内部逻辑结构   8255工作方式 3种工作方式可用软件编程对控制口设置来指定。三种基本的工作方式为: 方式0-基本的输入输出,方式1-选通输入输出方式, 方式2-双向传送方式。 1) 工作方式0(基本输入输出方式) 功能:方式0不使用联络信号,也不使用中断,A口和B口可定义为输入或输出口,C口分成两个部分(高四位和低四位),C口的两个部分也可分别定义为输入或输出。在方式0,所有口输出均有锁存,输入只有缓冲,无锁存,C口还具有按位将其各位清0或置1的功能。常用于与外设无条件的数据传送或接收外设的数据。 2) 工作方式1(选通输入输出方式) A口借用C口的一些信号线用作控制和状态信号,组成A组,B口借用C口的一些信号线用作控制和状态信号,组成B组。在方式1下,C口的某些位被占用。 方式1的输出:当A口工作于方式1且用作输出口时,C口的PC7线用作输出缓冲器满OBF信号,PC6用作外设收到数据后的响应信号ACK,PC3用作中断请求输出信号线INTR。 当B口工作于方式l且用作输出口时,C口的PC1线用作输出缓冲器满OBF信号,PC2用作外设收到数据后的响应信号ACK,PC0用作中断请求输出信号线INTR。   B口输出 3) 工作方式2 (双向输入输出方式) 功能:方式2是A组独有的工作方式。外设既能在A口的8条引线上发送数据,又能接收数据。此方式也是借用C口的5条信号线作控制和状态线,A口的输入和输出均带有锁存。 8255应用电路一   8255A组成交通灯的控制,编写程序实现下列功能: K0、K1、K2全部闭合时,红灯亮;K0、K1、K2全部打开时,绿灯亮;其他情况黄灯亮。 根据电路图可知:8255工作于方式0,A口作输入口,B口作输出口。 方式控制字为:10010000. 端口A的地址为:340H,端口B的地址为341H,控制字寄存器地址为343H。 程序如下: MOV DX, 343H ;控制字端口地址 MOV AL,90H ;方式控制字 OUT DX, AL ;初始化8255 AGAIN: MOV DX, 340H ;送端口A地址 IN AL,DX ;读端口A AND AL,00000111B ;取A口的低3位 CMP AL, 00000111B ;判断是否全部打开 JE GREEN CMP AL, 00000000B ;判断是否全部闭合 JE RED MOV AL, 1 ;黄灯亮 JMP OUTPUT RED: MOV AL, 4 ;红灯亮 JMP OUTPUT GREEN: MOV AL, 2 ;绿灯亮 8255应用电路二 图中用并行接口8255A作为微机与键盘间的接口,采用逐行扫描法识别键。将键盘中的列与PA0—PA3相连,A口为输出;将行与C口的PC0—PC1相连,C口为输入口; PB0—PB7与七段代码显示器连接B口为输出。   8255应用电路三   所示为8255j端口构戚的‘4X8矩阵键盘。曙中,8255的PA端口初始化为输出工作方式作为列线使用,PC端口韧始化为输入工作方式作为行线使用,在每一个行线与列线的交叉点处接一个按键,再给每个按键设定一个编号【键值)。可以根据需要,将一部分按键定义为功能键,另一部分按键定义为数字键。

    时间:2019-11-22 关键词: 芯片 引脚图 8255

  • 8255 的直接连接方法

    8255 的直接连接方法

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

    时间:2018-11-14 关键词: 接口 io 8255 扩充接口

  • 8255 的三总线连接方法

    8255 的三总线连接方法

    前两天,写了一篇关于 8255 的博文,使用了“直接连接”的方法。本文将使用“三总线”方式连接 8255。有这样一个问题:按键计数,按一下键,显示数字加一。两个按键控制分别控制两组数码管,每个按键控制一个两位数码管,显示十进制数,0到99。题目给定的电路图中,共有四个共阴数码管,用 8255 的 PA 来驱动段,位,则使用了单片机 P1 口,按键使用了 P2 口。呵呵,题目给定的电路,看起来,有些杂乱。做而论道修改了一下,如下所示:; 8255 控制字格式如下:;+-----+-----+-----+-----+-----+-----+-----+-----+;|  1  |  PA_FUNC  |PA_IO|PC7_4|PB_F |PB_IO|PC3_0|;+-----+-----+-----+-----+-----+-----+-----+-----+;|  1  |  0  |  0  |  0  |  1  |  0  |  0  |  1  |;+-----+-----+-----+-----+-----+-----+-----+-----+;呵呵,百度这排版格式,把控制字显示的乱七八糟 !  复制到记事本再看吧。仿照题目的要求,用汇编语言编写了如下的程序:    ORG   0000HSTART:    MOV   R1, #03H   ;控制寄存器地址    MOV   A, #89H    ;控制字    MOVX  @R1, A     ;PA PB输出, PC输入    MOV   SP, #70H    MOV   30H, #01   ;初始显示8031    MOV   31H, #255 - 8    MOV   32H, #03    MOV   33H, #255 - 4    MOV   34H, #00    MOV   35H, #255 - 2    MOV   36H, #08    MOV   37H, #255 - 1    MOV   R4, #0     ;初值0    MOV   R5, #0    MOV   R1, #02H   ;PC;----------------------------------初始化结束M_LOOP:    CALL  DISP    MOVX  A, @R1    JNB   ACC.0, K1_1    JNB   ACC.1, K2_1    JMP   M_LOOP;---------------------K1_1:    CALL  DISP    MOVX  A, @R1    JNB   ACC.0, K1_2    JMP   M_LOOPK1_2:    CALL  DISP    MOVX  A, @R1    JNB   ACC.0, K1_2    INC   R4    CJNE  R4, #100, K1_3    MOV   R4, #0K1_3:    MOV   A, R4    MOV   B, #10    DIV   AB    MOV   34H, B    MOV   36H, A    JMP   M_LOOP;---------------------K2_1:    CALL  DISP    MOVX  A, @R1    JNB   ACC.1, K2_2    JMP   M_LOOPK2_2:    CALL  DISP    MOVX  A, @R1    JNB   ACC.1, K2_2    INC   R5    CJNE  R5, #100, K2_3    MOV   R5, #0K2_3:    MOV   A, R5    MOV   B, #10    DIV   AB    MOV   30H, B    MOV   32H, A    JMP   M_LOOP    ;主程序循环;----------------------------------主程序到此为止DISP:               ;显示子程序    PUSH  PSW    PUSH  ACC    SETB  RS0    MOV   R0, #30H  ;显示缓冲区首址    MOV   R1, #00H  ;PA    MOV   R2, #4D_LOOP:    MOV   A, @R0    ADD   A, #(SEG_TAB - $ - 3)    MOVC  A, @A + PC      MOVX  @R1, A    ;写入PA    INC   R0    INC   R1        ;PB    MOV   A, @R0    MOVX  @R1, A    ;写入PB    DJNZ  R7, $    DJNZ  R7, $    MOV   A, #255   ;消隐    MOVX  @R1, A    ;写入PB    INC   R0    DEC   R1    DJNZ  R2, D_LOOP    POP   ACC    POP   PSW    RET;---------------------SEG_TAB:    DB    3FH, 06H, 5BH, 4FH, 66H    DB    6DH, 7DH, 07H, 7FH, 6FH;----------------------------------END程序启动后,首先显示出来 8031,如上面的插图所示。以后,分别按动两个按键,即可看到两组数码管分别显示出来加一、加一的现象。

    时间:2018-11-12 关键词: 数码管 8255 三总线

  • 51 汇编编程:8255 驱动矩阵键盘和数码管

    51 汇编编程:8255 驱动矩阵键盘和数码管

    汇编编程:矩阵键盘控制数码管切换显示0~F。下面是电路图。要求16个键按下能显示0~F字样。看到这样的电路和程序,不由得想起初学单片机时情景。十几年前,是一本北航的书,里面就是这样的程序。后来又看过几本,里面也有雷同的程序。其实,该程序编写的很滥。它把行列号码,算的很清。还特意弄成几个分支。换下一行时,行号就要分别存入 00H、08H、10H、18H。想法也太笨了,其实,只要加上 8,就可以编写成循环程序了。程序中,还有很多应该简化的地方。这程序学起来,的确浪费了我不少的时间。根据题目中的电路和程序,做而论道改写的程序如下。;    ORG   0000H    SJMP  START    ORG   0030H;--------------------------------------DUMA:    DB    3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H //共阴段码    DB    7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H;--------------------------------------START:    MOV   DPTR, #7F03H  //8255初始化    MOV   A, #90H    MOVX  @DPTR, A    MOV   A, #16;--------------------------------------KEY1:    ACALL KS1           //判断有无键按下, 返回PA口状态存放在A中    JZ    KEY1          //无则返回    ACALL DELAY         //调用延时子程序    ACALL KS1           //再次判断有无键按下    JZ    KEY1          //无则返回;    MOV   R2, #0FEH     //初始列扫描字    MOV   R3, #8        //检查8次    MOV   R4, #0        //初始键号LK4:    MOV   DPTR, #7F01H  //指向PB口    MOV   A, R2    MOVX  @DPTR, A    MOV   DPTR, #7F00H  //指向PA口    MOVX  A, @DPTR    JNB   ACC.0, LK3    INC   R4    JNB   ACC.1, LK3    INC   R4    MOV   A, R2    RL    A             //无则左移一位列扫描字, 继续判断下一列    MOV   R2, A    DJNZ  R3, LK4LK3:    ACALL KS1              JNZ   LK3           //判断按下的键有没有弹起, 无则原地等待继续判断;    MOV   A, R4         //键号放于A中    MOV   DPTR, #0030H  //指向段码表首址    MOVC  A, @A + DPTR  //键号转成相应的段码    MOV   DPTR, #7F02H  //指向PC口    MOVX  @DPTR, A      //数码管显示;    SJMP  KEY1;--------------------------------------KS1:    MOV   DPTR, #7F01H  //指向PB口    MOV   A, #0    MOVX  @DPTR, A    MOV   DPTR, #7F00H  //指向PA口    MOVX  A, @DPTR    CPL   A    ANL   A, #03H    RET                 //返回PA口数据存放在A中, 若有键按下, 则A不等于零;--------------------------------------DELAY:                  //延时子程序, 约10ms    MOV   R7, #20D1: DJNZ  R6, $    DJNZ  R7, D1    RETEND;======================================本程序运行的仿真截图,可见前面的插图。题目中的电路,仅仅使用了一个数码管。这和实用的场合,还有差距。如果使用动态显示的方法,驱动多位数码管,那么,矩阵键盘的规模,就可以再扩大一些。而做而论道在这里给出的程序,却不用增加很多,仅仅再添上三、五行即可够用。

    时间:2018-10-15 关键词: 数码管 8255 汇编编程 驱动矩阵

  • 使用“三总线”方式连接 825

    使用“三总线”方式连接 825

    本文将使用“三总线”方式连接 8255。有这样一个问题:按键计数,按一下键,显示数字加一。两个按键控制分别控制两组数码管,每个按键控制一个两位数码管,显示十进制数,0到99。题目给定的电路图中,共有四个共阴数码管,用 8255 的 PA 来驱动段,位,则使用了单片机 P1 口,按键使用了 P2 口。呵呵,题目给定的电路,看起来,有些杂乱。做而论道修改了一下,如下所示:; 8255 控制字格式如下:;+-----+-----+-----+-----+-----+-----+-----+-----+;|  1  |  PA_FUNC  |PA_IO|PC7_4|PB_F |PB_IO|PC3_0|;+-----+-----+-----+-----+-----+-----+-----+-----+;|  1  |  0  |  0  |  0  |  1  |  0  |  0  |  1  |;+-----+-----+-----+-----+-----+-----+-----+-----+;呵呵,百度这排版格式,把控制字显示的乱七八糟 !  复制到记事本再看吧。仿照题目的要求,用汇编语言编写了如下的程序:    ORG   0000HSTART:    MOV   R1, #03H   ;控制寄存器地址    MOV   A, #89H    ;控制字    MOVX  @R1, A     ;PA PB输出, PC输入    MOV   SP, #70H    MOV   30H, #01   ;初始显示8031    MOV   31H, #255 - 8    MOV   32H, #03    MOV   33H, #255 - 4    MOV   34H, #00    MOV   35H, #255 - 2    MOV   36H, #08    MOV   37H, #255 - 1    MOV   R4, #0     ;初值0    MOV   R5, #0    MOV   R1, #02H   ;PC;----------------------------------初始化结束M_LOOP:    CALL  DISP    MOVX  A, @R1    JNB   ACC.0, K1_1    JNB   ACC.1, K2_1    JMP   M_LOOP;---------------------K1_1:    CALL  DISP    MOVX  A, @R1    JNB   ACC.0, K1_2    JMP   M_LOOPK1_2:    CALL  DISP    MOVX  A, @R1    JNB   ACC.0, K1_2    INC   R4    CJNE  R4, #100, K1_3    MOV   R4, #0K1_3:    MOV   A, R4    MOV   B, #10    DIV   AB    MOV   34H, B    MOV   36H, A    JMP   M_LOOP;---------------------K2_1:    CALL  DISP    MOVX  A, @R1    JNB   ACC.1, K2_2    JMP   M_LOOPK2_2:    CALL  DISP    MOVX  A, @R1    JNB   ACC.1, K2_2    INC   R5    CJNE  R5, #100, K2_3    MOV   R5, #0K2_3:    MOV   A, R5    MOV   B, #10    DIV   AB    MOV   30H, B    MOV   32H, A    JMP   M_LOOP    ;主程序循环;----------------------------------主程序到此为止DISP:               ;显示子程序    PUSH  PSW    PUSH  ACC    SETB  RS0    MOV   R0, #30H  ;显示缓冲区首址    MOV   R1, #00H  ;PA    MOV   R2, #4D_LOOP:    MOV   A, @R0    ADD   A, #(SEG_TAB - $ - 3)    MOVC  A, @A + PC      MOVX  @R1, A    ;写入PA    INC   R0    INC   R1        ;PB    MOV   A, @R0    MOVX  @R1, A    ;写入PB    DJNZ  R7, $    DJNZ  R7, $    MOV   A, #255   ;消隐    MOVX  @R1, A    ;写入PB    INC   R0    DEC   R1    DJNZ  R2, D_LOOP    POP   ACC    POP   PSW    RET;---------------------SEG_TAB:    DB    3FH, 06H, 5BH, 4FH, 66H    DB    6DH, 7DH, 07H, 7FH, 6FH;----------------------------------END程序启动后,首先显示出来 8031,如上面的插图所示。以后,分别按动两个按键,即可看到两组数码管分别显示出来加一、加一的现象。

    时间:2018-10-11 关键词: 数码管 8255 三总线

  • 8255 如何直接连接?

    8255 如何直接连接?

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

    时间:2018-09-30 关键词: 8255 锁存器芯片

  • Proteus7.5仿真8255流水灯原理图

    Proteus7.5仿真8255流水灯原理图

    8255流水灯显示代码 ; You may customize this and other start-up templates; ; The location of this template is c:\emu8086\inc\0_com_template.txt org 100h ;T8255-2.asm ;8255流水灯显示实验 ;****************根据查看端口资源修改下列符号值******************* IOY0 EQU 00H ;片选IOY0对应的端口始地址 ;***************************************************************** MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址 DATA SEGMENT LA DB 1 DUP LB DB 1 DUP AXX DW 1 BUP CXX DW 1 BUP DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,MY8255_MODE ;定义8255工作方式 MOV AL,80H ;工作方式0,A口和B口为输出 OUT DX,AL BEGIN: MOV DX,MY8255_A ;写A口发出的起始数据 MOV AL,01H OUT DX,AL MOV LA,AL MOV DX,MY8255_B ;写B口发出的起始数据 MOV AL,80H OUT DX,AL MOV LB,AL MOV CX,7 LOOP1: CALL DALLY MOV AL,LA ;将A口起始数据左移再写入A口 ROL AL,1 MOV LA,AL MOV DX,MY8255_A OUT DX,AL MOV AL,LB ;将B口起始数据右移再写入B口 ROR AL,1 MOV LB,AL MOV DX,MY8255_B OUT DX,AL LOOP LOOP1 MOV CX,7 LOOP2: CALL DALLY MOV AL,LA ;将A口起始数据右移再写入A口 ROR AL,1 MOV LA,AL MOV DX,MY8255_A OUT DX,AL MOV AL,LB ;将B口起始数据左移再写入B口 ROL AL,1 MOV LB,AL MOV DX,MY8255_B OUT DX,AL LOOP LOOP2 JMP BEGIN ;流水灯重新开始 DALLY PROC ;软件延时子程序 MOV CXX,CX MOV AXX,AX ;这里本应该用堆栈,我用CXX,AXX变量代替了。 MOV CX,0FH D1: MOV AX,0FFFH D2: DEC AX JNZ D2 LOOP D1 MOV AX,AXX MOV CX,CXX RET DALLY ENDP CODE ENDS END START ret 原理图   效果图  

    时间:2017-06-23 关键词: 数字电路 8255 proteus7.5 流水灯原理图

  • 8255数码管显示电路图

    8255数码管显示电路图

    8255数码管显示电路原理图     8255数码管显示效果图  

    时间:2017-06-23 关键词: 数字电路 数码管 8255 显示电路图

  • 单片机+8255键盘扫描c51程序

    51单片机+8255芯片的键盘扫描函数,只做了简单的输入输出,利用P1口控制发光二极管亮,键值为7的话键码是0x07; 源程序: #include<reg51.h> #include<absacc.h> #define  uchar  unsigned  char #define  uint   unsigned  int #define LScan   XBYTE[0x7f00]  //列扫描地址 #define HScan   XBYTE[0x7f02]  //行扫描地址 //延时函数 void delay(uint i) {uint j;   for(j=i;j>0;j--)    {  ;  } } //检测有无按键按下的函数 uchar CheckKey()       //有按键按下返回0xff,无则返回0 { uchar i;  LScan =0x00;   i=(HScan & 0x0f);   if(i==0x0f) return(0);   else  return(0xff);  } //********键盘扫描子函数*********** uchar KeyScan()          {       //无按键返回oxff,有则返回键码            uchar ScanCode;  uchar CodeValue;  uchar k;  uchar i,j;  if(CheckKey()==0)  return(0xff);     //无按键,返回0xff  else   {    delay(200);                     //延时    if(CheckKey()==0)      return(0xff);        //无按键,返回0xff    else     {      ScanCode=0x01;              //设置列扫描码,初始值最低位为0      for(i=0;i<8;i++)            //逐列扫描8次       {        k=0x01;                   //行扫描码赋初值        LScan=~ScanCode;            //送列扫描码        CodeValue=i;              //键码就是i的值,第零行的每列键码为0,1,2,……7,和i值一致        for(j=0;j<4;j++)         {          if((HScan & k) ==0)      //是否在当前列,           {            while(CheckKey()!=0); //若是,则等待按键释放            return(CodeValue);     //返回键码           }          else                     //否则,键码加8,同一列的每一行上的键码恰好相差8           {                       //列扫描码k右移一位,扫描下一行            CodeValue+=8;            k<<=1;           }                             }          ScanCode<<=1;            //每一行都扫描完,列扫描码右移一位,扫描下一列       }            }   } }  main()  {   uchar Key;        P1=0x00;                 //初始,先关闭数码管   XBYTE[0x7f03]=0x81;    //8255初始化,设置A口输出,C口低4位输入   while(1)    { Key=KeyScan();       if(Key!=0xff)      P1=Key;    } }    

    时间:2012-09-11 关键词: C51 单片机 程序 8255

  • 8255数码管显示线路

    本内容提供了8255数码管显示电路图               8255数码管显示效果图   

    时间:2012-05-02 关键词: 线路 8255 数码管显示

  • 8255数码管显示线路图

    本内容提供了8255数码管显示电路图               8255数码管显示效果图   

    时间:2011-06-30 关键词: 线路图 8255 数码管显示

发布文章

技术子站

更多

项目外包