您的位置:首页技术文栏单片机C51
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

驱动8155,透明操作8155,读写存储器,读写PA、PB、PC,设置计数模式,读计数值,开中断,输出中断。

[日期:2008-06-27 ] [来源:东哥单片机学习网 www.picavr.com 整理 作者:佚名] [字体: (投递新闻)
drive8155  2007-3-13 22:16:00
 

/*----------------------------------------------------------------------------------------------------------------
库文件名称: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输出模式*/
 
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