sbitIC_SCL=P3^6;
sbitIC_SDA=P3^7;
unsignedcharIC_Re_Time;
unsignedcharIC_Err_Flag;
voidTimer0_Init(void)
{
TMOD=0x00;信方式:
I2C
2.通信端口:
IC_SCL,IC_SDA
3.通信地址:
0x0101000x?
***********************************************/?
voidIC_Start(void)//启动IC通信
{?
IC_SDA=1;
Delay();
IC_SCL=1;
Delay();
IC_SDA=0;
Delay();
IC_SCL=0;
Delay();?
}
voidIC_Stop(void)//停止IC通信
{
?
IC_SDA=0;
Delay();
IC_SCL=1;
Delay();
IC_SDA=1;
Delay();?
}
voidIC_Receive_Ack(void)//接受ACK
{?
IC_SDA=1;
IC_SCL=1;?
Delay();?
IC_Re_Time=0;?
while(IC_Re_Time<=30)
{
if(IC_SDA==0)
{
IC_Err_Flag=0;
break;
}?
else
{
IC_Err_Flag=1;
}
}
IC_SCL=0;
Delay();
}
//voidIC_Send_ACK(void)//发送ACK
//{//ifreadmanydatasatatime,thiscanbeused
//IC_SDA=0;
//Delay();
//IC_SCL=1;
//Delay();
//IC_SCL=0;
//Delay();
//IC_SDA=1;
//}
voidIC_Send_NAck(void)//发送NACK
{
IC_SDA=1;
Delay();
IC_SCL=1;
Delay();
IC_SCL=0;
Delay();
}
voidIC_Write_Byte(unsignedcharData)//写数据到8574
{
unsignedchari;?
for(i=0;i<=7;i++)
{
if(VALBIT(Data,(7-i)))//dataoutmsb
IC_SDA=1;
else
IC_SDA=0;
IC_SCL=1;
Delay();
IC_SCL=0;
Delay();?
}?
}
unsignedcharIC_Read_Byte(void)//从8574读取一个数据
{
unsignedchari;
unsignedcharData;
for(i=0;i<=7;i++)
{
IC_SCL=1;
Delay();
IC_SDA=1;
Delay();?
if(IC_SDA)
SETBIT(Data,(7-i));//datainmsbtoo
else
CLRBIT(Data,(7-i));
IC_SCL=0;
Delay();
}
return(Data);
}
voidIC_Write_Data(unsignedcharData)
{
unsignedcharwrite_time;
unsignedcharwrite_data;
write_data=Data;
for(write_time=0;write_time<=2;write_time++)
{?
IC_Start();
IC_Write_Byte(0x40);
IC_Receive_Ack();
IC_Write_Byte(write_data);
IC_Receive_Ack();?
IC_Stop();
if(IC_Err_Flag==0)
break;
}?
}
unsignedcharIC_Read_Data(void)
{
unsignedcharReturn_Data;
unsignedcharread_time;
for(read_time=0;read_time<=2;read_time++)
{?
IC_Start();
IC_Write_Byte(0x41);?
IC_Receive_Ack();?
Return_Data=IC_Read_Byte();?
IC_Send_NAck();
IC_Stop();?
if(IC_Err_Flag==0)
{
return(Return_Data);
break;
}
}?
}
voidPCF8574_Init(void)
{
IC_Write_Data(0xf0);//输入状态的必须开始的时候置为1,输出为0
}
voidmain(void)
{
unsignedchartemp3;
Timer0_Init();
PCF8574_Init();
while
(1)
{
temp3=IC_Read_Data();
IC_Write_Data(0x0f);
Delay();
;中间可以添加你需要的模块,比如显示或者其他的操作等
}
}
/*********************************************************
*中断服务子程序*
*********************************************************/
externvoidexternal0_rt(void)interrupt0//INT0
{
}
externvoideit0_rt(void)interrupt1//T0,标准,定时中断
{
TH0=0x1e;
TL0=0x0c;
IC_Re_Time++;?
}
voidexternal1_rt(void)interrupt2using1//INT1
{
}
voideit1_rt(void)interrupt3using1//T1,标准
{
}
voidsci_rt(void)interrupt4using1//UART
{
}
voideit2_rt(void)interrupt5using1//T23种工作模式,输入捕捉、自动重载和波形发生器
{
}
voidPCA_rt(void)interrupt6using1//PCA
{
}
voidKBDIT_rt(void)interrupt7using1//keyboard
{
}
voidspi_rt(void)interrupt9using1//SPI
{
}