sbitIC_SCL=P3^6;
sbitIC_SDA=P3^7;
unsignedcharIC_Re_Time;
unsignedcharIC_Err_Flag;
voidTimer0_Init(void)
{
?
TMOD=0x00;?
//timer0工作定时器方式0,13位技术
?
TH0=0x1e;?
//5ms
?
TL0=0x0c;?
//5ms
?
TR0=1;?
?
//启动时钟0
?
ET0=1;?
?
//允许时钟0进行中断
?
EA=1;?
?
//开放所有中断
}
voidDelay(void)
{
?
unsignedchari;
?
for(i=0;i<=10;i++)
?
{
?
?
;
?
}?
}
unsignedcharVALBIT(unsignedintVal,unsignedcharBit)
{
?
unsignedintBuf;
?
Buf=0x0001;
?
if(Bit)
?
?
?
Buf<<=Bit;
?
Val&=Buf;
?
if(Val)
?
?
return(0xff);
?
else
?
?
return(0x00);
}
/**********************************************
?
?
?
?
?
?
?
?
?
下面是PCF8574的操作程序
1.通信方式:
I2C
2.通信端口:
IC_SCL(P3.6),IC_SDA(P3.7)
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
{
}