51单片机8255驱动C程序

发布者:Tianran2021最新更新时间:2018-01-09 来源: eefocus关键字:51单片机  8255驱动 手机看文章 扫描二维码
随时随地手机看文章

/*---------------------------------------------------------------------------------------------------------------- 
库文件名称:driver8155.h 
功能描述:驱动8155,不需要了解8255的工作原理,透明操作8255的三个输入输出口PA、PB、PC 

读A口只需要调用rd_PA,写则需要调用wr_PA;B、C操作也一样

 

全局变量: IO_flags,在其它程序中不能对其改写 
特殊说明: 无 
//----------------------------------------------------------------------------------------------------------------*/ 
 #include 
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
#include  
#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控制字*/


关键字:51单片机  8255驱动 引用地址:51单片机8255驱动C程序

上一篇:AT93C46 SPI接口EEPROM读写程序
下一篇:SJA1000 CAN总线程序

推荐阅读最新更新时间:2024-03-16 15:52

51单片机入门——数字时钟
1. 前言 在此之前我们已经学习了单片机的定时器、中断、数码管。这篇文章主要讲述如何用上述的知识自己制作一个基于51单片机的数字时钟。 1.1. 设计要求 (1)主电路由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校准电路等构成。 (2)秒信号发生器一般用石英晶体振荡器加分频器实现。 (3)译码电路将时、分、秒计数器的输出状态送七段译码器译码,经过八位LED七段共阴显示器显示出来。 (4)校时电路用来对时、分、秒显示数字进行校对。 2. 硬件原理 2.1. 时钟信号(晶振) 单片机晶振部位电路,详情请参考《51单片机入门——单片机最小系统》,在此项目中我们选择 11.0592 MHz的晶振。 2.2. 按键
[单片机]
<font color='red'>51单片机</font>入门——数字时钟
12864点阵液晶显示模块与51单片机的接口及程序设计
显示器是人类与应用设备沟通的重要界面,近年来,随着电子技术的飞速发展,液晶显示技术在实际生活中得到了广泛应用。液晶显示模块以其微功耗、体积小、显示内容丰富、模块化以及接口电路简单等诸多优点在科研、生产和产品设计等领域中发挥着越来越重要的作用。LM3033B系列液晶显示模块是深圳TOPWAY公司生产的中文显示模块中的一员。采用了台湾的ST7920控制芯片,并提供了中文字库,为中文显示开发方面带来了更多的方便。本文以LM3033B-0BR3为例介绍了12864点阵液晶显示模块的引脚、结构、功能,详述了与AT89S52单片机的硬件接口电路及有关软件编程方法。 1 LM3033B-0BR3特点及操作 1.1 字符显示 每屏可显示
[单片机]
12864点阵液晶显示模块与<font color='red'>51单片机</font>的接口及程序设计
51单片机烧写程序的方法
STC89C51是应用广泛的51单片机,很多人都是通过该单片机入门学习的,单片机的学习需要勤动手。单片机需要烧写程序,要用到相关的软件和硬件。下面介绍一下51单片机烧写程序的方法。 1 所用到的硬件工具 51单片机烧写程序需要用到单片机的UART串口,所用到的工具为USB/TTL,具有四个引脚分别为5V、GND、TXD、RXD,需要和单片机的UART口连接,在连接的时候需要注意的是,串口要交叉连接,即USB/TTL的TXD和单片机的RXD连接;USB/TTL的RXD和单片机的TXD连接。 2 所用到的软件以及设置 STC的51单片机需要用到STC-ISP软件,该软件可以在STC的官网上下载到 烧写过程为:1)选择具体的单片机型
[单片机]
基于51单片机的太阳能路灯控制系统
简介:太阳能路灯控制系统:51单片机练手项目,简单可复制。 带太阳能充电功能,oled显示, 白天根据光强判断开关灯晚上开灯,二级菜单可以设置时间日期。 太阳能充电:传统锂电池充电芯片TP4056,使用6V太阳能板,给3.7V18650电池充电。 经过资料显示 18650电池尽量不要让其电压低于2.7V,所以后级供电电路(5V升压电路)MT3608启动引脚EN脚 连接了LM393制成的电压比较器。和电池电压比较,电池电压低于2.7v,MT3608启动脚拉低关断。 供电:使用升压芯片MT3608给单片机供电,让电池电压稳定在5.1V,来提供稳定电压。 #include reg52.h #include oled.h
[单片机]
基于<font color='red'>51单片机</font>的太阳能路灯控制系统
51单片机实现音频频谱显示的快速算法研究
1 引言 在家庭影院、卡拉OK等音响系统中,实时显示音乐信号的频谱将为音响系统增添不少色彩。目前实际生产的音响系统产品,大多采用以下两种方法实现音频频谱显示:一是利用硬件滤波器和A/D转换器;二是利用DSP处理频谱显示。前者实现简单,但硬件成本高,后者软件和硬件实现都较复杂。这里针对单片机RAM资源少、运算速度慢的特点,提出一种切实可行的快速傅里叶变换算法实现频谱显示。 2 系统整体设计及原理 该系统设计由单片机SST89V58RD2、音频数据采样电路、A/D转换电路、频谱显示电路等部分组成。图1为系统整体设计原理框图。 该系统从功能上可划分成3部分:(1)音频数据采集电路实现模拟音频信号的采样保持和量化处
[单片机]
<font color='red'>51单片机</font>实现音频频谱显示的快速算法研究
51单片机~定时器和外部中断(各个位控制作用详解)
(一)中断 (二)定时器,计数器中断 TL0低八位先进行存储,达到0XF,向上进一,直到高低八位都满时就可以产生中断或者控制TF0口。 (1). TMOD低四位控制T0,高四位控制T1。 GATE:(门控位) (2)控制寄存器TCON:(低四位控制外部中断,高四位控制计数器启动和中断申请) (3)定时器的四种工作方式: 定时器开启工作原理: 四种工作方式:(机器周期(脉冲)和T0引脚来绝定电路触发) 区别在于TH0和TL0的位数和输出) 常用1和2 1. 2.用于比较精确的脉冲信号发射器: 3. 程序化步奏: 计算:初值==2^n-N(公式要根据你使用那种方式0.1
[单片机]
<font color='red'>51单片机</font>~定时器和外部中断(各个位控制作用详解)
51单片机系列之驱动蜂鸣器发声
名称:51单片机驱动蜂鸣器发声 平台:Keil 4, Ly-51S学习板 内容:模拟报警声,如闹钟 滴 滴 滴 滴 -----------------------------------------------------*/ #include reg52.h sbit SPK = P1^2; void delay_2us(unsigned char t) { while(--t); } void main() { while(1) { delay_2us(25); SPK = !SPK; } }
[单片机]
MCS-51单片机存储空间的介绍以及划分
1.前言 MCS-51的存储器有片内RAM、片外RAM 和 ROM 三个空间。 MCS-51单片机在物理结构上有四个存储空间 1、片内程序存储器(片内ROM) 2、片外程序存储器(片外ROM) 3、片内数据存储器(片内RAM) 4、片外数据存储器(片外RAM) 在逻辑上(即从用户的角度上)MCS-51单片机有三个存储空间 1、片内外统一编址的64K的程序存储器(ROM)地址空间(MOVC) 2、256B的片内数据存储器(片内RAM)的地址空间(MOV) 3、以及64K片外数据存储器(片外RAM)的地址空间(MOVX) 注:在访问三个不同的逻辑空间时,应采用不同形式的指令以产生不同的存储器空间的选通信号。 2.存储空间划分 2.
[单片机]
MCS-<font color='red'>51单片机</font>存储空间的介绍以及划分
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved