您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51单片机8255驱动C程序
51单片机8255驱动C程序/*----------------------------------------------------------------------------------------------------------------库文件名称:driver8155.h功能描述:驱动8155,不需要了解8255的工作原理,透明操作8255的三个输入输出口PA、PB、PC读A口只需要调用rd_PA,写则需要调用wr_PA;B、C操作也一样全局变量:IO_flags,在其它程序中不能对其改写特殊说明:无//----------------------------------------------------------------------------------------------------------------*/#includeconfig.hunsignedcharconstcfg_table[8]={0x80,/*10000000b,;c=outb=outa=out*/0x90,/*10010000b,;c=outb=outa=in*/0x82,/*10000010b,;c=outb=ina=out*/0x92,/*10010010b,;c=outb=ina=in*/0x89,/*10001001b,;c=inb=outa=out*/0x99,/*10011001b,;c=inb=outa=in*/0x8B,/*10001011b,;c=inb=ina=out*/0x9B,/*10011011b,;c=inb=ina=in*/};unsignedcharrd_mem(unsignedcharmem_ad){}voidPABC_config(void){a8255_CON=cfg_table[IO_flags];}charrd_PA(void)/*读PA口*/{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_data*/return(PA_data);/*返回PA_data*/}charrd_PB(void)/*读PB口*/{unsignedcharPB_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*/}charrd_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_data*/return(PC_data);/*返回PC_data*/}voidwd_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口*/}voidwd_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口*/}voidwd_PC(unsignedcharPC_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口*/}voidset_PC(unsignedcharPC_num){ACC=IO_flags;IO_flagsC=0;ACC=IO_flags;PC_num=PC_num1;PC_num=(PC_num|0x01);a8255_CON=PC_num;}voidclr_PC(unsignedcharPC_num){ACC=IO_flags;IO_flagsC=1;ACC=IO_flags;PC_num=PC_num1;PC_num=(PC_num&0xFE);a8255_CON=PC_num;}voidmain(void){set_PC(0x01);}/*---------------------------------------------------文件名称:Config.h功能描述:端口定义和RAM配置输入参数:无输出参数:无特殊说明:根据具体分配的地址,重新设定各值//----------------------------------------------------------------------------------------------------------------*/#includereg52.h#includeABSACC.H#definea8255_PAXBYTE[0x7F7C]/*PA口地址*/#definea8255_PBXBYTE[0x7F7D]/*PB口地址*/#definea8255_PCXBYTE[0x7F7E]/*PC口地址*/#definea8255_CONXBYTE[0x7F7F]/*控制字地址*/unsignedcharIO_flags;/*用于表示PA、PB、PC的当前输入输出状态内容不能被其它程序改写,操作时ACC=IO_flags*/sbitIO_flagsA=ACC^0;/*PA的当前输入输出状态置位表示输入,复位表示输出*/sbitIO_flagsB=ACC^1;/*PB的当前输入输出状态*/sbitIO_flagsC=ACC^2;/*PC的当前输入输出状态*/charrd_PA(void);/*读PA口*/charrd_PB(void);/*读PB口*/charrd_PC(void);/*读PC口*/voidwd_PA(unsignedcharPA_data);/*写PA口*/voidwd_PB(unsignedcharPB_data);/*写PA口*/voidwd_PC(unsignedcharPC_data);/*写PA口*/voidPABC_config(void);/*写8255控制字*/
本文标题:51单片机8255驱动C程序
链接地址:https://www.777doc.com/doc-5679667 .html