/*----------------------------------------------------------------------------------------------------------------
库文件名称: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控制字*/