【实例24】用8243扩展I/O端口#includereg52.hsbitContrBit0=P1^0;sbitContrBit1=P1^1;sbitContrBit2=P1^2;sbitContrBit3=P1^3;sbitPROG=P1^4;sbitCS=P1^5;chardriver8243(charsele_P,charsele_M,charout_data){charin_data=0;chardata_buf;PROG=1;//置PROG为高电平//----------------------------------------------开始写控制字-----------------------------------------------if((sele_P&0x01)==0)//将控制字最低位送到8243的p2.0ContrBit0=0;elseContrBit0=1;if((sele_P&0x02)==0)//将控制字第二位送到8243的p2.1ContrBit1=0;elseContrBit1=1;//以上两位共同指定端口地址//----------------------------------------写端口工作模式控制字----------------------------------------if((sele_M&0x01)==0)//将端口工作模式控制字低位送到8243的p2.2ContrBit2=0;elseContrBit2=1;if((sele_M&0x01)==0)//将端口工作模式控制字高位送到8243的p2.3ContrBit3=0;elseContrBit3=1;//完成写控制字PROG=0;//在PROG上产生下降沿switch(sele_M&0x03)//判断工作模式{case0:break;//sele_M=B00为输入,不处理,等待上升沿case1:data_buf=out_data;break;//sele_M=B01为输出,直接送数据case2:data_buf=out_data;break;//sele_M=B10为逻辑或,直接送数据case3:data_buf=out_data;break;//sele_M=B11为逻辑与,直接送数据}PROG=1;//产生上升沿if((sele_M&0x03)==0)//sele_M=B00为输入,接收数据in_data=(data_buf&0x0F);return(in_data);//sele_M=B00,返回接收到的数据}//sele_M!=B00,返回0voidmain(void){charreceive_data;receive_data=driver8243(1,0,5);}【实例25】用8255A扩展I/O口//----------------------------------------------------------------------------------------------------//函数名称:rd_PA//输入函数:无//输出参数:PA_data,PA输入的数据//功能说明:驱动PA实现输入功能,读入PA的并行数据//----------------------------------------------------------------------------------------------------unsignedcharrd_PA(void)//读PA管脚定义及函数声明//-------------------------------------------函数声明,管脚定义-------------------------------------------#includereg52.h#includeABSACC.H#definea8255_PAXBYTE[0x7F7C]//PA地址#definea8255_PBXBYTE[0x7F7D]//PB地址#definea8255_PCXBYTE[0x7F7E]//PC地址#definea8255_CONXBYTE[0x7F7F]//控制字地址unsignedcharbdataIO_flags;//用于表示PA、PB、PC的当前输入输出状态//内容不能被其他程序改写sbitIO_flagsA=IO_flags^0;//PA的当前输入输出状态sbitIO_flagsB=IO_flags^1;//PB的当前输入输出状态sbitIO_flagsC=IO_flags^2;//PC的当前输入输出状态unsignedcharconstcfg_table[8]={0x80,//10000000b,c=outb=outa=out0x90,//10010000b,c=outb=outa=in0x82,//10000010b,c=outb=ina=out0x92,//10010010b,c=outb=ina=in0x89,//10001001b,c=inb=outa=out0x99,//10011001b,c=inb=outa=in0x8B,//10001011b,c=inb=ina=out0x9B,//10011011b,c=inb=ina=in}unsignedcharrd_PA(void);//读PAunsignedcharrd_PB(void);//读PBunsignedcharrd_PC(void);//读PCvoidwr_PA(unsignedcharPA_data);//写PAvoidwr_PB(unsignedcharPB_data);//写PBvoidwr_PC(unsignedcharPC_data);//写PCvoidset_PC(unsignedcharPC_num);//PC位操作,置位,PC_num为端口号0~7voidclr_PC(unsignedcharPC_num);//PC位操作,复位,PC_num为端口号0~7voidPABC_config(void);//写8255A控制字端口A、B、C读写函数{unsignedcharPA_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_datareturn(PA_data);//返回PA_data}//----------------------------------------------------------------------------------------------------//函数名称:rd_PB//输入函数:无//输出参数:PB_data,PB输入的数据//功能说明:驱动PB实现输入功能,读入PB的并行数据//----------------------------------------------------------------------------------------------------unsignedcharrd_PB(void)//读PB{unsignedcharPB_data;ACC=IO_flags;//把状态标志字读到ACC便于进行位操作do{IO_flagsB=1;//置PB状态标志位为高--输入IO_flags=ACC;PABC_config();//调用配置子程序,完成对8255的设置}while(IO_flagsB==0);//判断状态标志位是否为高//控制字设置完成PB_data=a8255_PB;//把PB的数据读到PB_datareturn(PB_data);//返回PB_data}//----------------------------------------------------------------------------------------------------//函数名称:rd_PC//输入函数:无//输出参数:PC_data,PC输入的数据//功能说明:驱动PC实现输入功能,读入PC的并行数据//----------------------------------------------------------------------------------------------------unsignedcharrd_PC(void)//读PC{unsignedcharPC_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_datareturn(PC_data);//返回PC_data}//----------------------------------------------------------------------------------------------------//函数名称:wr_PA//输入函数:PA_data,送PA输出的数据//输出参数:无//功能说明:驱动PA实现输出功能,输出数据到PA//----------------------------------------------------------------------------------------------------voidwr_PA(unsignedcharPA_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}//----------------------------------------------------------------------------------------------------//函数名称:wr_PB//输入函数:PB_data,送PB输出的数据//输出参数:无//功能说明:驱动PB实现输出功能,输出数据到PA//----------------------------------------------------------------------------------------------------voidwr_PB(unsignedcharPB_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}//--------------