8255C键盘显示器程序

合集下载

51单片机8255驱动C程序

51单片机8255驱动C程序

51单片机8255驱动C程序/*----------------------------------------------------------------------------------------------------------------库文件名称:driver8155.h功能描述:驱动8155,不需要了解8255的工作原理,透明操作8255的三个输入输出口PA、PB、PC读A口只需要调用rd_PA,写则需要调用wr_PA;B、C操作也一样全局变量: IO_flags,在其它程序中不能对其改写特殊说明: 无//----------------------------------------------------------------------------------------------------------------*/ #include<config.h>unsigned char const cfg_table[8]={0x80, /*10000000b, ;c=out b=out a=out*/0x90, /*10010000b, ;c=out b=out a=in */0x82, /*10000010b, ;c=out b=in a=out*/0x92, /*10010010b, ;c=out b=in a=in */0x89, /*10001001b, ;c=in b=out a=out*/0x99, /*10011001b, ;c=in b=out a=in */0x8B, /*10001011b, ;c=in b=in a=out*/0x9B, /*10011011b, ;c=in b=in a=in */};unsigned char rd_mem(unsigned char mem_ad){}void PABC_config(void ){a8255_CON=cfg_table[IO_flags];}char rd_PA(void) /*读PA口*/{unsigned char PA_data;ACC=IO_flags; /*把状态标志字读到ACC便于进行位操作*/do{IO_flagsA=1; /*置PA状态标志位为高--输入*/IO_flags=ACC;PABC_config(); /*调用配置子程序,完成对8255的设置*/ACC=IO_flags;}while(IO_flagsA==0); /*判断状态标志位是否为高*//*控制字设置完成*/PA_data=a8255_PA; /*把PA口的数据读到PA_data*/return(PA_data); /*返回PA_data*/}char rd_PB(void) /*读PB口*/{unsigned char PB_data;ACC=IO_flags; /*把状态标志字读到ACC便于进行位操作*/do{IO_flagsB=1; /*置PB状态标志位为高--输入*/IO_flags=ACC;PABC_config(); /*调用配置子程序,完成对8255的设置*/ACC=IO_flags;}while(IO_flagsB==0); /*判断状态标志位是否为高*//*控制字设置完成*/PB_data=a8255_PB; /*把PA口的数据读到PB_data*/return(PB_data); /*返回PB_data*/}char rd_PC(void) /*读PC口*/{unsigned char PC_data;ACC=IO_flags; /*把状态标志字读到ACC便于进行位操作*/do{IO_flagsC=1; /*置PC状态标志位为高--输入*/IO_flags=ACC;PABC_config(); /*调用配置子程序,完成对8255的设置*/ACC=IO_flags;}while(IO_flagsC==0); /*判断状态标志位是否为高*//*控制字设置完成*/PC_data=a8255_PC; /*把PC口的数据读到PC_data*/return(PC_data); /*返回PC_data*/}void wd_PA(unsigned char PA_data) /*写PA口*/{ACC=IO_flags; /*把状态标志字读到ACC便于进行位操作*/{IO_flagsA=0; /*置PA状态标志位为低--输出*/IO_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/PABC_config(); /*调用配置子程序,完成对8255的设置*/ACC=IO_flags;}while(IO_flagsA==1); /*判断状态标志位是否为高为高,设置未完成,需从新设置*/a8255_PA=PA_data; /*将PA_data的内容送到PA口*/}void wd_PB(unsigned char PB_data) /*写PB口*/{ACC=IO_flags; /*把状态标志字读到ACC便于进行位操作*/{IO_flagsB=0; /*置PB状态标志位为低--输出*/IO_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/PABC_config(); /*调用配置子程序,完成对8255的设置*/ACC=IO_flags;}while(IO_flagsB==1); /*判断状态标志位是否为高为高,设置未完成,需从新设置*/a8255_PB=PB_data; /*将PB_data的内容送到PB口*/}void wd_PC(unsigned char PC_data) /*写PC口*/{ACC=IO_flags; /*把状态标志字读到ACC便于进行位操作*/{IO_flagsC=0; /*置PC状态标志位为低--输出*/IO_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/PABC_config(); /*调用配置子程序,完成对8255的设置*/ACC=IO_flags;}while(IO_flagsC==1); /*判断状态标志位是否为高为高,设置未完成,需从新设置*/a8255_PC=PC_data; /*将PC_data的内容送到PC口*/}void set_PC(unsigned char PC_num){ACC=IO_flags;IO_flagsC=0;ACC=IO_flags;PC_num=PC_num<<1;PC_num=(PC_num|0x01);a8255_CON=PC_num;}void clr_PC(unsigned char PC_num){ACC=IO_flags;IO_flagsC=1;ACC=IO_flags;PC_num=PC_num<<1;PC_num=(PC_num&0xFE);a8255_CON=PC_num;}void main(void){set_PC(0x01);}/*---------------------------------------------------文件名称:Config.h功能描述:端口定义和RAM配置输入参数:无输出参数:无特殊说明:根据具体分配的地址,重新设定各值//----------------------------------------------------------------------------------------------------------------*/ #include <reg52.h>#include<ABSACC.H>#define a8255_PA XBYTE[0x7F7C] /*PA口地址*/#define a8255_PB XBYTE[0x7F7D] /*PB口地址*/#define a8255_PC XBYTE[0x7F7E] /*PC口地址*/#define a8255_CON XBYTE[0x7F7F] /*控制字地址*/unsigned char IO_flags; /* 用于表示PA、PB、PC的当前输入输出状态内容不能被其它程序改写,操作时ACC=IO_flags*/sbit IO_flagsA=ACC^0; /*PA的当前输入输出状态置位表示输入,复位表示输出*/sbit IO_flagsB=ACC^1; /*PB的当前输入输出状态*/ sbit IO_flagsC=ACC^2; /*PC的当前输入输出状态*/char rd_PA(void); /*读PA口*/char rd_PB(void); /*读PB口*/char rd_PC(void); /*读PC口*/void wd_PA(unsigned char PA_data); /*写PA口*/void wd_PB(unsigned char PB_data); /*写PA口*/void wd_PC(unsigned char PC_data); /*写PA口*/void PABC_config(void ); /*写8255控制字*/。

