/*----------------------------------------------------------------------------------------------------------------
库文件名称:driver8155.h
功能描述:驱动8155,透明操作8155,读写存储器,读写PA、PB、PC,设置计数模式,读计数值,开中断,输出中断。
全局变量: state_flags是8155命令/状态寄存器再RAM中的映射,不允许其它程序改动
特殊说明: 无
//----------------------------------------------------------------------------------------------------------------*/
#i nclude<config.h>
void main(void)
{
unsigned char aa;
wr_mem(0x05,0x45);
aa=rd_mem(0x05);
}
unsigned char rd_mem(unsigned char mem_ad) /*读存储器*/
{
unsigned char mem_data;
unsigned int AD_mem;
AD_mem=&mem_head;
AD_mem=AD_mem+mem_ad;
mem_data=XBYTE[AD_mem];
return(mem_data);
}
void wr_mem(unsigned char mem_ad, unsigned char mem_data) /*写存储器*/
{
unsigned int AD_mem;
AD_mem=&mem_head;
AD_mem=AD_mem+mem_ad;
XBYTE[AD_mem]=mem_data;
}
char rd_PA(void) /*读PA口*/
{ unsigned char PA_data;
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
do
{
IO_flagA=0; /*置PA状态标志位为低--输入*/
state_flags=ACC;
a8155_CON=state_flags; /*重写控制字,完成对8155的设置*/
}
while(IO_flagA==1); /*判断状态标志位是否为高*/
/*控制字设置完成*/
PA_data=a8155_PA; /*把PA口的数据读到PA_data*/
return(PA_data); /*返回PA_data*/
}
char rd_PB(void) /*读PB口*/
{ unsigned char PB_data;
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
do
{
IO_flagB=0; /*置PB状态标志位为低--输入*/
state_flags=ACC;
a8155_CON=state_flags; /*重写控制字,完成对8155的设置*/
}
while(IO_flagB==1); /*判断状态标志位是否为高*/
/*控制字设置完成*/
PB_data=a8155_PB; /*把PB口的数据读到PB_data*/
return(PB_data); /*返回PB_data*/
}
char rd_PC(void) /*读PC口*/
{ unsigned char PC_data;
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
do
{
IO_flagC=0; /*置PB状态标志位为低--输入*/
IO_flagC1=0; /*置控制字D3=0*/
state_flags=ACC;
a8155_CON=state_flags; /*重写控制字,完成对8155的设置*/
}
while(IO_flagC==1); /*判断状态标志位是否为高*/
/*控制字设置完成*/
PC_data=a8155_PC; /*把PB口的数据读到PB_data*/
return(PC_data); /*返回PB_data*/
}
void wt_PA(unsigned char PA_data) /*写PA口*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
{IO_flagA=1; /*置PA状态标志位为高--输出*/
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
while(IO_flagA==0); /*判断状态标志位是否为低
为低,设置未完成,需从新设置*/
a8155_PA=PA_data; /*将PA_data的内容送到PA口*/
}
void wt_PB(unsigned char PB_data) /*写PB口*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
{IO_flagB=1; /*置PB状态标志位为高--输出*/
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
while(IO_flagB==0); /*判断状态标志位是否为低
为低,设置未完成,需从新设置*/
a8155_PB=PB_data; /*将PB_data的内容送到PB口*/
}
void wt_PC(unsigned char PC_data) /*写PC口*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
{IO_flagC=1; /*置PC状态标志位为高--输出*/
IO_flagC1=0; /*置控制字D3=0*/
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
while(IO_flagC==0); /*判断状态标志位是否为低
为低,设置未完成,需从新设置*/
a8155_PC=PC_data; /*将PC_data的内容送到PC口*/
}
void Dint_PA(void) /*关A口中断*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Int_flagA=0;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void Eint_PA(void) /*开A口中断*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Int_flagA=1;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void Dint_PB(void) /*关B口中断*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Int_flagB=0;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void Eint_PB(void) /*开B口中断*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Int_flagA=1;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void PC0_PAint(void) /*PC上半口为PA状态输出*/
{ /*PC0=INTRa,PC1=BFa,PC3=/STBaP*/
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Int_flagA=1;
IO_flagC1=1;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void PC4_PBint(void) /*PC上半口为PA状态输出*/
{ /*PC4=INTRb,PC5=BFb,PC6=/STBb*/
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Int_flagA=1;
IO_flagC1=1;
IO_flagC=1;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void start_timer(void) /*开始计数器计数*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Timer_flag1=1;
Timer_flag2=1;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void stop_timer(void) /*停止计数器计数*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Timer_flag1=1;
Timer_flag2=0;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
void setting_zero_stop(void) /*设定计数到零停止计数*/
{
ACC=state_flags; /*把状态标志字读到ACC便于进行位操作*/
Timer_flag1=0;
Timer_flag2=1;
state_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
a8155_CON=state_flags; /*写控制字,完成对8155的设置*/
}
int rd_timer(void) /*读计数值*/
{
int time;
char timea;
time=Timer_B;
timea=Timer_A;
time=time<<8;
time=((time&timea)&0x3F);
return(time);
}
void setting_timerout_mode(unsigned char mode) /*设定TIMERout输出模式*/
{
Timer_B=(mode&0x03);
}
/*----------------------------------------------------------------------------------------------------------------
文件名称:Config.h
功能描述:端口定义和RAM配置
输入参数:无
输出参数:无
特殊说明:根据具体分配的地址,重新设定各值
//----------------------------------------------------------------------------------------------------------------*/
#i nclude <reg52.h>
#i nclude<ABSACC.H>
#define a8155_CON XBYTE[0x7E00] /*控制字地址*/
#define a8155_PA XBYTE[0x7E01] /*PA口地址*/
#define a8155_PB XBYTE[0x7E02] /*PB口地址*/
#define a8155_PC XBYTE[0x7E03] /*PC口地址*/
#define Timer_A XBYTE[0x7E04] /*定时器寄存器A */
#define Timer_B XBYTE[0x7E05] /*定时器寄存器B */
#define mem_head XBYTE[0x7F00] /*存储器首地址*/
unsigned char state_flags; /* 表示PA、PB、PC的当前输入输出状态,PA、PB的中断状态,
计数器状态,内容不能被其它程序改写,操作时ACC=IO_flags*/
sbit IO_flagA=ACC^0; /*PA的当前输入输出状态置位表示输出,复位表示输入*/
sbit IO_flagB=ACC^1; /*PB的当前输入输出状态置位表示输出,复位表示输入*/
sbit IO_flagC=ACC^2; /*PC的当前输入输出状态置位表示输出,复位表示输入*/
sbit IO_flagC1=ACC^3; /*PC的当前输入输出状态置位表示输出,复位表示输入*/
sbit Int_flagA=ACC^4; /*PA的当前中断状态置位表示开中断,复位表示关中断*/
sbit Int_flagB=ACC^5; /*PB的当前中断状态置位表示开中断,复位表示关中断*/
sbit Timer_flag1=ACC^6;
sbit Timer_flag2=ACC^7; /*Timer的状态置位表示计数中,复位表示停止计数*/
unsigned char rd_mem(unsigned char mem_ad); /*读存储器*/
void wr_mem(unsigned char mem_ad, unsigned char mem_data);/*写存储器*/
char rd_PA(void); /*读PA口*/
char rd_PB(void); /*读PB口*/
char rd_PC(void); /*读PC口*/
void wr_PA(unsigned char PA_data); /*写PA口*/
void wr_PB(unsigned char PB_data); /*写PA口*/
void wr_PC(unsigned char PC_data); /*写PA口*/
void Dint_PA(void); /*关A口中断*/
void Eint_PA(void); /*开A口中断*/
void Dint_PB(void); /*关B口中断*/
void Eint_PB(void); /*开B口中断*/
void setting_PC0int(void);
void setting_PC4int(void);
void start_timer(void); /*开始计数器计数*/
void stop_timer(void); /*停止计数器计数*/
void setting_zero_stop(void); /*设定计数到零停止计数*/
int rd_timer(void); /*读计数值*/
void setting_timerout_mode(unsigned char mode); /*设定TIMERout输出模式*/