打印
[AVR单片机]

谁能帮我看看这个程序,AVR IO口模拟I2C读写PCF8563

[复制链接]
2179|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vv123456|  楼主 | 2012-12-20 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
显示不了,希望各位帮我看看程序错在那里了,,
//读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

相关帖子

沙发
vv123456|  楼主 | 2012-12-20 20:22 | 只看该作者
Init8563(&time);
GetTime(&time);
char time[7]={ 0x59,0x06,0x10,//秒,分,时
0x13,0x01,0x07,0x08};//日,星期,月,年.
display_GB2312_string(1,1,time[0]);

使用特权

评论回复
板凳
nbsmaps| | 2012-12-21 09:05 | 只看该作者
IIC有时间要求的,我看你延时是1机器周期,会不会是太快了,IIC从设备根本没通接收啊

使用特权

评论回复
地板
vv123456|  楼主 | 2012-12-21 16:43 | 只看该作者
4US不够吗

使用特权

评论回复
5
refee| | 2012-12-21 16:56 | 只看该作者
嘿嘿,建议I2C跑100K……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

722

帖子

1

粉丝