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

📄 drive8255.c

📁 单片机端口扩展程序
💻 C
字号:
/*----------------------------------------------------------------------------------------------------------------
库文件名称:driver8155.h
功能描述:驱动8155,不需要了解8255的工作原理,透明操作8255的三个输入输出口PA、PB、PC
          读A口只需要调用rd_PA,写则需要调用wr_PA;B、C操作也一样
全局变量: IO_flags,在其它程序中不能对其改写
特殊说明: 无
//----------------------------------------------------------------------------------------------------------------*/
 #include<config.h>
unsigned char const cfg_table[8]={
             0x80,       /*10000000b,       ;c=out  b=out  a=out*/
             0x90,       /*10010000b,       ;c=out  b=out  a=in */
             0x82,       /*10000010b,       ;c=out  b=in   a=out*/
             0x92,       /*10010010b,       ;c=out  b=in   a=in */
             0x89,       /*10001001b,       ;c=in   b=out  a=out*/
             0x99,       /*10011001b,       ;c=in   b=out  a=in */
             0x8B,       /*10001011b,       ;c=in   b=in   a=out*/
             0x9B,       /*10011011b,       ;c=in   b=in   a=in */
			 };
unsigned char rd_mem(unsigned char mem_ad)
             {
			 }

void PABC_config(void )
              {
			  a8255_CON=cfg_table[IO_flags];
			  }

char rd_PA(void)						 /*读PA口*/
 			   {
			   unsigned char PA_data;
			   ACC=IO_flags;			 /*把状态标志字读到ACC便于进行位操作*/
			   do
			   {
			    IO_flagsA=1;         	 /*置PA状态标志位为高--输入*/
				IO_flags=ACC;
				PABC_config();			  /*调用配置子程序,完成对8255的设置*/
				ACC=IO_flags;					
				}
				while(IO_flagsA==0);	 /*判断状态标志位是否为高*/
										 /*控制字设置完成*/
				PA_data=a8255_PA;		 /*把PA口的数据读到PA_data*/
				return(PA_data);		 /*返回PA_data*/
				}
char rd_PB(void)						 /*读PB口*/
 			   {
			   unsigned char PB_data;
			   ACC=IO_flags;			 /*把状态标志字读到ACC便于进行位操作*/
			   do
			   {
			    IO_flagsB=1;         	 /*置PB状态标志位为高--输入*/
				IO_flags=ACC;
				PABC_config();			  /*调用配置子程序,完成对8255的设置*/
				ACC=IO_flags;					
				}
				while(IO_flagsB==0);	 /*判断状态标志位是否为高*/
										 /*控制字设置完成*/
				PB_data=a8255_PB;		 /*把PA口的数据读到PB_data*/
				return(PB_data);		 /*返回PB_data*/
				}
char rd_PC(void)						 /*读PC口*/
 			   {
			   unsigned char PC_data;
			   ACC=IO_flags;			 /*把状态标志字读到ACC便于进行位操作*/
			   do
			   {
			    IO_flagsC=1;         	 /*置PC状态标志位为高--输入*/
				IO_flags=ACC;
				PABC_config();			  /*调用配置子程序,完成对8255的设置*/
				ACC=IO_flags;					
				}
				while(IO_flagsC==0);	 /*判断状态标志位是否为高*/
										 /*控制字设置完成*/
				PC_data=a8255_PC;		 /*把PC口的数据读到PC_data*/
				return(PC_data);		 /*返回PC_data*/
				}

void wd_PA(unsigned char PA_data)		  /*写PA口*/
                {
			    ACC=IO_flags;			  /*把状态标志字读到ACC便于进行位操作*/
         	
			    {IO_flagsA=0;			  /*置PA状态标志位为低--输出*/
			    IO_flags=ACC;			  /*位操作完成,把ACC的内容写回状态标志字*/
				PABC_config();			  /*调用配置子程序,完成对8255的设置*/
			    ACC=IO_flags;			  
				}
				while(IO_flagsA==1);	  /*判断状态标志位是否为高
				                            为高,设置未完成,需从新设置*/

			   a8255_PA=PA_data;		   /*将PA_data的内容送到PA口*/
				}
void wd_PB(unsigned char PB_data)		  /*写PB口*/
                {
			    ACC=IO_flags;			  /*把状态标志字读到ACC便于进行位操作*/
         	
			    {IO_flagsB=0;			  /*置PB状态标志位为低--输出*/
			    IO_flags=ACC;			  /*位操作完成,把ACC的内容写回状态标志字*/
				PABC_config();			  /*调用配置子程序,完成对8255的设置*/
			    ACC=IO_flags;			  
				}
				while(IO_flagsB==1);	  /*判断状态标志位是否为高
				                            为高,设置未完成,需从新设置*/

			   a8255_PB=PB_data;		   /*将PB_data的内容送到PB口*/
				}
void wd_PC(unsigned char PC_data)		  /*写PC口*/
                {
			    ACC=IO_flags;			  /*把状态标志字读到ACC便于进行位操作*/
         	
			    {IO_flagsC=0;			  /*置PC状态标志位为低--输出*/
			    IO_flags=ACC;			  /*位操作完成,把ACC的内容写回状态标志字*/
				PABC_config();			  /*调用配置子程序,完成对8255的设置*/
			    ACC=IO_flags;			  
				}
				while(IO_flagsC==1);	  /*判断状态标志位是否为高
				                            为高,设置未完成,需从新设置*/

			   a8255_PC=PC_data;		   /*将PC_data的内容送到PC口*/
				}
void set_PC(unsigned char PC_num)
             {
			 ACC=IO_flags;
			 IO_flagsC=0;
             ACC=IO_flags;
			 PC_num=PC_num<<1;
			 PC_num=(PC_num|0x01);
             a8255_CON=PC_num;
      		 }
void clr_PC(unsigned char PC_num)
             {
			 ACC=IO_flags;
			 IO_flagsC=1;
             ACC=IO_flags;
			 PC_num=PC_num<<1;
			 PC_num=(PC_num&0xFE);
             a8255_CON=PC_num;
      		 }
			  
void main(void)
               {
			   set_PC(0x01);
			   }

⌨️ 快捷键说明

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