⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drive8155.c

📁 单片机端口扩展程序
💻 C
字号:
/*----------------------------------------------------------------------------------------------------------------
库文件名称: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);
			   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -