/*----------------------------------------------------------------------------------------------------------------
库文件名称:driver8155.h
功能描述:驱动8155,透明操作8155,读写存储器,读写PA、PB、PC,设置计数模式,读计数值,开中断,输出中断。
全局变量: state_flags是8155命令/状态寄存器再RAM中的映射,不允许其它程序改动
特殊说明: 无
//----------------------------------------------------------------------------------------------------------------*/
#include<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);
}