显示不了,希望各位帮我看看程序错在那里了,,
//读PCF8563 I2C
/*内部函数,延时1*/
void Delay(void)
{
asm("nop");asm("nop");asm("nop"); asm("nop");
}
void InitI2C(void)
{
PSDA_SET;
PSCL_SET;
}
/*内部函数,I2C开始*/
void Start(void)
{
DDRC|= (1<<PC5)|(1<<PC6);
PSDA_SET;//SDA=1;
PSCL_SET;//SCL=1;
Delay();
PSDA_CLR;
Delay();
}
/*内部函数,I2C结*/
void Stop(void)
{
DDRC|= (1<<PC5)|(1<<PC6);
PSDA_CLR;
PSCL_SET;
Delay();
PSDA_SET;
Delay();
}
//检测应答位
void Reack(void)
{
DDRC|= (1<<PC5)|(1<<PC6);
uchar i=0;
PSCL_SET; //准备检测SDA Delay5us();
DDRC&=~(1<<PC5);
while((PINC&(1<<PC5)==1)&&(i<100))i++;//SDA=0为应该信号,SDA=1为非应答
PSCL_CLR;//SCL=0; //准备下一变化数据
}
//写位I2C
void WriteByte(uchar ucByte)
{
DDRC|= (1<<PC5)|(1<<PC6);
uchar i;
PSCL_CLR;//SCL=0;
for(i=0;i<8;i++)
{
if((ucByte&0x80) == 0)
{
PSDA_CLR;
}
else
{
PSDA_SET;
}//SDA=(bit)(ucByte&0x80);//先写入高位
PSCL_SET;//SCL=1;
Delay();
PSCL_CLR;//SCL=0;
ucByte<<=1;
}
PSDA_SET;//SDA=1; //释放数据线
}
uchar ReadByte(void)
{
uchar i,ucByte;
DDRC|= (1<<PC5)|(1<<PC6);
PSCL_CLR;//SCL=0;
for(i=0;i<8;i++)
{
ucByte<<=1;
DDRC&=~(1<<PC5);
if(PINC&(1<<PC5))
ucByte++;
PSCL_SET;//SCL=1;
Delay();
PSCL_CLR;//SCL=0;
}
return ucByte;
}
void Write8563(uchar ucAddr,uchar ucData)
{
Start();
WriteByte(0xa2);
Reack();
WriteByte(ucAddr);
Reack();
WriteByte(ucData);
Reack();
Stop();
}
uchar Read8563(uchar ucAddr)
{
uchar ucData;
Start();
WriteByte(0xa2); //写器件地址
Reack();
WriteByte(ucAddr); //写字节地址
Reack();
Start();
WriteByte(0xa3); //写器件地址,最低为1表示读
Reack();
ucData=ReadByte(); //写字节地址
Stop();
return ucData; //读数据
}
void Init8563(uchar *timedata)
{
uchar i,ucAddr=0x02;
Write8563(0x00,0x00);
//Write8563(0x01,0x11);
for(i=0;i<7;i++)
{
Write8563(ucAddr,timedata[i]);
ucAddr++;
}
}
void GetTime(uchar *timedata)
{
uchar i,ucData1,ucData2,ucAddr=0x02;
//uchar *pTime=TAB_T;
for(i=0;i<7;i++)
{
timedata[i]=Read8563(ucAddr);
ucAddr++;
}
timedata[0]&=0x7f; //屏蔽无效位
timedata[1]&=0x7f;
timedata[2]&=0x3f;
timedata[3]&=0x3f;
timedata[4]&=0x07;
timedata[5]&=0x1f;
for(i=0;i<7;i++)
{
ucData1=timedata[i]/16; //BCD码转十六进制
ucData2=timedata[i]%16;
timedata[i]=ucData1*10+ucData2;
}
}
这个就是模拟IO口模拟读写PCF8563
|