单片机课程设计《病人呼叫器》讲解

单片机课程设计《病人呼叫器》讲解

太原理工大学课程设计说明书课程名称:《单片机原理及其在煤矿中的应用》设计题目:医院病人呼叫器院系:矿业工程学院学生姓名:李国富学号:2011002813专业班级:采矿1109指导教师:曹金燕2013年12月27 日课程设计任务书病人呼叫器摘要:本设计是一个采用89C51单片机配以外围适当电路完成一个可供6 4个病房使用的呼叫系统。

该系统需运用单片机典型外围接口技术中的矩阵式键盘电路完成对病房的输入,由于病房较多,考虑到89C51单片机自身接口有限,需用可编程并行接口芯片8255A外扩I/O实现对矩阵式键盘的扫描与键值的读入。

MCS-51单片机受管脚的限制,P0口不仅要作数据总线口而且还提供低8位A0~A7,所以只能分时工作,故P0口输出的低8位地址数据必须用锁存器锁存。

本设计采用74LS373,其锁存控制信号由引脚ALE提供。

在ALE的下降沿将P0口输出的地址数据锁存。

本设计中单片机要实现三种功能:1)床位按钮的扫描与读入。

2)按钮按下时振铃三秒并显示房号。

3)护士响应后数码管灭,铃声停。

关键词:呼叫器/单片机/医院/显示/蜂鸣器目录1.设计背景 (5)2.课程名称及要求 (5)2.1课程名称 (5)2.2设计要求 (5)3.设计方案 (6)4.工作原理及工作流程 (6)5.KEIL软件程序编辑与调试 (8)6.各分模块设计及相关元器件的选用 (5)6.1单片机的选用 (11)6.274LS164简介 (14)6.374LS373简介 (14)6.48255A简介 ........................... 错误!未定义书签。

6.5按钮开关电路 ......................... 错误!未定义书签。

6.6声音报警电路......................... 错误!未定义书签。

6.7外部震荡电路......................... 错误!未定义书签。

8225的初始化程序

8225的初始化程序

8255的初始化程序:1、地址确定因为A10A9A8A7A6A5A4A3=01010011,A2A1=11为控制字端口,A2A1=10为C口,A2A1=01为B口,A2A1=00为A口,A0为0,所以8255A地址范围为24CH~24FH。

