/*----------------------------------------------------------------------------------------------------------------
庫文件名稱:driver8155.h
功能描述:驅動8155,透明操作8155,讀寫存儲器,讀寫PA、PB、PC,設置計數模式,讀計數值,開中斷,輸出中斷。
全局變量: state_flags是8155命令/狀態(tài)寄存器再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; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
do
{
IO_flagA=0; /*置PA狀態(tài)標志位為低--輸入*/
state_flags=ACC;
a8155_CON=state_flags; /*重寫控制字,完成對8155的設置*/
}
while(IO_flagA==1); /*判斷狀態(tài)標志位是否為高*/
/*控制字設置完成*/
PA_data=a8155_PA; /*把PA口的數據讀到PA_data*/
return(PA_data); /*返回PA_data*/
}
char rd_PB(void) /*讀PB口*/
{ unsigned char PB_data;
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
do
{
IO_flagB=0; /*置PB狀態(tài)標志位為低--輸入*/
state_flags=ACC;
a8155_CON=state_flags; /*重寫控制字,完成對8155的設置*/
}
while(IO_flagB==1); /*判斷狀態(tài)標志位是否為高*/
/*控制字設置完成*/
PB_data=a8155_PB; /*把PB口的數據讀到PB_data*/
return(PB_data); /*返回PB_data*/
}
char rd_PC(void) /*讀PC口*/
{ unsigned char PC_data;
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
do
{
IO_flagC=0; /*置PB狀態(tài)標志位為低--輸入*/
IO_flagC1=0; /*置控制字D3=0*/
state_flags=ACC;
a8155_CON=state_flags; /*重寫控制字,完成對8155的設置*/
}
while(IO_flagC==1); /*判斷狀態(tài)標志位是否為高*/
/*控制字設置完成*/
PC_data=a8155_PC; /*把PB口的數據讀到PB_data*/
return(PC_data); /*返回PB_data*/
}
void wt_PA(unsigned char PA_data) /*寫PA口*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
{IO_flagA=1; /*置PA狀態(tài)標志位為高--輸出*/
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
while(IO_flagA==0); /*判斷狀態(tài)標志位是否為低
為低,設置未完成,需從新設置*/
a8155_PA=PA_data; /*將PA_data的內容送到PA口*/
}
void wt_PB(unsigned char PB_data) /*寫PB口*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
{IO_flagB=1; /*置PB狀態(tài)標志位為高--輸出*/
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
while(IO_flagB==0); /*判斷狀態(tài)標志位是否為低
為低,設置未完成,需從新設置*/
a8155_PB=PB_data; /*將PB_data的內容送到PB口*/
}
void wt_PC(unsigned char PC_data) /*寫PC口*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
{IO_flagC=1; /*置PC狀態(tài)標志位為高--輸出*/
IO_flagC1=0; /*置控制字D3=0*/
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
while(IO_flagC==0); /*判斷狀態(tài)標志位是否為低
為低,設置未完成,需從新設置*/
a8155_PC=PC_data; /*將PC_data的內容送到PC口*/
}
void Dint_PA(void) /*關A口中斷*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Int_flagA=0;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void Eint_PA(void) /*開A口中斷*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Int_flagA=1;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void Dint_PB(void) /*關B口中斷*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Int_flagB=0;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void Eint_PB(void) /*開B口中斷*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Int_flagA=1;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void PC0_PAint(void) /*PC上半口為PA狀態(tài)輸出*/
{ /*PC0=INTRa,PC1=BFa,PC3=/STBaP*/
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Int_flagA=1;
IO_flagC1=1;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void PC4_PBint(void) /*PC上半口為PA狀態(tài)輸出*/
{ /*PC4=INTRb,PC5=BFb,PC6=/STBb*/
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Int_flagA=1;
IO_flagC1=1;
IO_flagC=1;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void start_timer(void) /*開始計數器計數*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Timer_flag1=1;
Timer_flag2=1;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void stop_timer(void) /*停止計數器計數*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Timer_flag1=1;
Timer_flag2=0;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
a8155_CON=state_flags; /*寫控制字,完成對8155的設置*/
}
void setting_zero_stop(void) /*設定計數到零停止計數*/
{
ACC=state_flags; /*把狀態(tài)標志字讀到ACC便于進行位操作*/
Timer_flag1=0;
Timer_flag2=1;
state_flags=ACC; /*位操作完成,把ACC的內容寫回狀態(tài)標志字*/
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的當前輸入輸出狀態(tài),PA、PB的中斷狀態(tài),
計數器狀態(tài),內容不能被其它程序改寫,操作時ACC=IO_flags*/
sbit IO_flagA=ACC^0; /*PA的當前輸入輸出狀態(tài)置位表示輸出,復位表示輸入*/
sbit IO_flagB=ACC^1; /*PB的當前輸入輸出狀態(tài)置位表示輸出,復位表示輸入*/
sbit IO_flagC=ACC^2; /*PC的當前輸入輸出狀態(tài)置位表示輸出,復位表示輸入*/
sbit IO_flagC1=ACC^3; /*PC的當前輸入輸出狀態(tài)置位表示輸出,復位表示輸入*/
sbit Int_flagA=ACC^4; /*PA的當前中斷狀態(tài)置位表示開中斷,復位表示關中斷*/
sbit Int_flagB=ACC^5; /*PB的當前中斷狀態(tài)置位表示開中斷,復位表示關中斷*/
sbit Timer_flag1=ACC^6;
sbit Timer_flag2=ACC^7; /*Timer的狀態(tài)置位表示計數中,復位表示停止計數*/
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輸出模式*/