2、控制字确定因为A口为方式0输出,B口为方式0输入,所以控制字为10000010B=82H 3、初始化程序MOV AL,82HMOV DX,24FHOUT DX,AL附8255知识:8255是微机并行接口芯片。

8255是可编程I/O口扩展芯片。

对8255输入不同的指令可改变I/O口的工作方式。

8255与单片机系统连接方式简单,工作方式由程序设定,图2为8255的引脚图。

8255内部有4个寄存器:分别为寄存器A、B、C和控制寄存器。

A、B、C寄存器的数据就是引脚PA7~PA0、PB7~PB0、PC7~PC0上输入或输出的数据。

而控制寄存器的数据则表明PA、PB、PC的工作方式。

通过CS、A0、A1、RD和WR对4个寄存器进行操作。

1)CS为低电平时选通8255;2)A1、A0为地址选通;3)RD和WR为读、写信号:RD为低、WR为高时为读方式,RD为高、WR为低时为写方式。

4)D0~D7为数据口。

向控制寄存器写入不同的数据可以使8255工作在三种不同的方式下。

这里只介绍应用最多的方式0。

方式0下8255的PA、PB及PC口上半部分(PC7~PC4)和下半部分(PC3~PC0)中任何一个端口都可以设定为输入或输出,PC口还可以进行位操作。

控制寄存器各位的含义如图3所示。

SLPC-24中8255工作在方式0。

PA、PB为输入口、PC为输出口,对控制寄存器写入的数据为10010010B,即92H。

微机原理实验报告-实验三-七段数码管.doc

微机原理实验报告-实验三-七段数码管.doc

实验三七段数码管一、实验目的:进一步熟悉8255,掌握数码管显示数字的原理二、实验原理:1、实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。

2、七段数码管的字形码:3、在实验 2 中加入键盘是否有输入判断,如有则去读取键盘输入数据,并加入提示信息,比如“输入十位数”,“输入个位数”,从键盘读入的数据放入十位和个位数据定义区,取代要显示的数据。

4、只需要添加两位变量作为缓存,一个记录键盘输入的值,一个记录循环减 1 的结果,将其通过数码管显示出来,减至0 时重载键盘输入的值。

三、实验步骤:静态显示:将8255 的 A 口 PA0~PA6分别与气短数码管的段码驱动输入端A~G相连,位码驱动输入端S1 接 +5V(选中), S0、 DP接地(关闭)。

动态显示:七段数码管段码不变,位码驱动输入端S1,S0 接 8255 C 口的 PC1,PC0。

8253 的接法参考第二次实验的接法,CLK0接入 1MHz, CLK1接 8255 的 PC7。

1、在两个数码管上显示两位数字,要求延时应用8253 硬件延时2、可以改变数码管显示数字,从键盘读入两位数字,并在数码管显示出来。

3、对输入数据进行倒计时计数,时间显示在数码管上,计到0 重新开始。

四、流程图:开始对 8255 进行初设置 8255C 口输从键盘读入数据Y根据十位获得段码,延时N根据个位获得段码,按键延时N循环显示这Y要输出的数重新载入输Y要输出的数据减 1五、实验结果:实验结果如预期一致,可以键盘输入倒计时的值,时间显示在数码管上,计数到0 重新计数。

六、程序代码:;******************************************;*数码管显示对键盘输入数据进行倒计时计数*;******************************************data segmentio8255a equ 288hio8255c equ 28ahio8255_mode equ 28bhio8253a equ 280hio8253b equ 281hio8253c equ 282hmesg1 db 0dh,0ah,'Input a num (00--99) for high position,other key isexit:',0dh,0ah,'$'mesg2 db 0dh,0ah,'Input a num (00--99) for low position,other key isexit:',0dh,0ah,'$'led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh; 段码buffer db , ; 存放要显示的个位和十位buffer1 db , ; 存放临时的个位和十位用于减一bz dw;data endscode segmentassume cs:code,ds:datastart:位码mov ax,datamov ds,axmov dx,io8255_mode ; 将8255 的A 口为输出mov ax,88hout dx,almov dx,offset mesg1mov ah,09hint 21h; 显示提示信息mov ah,01int 21h; 从键盘接收十位字符cmp al,'0' jl exit ; 是否小于0 ; 若是则退出cmp al,'9' jg exit sub al,30h ; 是否大于9 ; 若是则退出mov buffer,almov dx,offset mesg2 mov ah,09hint 21hmov ah,01hint 21h; 将输入的十位数存入指定地址; 显示提示信息cmp al,'0'jl exitcmp al,'9'jg exitsub al,30h; 判断方法同十位mov buffer+1,aljmp reset; 将输入的个位数存入指定地址exit:mov ah,4chint 21hreset:mov al,buffermov buffer1,almov al,buffer+1mov buffer1+1,al; 返回mov di,offset buffer1loop1:call time; 取得显示缓冲区的地址loop2:mov bh,02h ; 数码管循环显示部分lll:mov byte ptr bz,bhpush didec diadd di, bzmov bl,[di] ;bl 为要显示的数pop dimov al,0mov dx,io8255cout dx,almov bh,0mov si,offset led ; 置led 数码表偏移地址为SI add si,bx ; 求出对应的led 数码mov al,byte ptr [si]mov dx,io8255a ; 自8255A 的口输出out dx,almov al,byte ptr bz; 使相应的数码管亮mov dx,io8255cout dx,almov cx,3000delay:loop delay; 延时mov bh,byte ptr bzshr bh,1jnz lllmov dx,io8255cin al,dxtest al,80hjnz setjmp loop2set:test buffer1+1,0fhjz set1dec buffer1+1jmp loop1set1:test buffer1,0fhjz resetdec buffer1mov buffer1+1,09hjmp loop1time proc near ; 定时一秒的子程序mov dx,io8253c ; 向 8253 写控制字mov al,37h ; 使0 通道为工作方式 3 out dx,almov ax,1000h ; 循环计数初值1000 mov dx,io8253aout dx,al; 先写低字节mov al,ahout dx,al; 后写高字节mov dx,io8253cmov al,71h ; 设8253 通道 1 工作方式0out dx,almov ax,1000h ; 循环计数初值1000mov dx,io8253bout dx,al ; 先写低字节mov al,ahout dx,al; 后写高字节rettime endpcode endsend start七、实验总结:本次实验需要结合上次实验的知识,应用 8253 硬件延时,因此增加了些许难度,代码的修改也不少。

键盘扫描显示实验报告

键盘扫描显示实验报告

一、实验目的1. 理解键盘扫描的基本原理,掌握键盘扫描的方法。

2. 掌握数码管显示的基本原理,实现键盘扫描信息的实时显示。

3. 熟悉8255并行接口芯片在键盘扫描和数码管显示中的应用。

二、实验原理1. 键盘扫描原理:键盘扫描是指通过硬件电路对键盘按键进行检测,并将按键信息转换为可识别的数字信号的过程。

本实验采用行列式键盘,通过扫描键盘的行线和列线,判断按键是否被按下。

2. 数码管显示原理:数码管是一种用来显示数字和字符的显示器,由多个发光二极管(LED)组成。

本实验采用七段数码管,通过控制各个段(A、B、C、D、E、F、G)的亮灭,显示相应的数字或字符。

3. 8255并行接口芯片:8255是一款通用的并行接口芯片,具有三个8位并行I/O口(PA、PB、PC),可用于键盘扫描和数码管显示的控制。

三、实验设备1. 实验平台:PC机、8255并行接口芯片、行列式键盘、七段数码管、面包板、导线等。

2. 软件环境:汇编语言编程软件、仿真软件等。

四、实验步骤1. 硬件连接:将8255并行接口芯片、行列式键盘、七段数码管连接到实验平台上,按照电路图进行连线。

2. 编写程序:使用汇编语言编写键盘扫描和数码管显示的程序。

(1)初始化8255并行接口芯片:设置PA口为输出端口,PB口为输出端口,PC口为输入端口。

(2)扫描键盘:通过PC口读取键盘的行线状态,判断是否有按键被按下。

若检测到按键被按下,读取对应的列线状态,确定按键的位置。

(3)数码管显示:根据按键的位置,控制数码管的段(A、B、C、D、E、F、G)的亮灭,显示相应的数字。

3. 仿真调试:使用仿真软件对程序进行调试,确保程序能够正确扫描键盘和显示数字。

五、实验结果与分析1. 实验结果:成功实现了键盘扫描和数码管显示的功能。

当按下键盘上的任意按键时,数码管上会显示对应的数字。

2. 分析:(1)键盘扫描部分:通过读取PC口的行线状态,判断是否有按键被按下。

当检测到按键被按下时,读取PB口的列线状态,确定按键的位置。

最新东南大学-微机原理-微机系统与接口-实验五-六-实验报告-自动化学院

最新东南大学-微机原理-微机系统与接口-实验五-六-实验报告-自动化学院

东南大学《微机实验及课程设计》实验报告实验五8253 计数器/定时器实验六8255 并行输入输出姓名:学号:08011专业:自动化实验室:计算机硬件技术实验时间:2012年04月27日报告时间:2013年05月15日评定成绩:审阅教师:一. 实验目的实验五:1)掌握计数器/定时器8253 的基本工作原理和编程应用方法;2)了解掌握8253 的计数器/定时器典型应用方法实验六:1)掌握8255方式0的工作原理及使用方法,利用直接输入输出进行控制显示;2)掌握8段数码管的动态刷新显示控制;3)分析掌握8255工作方式1时的使用及编程,进一步掌握中断处理程序的编写。

二. 实验内容实验五:必做:5-1 将计数器0设置为方式0,计数初值为N(小于等于0FH),用手动的方式逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化。

(参考程序p63)5-2 将计数器0、1分别设置在方式3,计数初值设为1000,用逻辑笔观察OUT0电平的变化。

(参考程序p64)实验六:(1)8255方式 0:简单输入输出实验电路如图一,8255C口输入接逻辑电平开关K0~K7,编程A口输出接 LED显示电路L0~L7;用指令从 C口输入数据,再从A口输出。

图一 8255简单输入输出(2)编程将A口 L0-L7控制成流水灯,流水间隔时间由软件产生;流水方向由K0键在线控制,随时可切换;流水间隔时间也可由K4~K7键编码控制,如 0000对应停止,0001对应 1秒,1111对应 15秒,大键盘输入 ESC键退出。

(3)8段数码管静态显示:按图二连接好电路,将 8255的 A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端 S1接+5V(选中),S0、dp接地(关闭)。

编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。

图二单管静态显示(4) 8段数码管动态显示:按图三连接好电路,七段数码管段码连接不变,位码驱动输入端S1、S0 接8255 C口的PC1、PC0。

利用8253_、8255实现竞赛抢答器的功能(1)

利用8253_、8255实现竞赛抢答器的功能(1)

利用8253、8255实现竞赛抢答器的功能摘要:8255内部有3个相互独立的8位数据端口,即端口A﹑端口B﹑端口C。

设计人员可以用程序使他们分别作为输入端口或输出端口。

而8253即可对系统时钟脉冲计数实现定时,又可对外部事件进行计数。

所以利用8253、8255的定时、中断控制的功能可实现抢答器的功能。

关键字:8253、8255、中断、抢答器0.引言:本文主要利用8253 、8255实现竞赛抢答器的以下功能,第一,可供4组选手同时抢答,由按钮控制。

第二,能显示出最先抢答的组号,而对其他组的抢答不予理睬。

第三,对主持人未曾按启动扭之前就按抢答按钮的犯规组,亮红灯警告。

第四,对抢答后的回答时间进行计时控制,如回答超时,则以音响报警。

1.芯片介绍:(1)8255芯片8255A内部有3个相互独立的8位数据端口,即端口A﹑端口B﹑端口C。

设计人员可以用程序是他们分别作为输入端口或输出端口。

不过,每个端口有着各自的特点。

端口A对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。

所以,用端口A作为输入或输出时,数据均可以受到锁存。

端口B对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。

端口C对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。

这样,当端口C作为输入端口时,对数据不作锁存,而作为输出端口时,对数据进行锁存。

在使用中,端口A﹑端口B和端口C可以相互独立,分别作为输入或者输出端口,也可以由端口C配合端口A﹑端口B作输入端口或者输出端口,此时,端口A和端口B作为独立的输入端口或输出端口,而端口C则配合端口A和端口B工作。

具体得讲,端口C常常通过控制命令被分成两个4位端口,每个4位端口包含1个4位的输入缓冲器和1个4位的输出锁存器/缓冲器,他们分别用来位端口A和端口B提供控制信号和状态信号。

方式选择控制字8255A引脚图(2)8253芯片8253的主要性能:8253可编程定时/计数器芯片时Intel公司生产的微型计算机通用外围芯片之一。

8-2 8255的应用实例解读

8-2 8255的应用实例解读
23
CPU发读信 号 2019/2/24
PPT
STB#(Strobe闸门)——选通输入信号,低电平有效。它是外设供给的输入信 号,当其有效时将外设来的数据送入8255的输入锁存器。A组对应(接到) PC4;B组对应PC2。 IBF(input buffer full)——输入锁存器满,高电平有效。这是一个8255输给 外设的联络信号。当其有效时,通知外设输入的数据已写入缓冲器,此时不能 送下一个数据。CPU用IN指令取走数据后,此信号被清除。A组对应PC5;B组 对应PC1。如果外设不需要这个信号你可以悬空不用。
表中的输入输出时是 针对8255而言。
2019/2/24
22
8255A方式1 (输入)情况下四个联络信号及工作过程
PC口的哪一位做选通信号和口有关和输出输入 有关,比如同为输入A口用PC4,B口用PC2
向C口写P4位置1, 开放中断
外设产生 数据 1
1 1 1 1
数据出现在外 数据进入8255A 部数据总线 的 A口 注意:此工作是 外设发选通 外部设备 8255A初始化时 信号 通知外设缓冲区已 完成的!!! 满,表示已经接受 数据 向CPU发中断请 求信号
2019/2/24
21
8255 的方式1----选通输入方式
在这种工作方式下,数据的输入输出操作要在选通信号控制下完成。和外设商量着来
端口A和端口B仍作 为数据的输入、输出 口; 端口C的某些位作为 端口A和端口B的选 通控制信号,配合 AB 口使用。
A口、B口在作为输入 和输出时的选通信号 源自不同的引脚。
C口置位复位控制字来设置
如图
INTE(interrupt enable)——端口中断允许信号,可由用户通 过对PC4位置位来实现。如果你想让CPU已中断的方式处理输 入的数据,那么设INTE =1,允许发出INTR请求。该信号没 有外接引脚,INTE状态通过C口置位复位控制字来设置。 2019/2/24 25
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O 口。

具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。

其各口功能可由软件选择,使用灵活,通用性强。

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管脚
特性
(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两种模式,而这些操作模式完全由控制寄存器的控制字决定.
引脚功能
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时,控制寄存器被选择.
编程模型
以下是程序及原理图,有不好的地方请见谅。

#include<reg52.h>
#include<absacc.h>
typedef unsigned intuint;
typedef unsigned char uchar;
#define com8255 XBYTE[0x7fff]
#define PA8255 XBYTE[0x7cff]
#define PB8255 XBYTE[0x7dff]
#define PC8255 XBYTE[0x7eff]
uchar code scancode[3]={0xfe,0xfd,0xfb};
uchar code ledlight[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar temp;
void delay(uinti)
{
uint j;
while(i--)
{
for(j=0;j<125;j++)
;
}
}
void init8255(void)
{
com8255=0x82;
}
void scan()
{
uchar tem;
PC8255=0x00;
tem=PB8255;
if(~tem)
{
delay(10);
PC8255=0x00;
tem=PB8255;
if(~tem)
PC8255=scancode[0]; tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=0;break; case 0xfd:temp=3;break; case 0xfb:temp=6;break; case 0xf7:temp=9;break;
}
while(~tem)
{
PC8255=scancode[0]; tem=PB8255;
}
}
PC8255=scancode[1];
tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=1;break; case 0xfd:temp=4;break; case 0xfb:temp=7;break; case 0xf7:temp=10;break;
}
while(~tem)
{
PC8255=scancode[1]; tem=PB8255;
}
}
PC8255=scancode[2];
tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=2;break; case 0xfd:temp=5;break; case 0xfb:temp=8;break; case 0xf7:temp=11;break;
}
while(~tem)
{
PC8255=scancode[2]; tem=PB8255;
}
}
}
}
void display()
{
PA8255=ledlight[temp];
}
void main()
{
init8255();
while(1)
{
scan();
display();
} }。

相关文档
最新文档