PCF8563 的头文件做好了!有需要的来看看啊!呵呵
PCF8563 的头文件做好了!感谢hanwl提供资料!拿出来和大家共享一下!只需修改前面的宏定义就可以了!
只需调用GetPCF8563();函数就可以了,出口参数:年月日时分秒了,呵呵!
/************************************************************************
//ICC-AVR application builder : 2006-8-10 下午 02:12:10 // Target : M16
// Crystal: 8Mhz
时钟芯片PCF8563头文件
************************************************************************/
#define SDA_SET PORTC|=BIT(1); //时钟芯片数据接口PC1
#define SDA_CLR PORTC&=~BIT(1);
#define CLK_SET PORTC|=BIT(0); //时钟芯片时钟接口PC0
#define CLK_CLR PORTC&=~BIT(0);
#define SDA_DI_SET DDRC|=BIT(1);
#define SDA_DI_CLR DDRC&=~BIT(1);
#define CLK_DI_SET DDRC|=BIT(0);
#define CLK_DI_CLR DDRC&=~BIT(0);
#define CHECK_SDAPINC&BIT(1)
unsigned char miao,fen,shi,tian,yue,nian;
unsigned char old_sec,new_sec;
void I2C_Start (void)
{
SDA_DI_SET;
CLK_DI_SET;
CLK_SET;
SDA_SET;
delay_nus(2);
SDA_CLR;
delay_nus(2);
SDA_SET;
}
void I2C_Stop (void)
{
SDA_DI_SET;
CLK_DI_SET;
SDA_CLR;
CLK_SET;
delay_nus(2);
SDA_SET;
delay_nus(2);
}
unsigned char I2C_Ackn(void)
{
unsigned char errtime=255;
CLK_DI_SET;
SDA_DI_CLR;
delay_nus(2);
while(CHECK_SDA)
{
errtime--;
if (!errtime)
{
I2C_Stop();
return 0x00;
}
}
CLK_SET;
delay_nus(2);
CLK_CLR;
delay_nus(2);
return 0x01;
}
void Write_I2C_Byte(unsigned char byte)
{
unsigned char i;
SDA_DI_SET;
CLK_DI_SET;
for (i = 0; i < 8; i++)
{
CLK_CLR;
if((byte & 0x80))
{
SDA_SET;
}
else
{
SDA_CLR;
}
delay_nus(2);
CLK_SET;
asm("nop");
byte = byte << 1;
}
CLK_CLR;
if (I2C_Ackn()==0) delay_nus(5);
CLK_CLR;
}
unsigned char Read_I2C_Byte(void)
{
unsigned char i,buff = 0;
delay_nus(2);
CLK_DI_SET;;
SDA_DI_CLR;
for (i = 0; i < 8; i++)
{
CLK_CLR;
delay_nus(2);
CLK_SET;
delay_nus(2);
if ( CHECK_SDA) buff++;
buff = (buff << 1);
delay_nus(2);
}
SDA_DI_SET;
CLK_DI_SET;
SDA_CLR;
delay_nus(2);
CLK_SET;
delay_nus(2);
CLK_CLR;
return buff;
}
unsigned char rtc_read(unsigned char address)
{
unsigned char d;
I2C_Start();
Write_I2C_Byte(0xa2);
Write_I2C_Byte(address);
I2C_Start();
Write_I2C_Byte(0xa3);
d=Read_I2C_Byte();
d=d>>1;
I2C_Stop();
return d;
}
void rtc_write(unsigned char address,unsigned char data1)
{
I2C_Start();
Write_I2C_Byte(0xa2);
Write_I2C_Byte(address);
Write_I2C_Byte(data1);
I2C_Stop();
}
void rtc_start(void)
{
rtc_write(0,0);
}
void rtc_stop(void)
{
rtc_write(0,0x20);
}
void SetPCF8563(unsigned char adds,unsigned char data)
{
CLI();
rtc_stop();
rtc_write(adds,data);
rtc_start();
SEI();
}
void set8563(void) //设置时间!
{ //这里就自己弄吧!我就偷懒了,呵呵!
SetPCF8563(8,0x06); //设置年
SetPCF8563(7,0x08); //设置月
SetPCF8563(5,0x09); //设置日
SetPCF8563(4,0x23); //设置时
SetPCF8563(3,0x59); //设置分
SetPCF8563(2,0x49); //设置秒
}
void GetPCF8563() //只需调用这个函数就可以了!(设置时间除外哦!)
{
CLI(); // 出口参数就是这些了
miao=(rtc_read(2)&0x7f); //秒
fen=(rtc_read(3)&0x7f); //分
shi=(rtc_read(4)&0x3f); //时
tian=(rtc_read(5)&0x3f);
yue=(rtc_read(7)&0x1f);
nian=(rtc_read(8)); //年
SEI();
} 不好意思,延时子程序给忘了贴了,
//delay.h
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
} 支持!谢谢 我正在学习这些外围器件使用
thank you very much! 客气什么啊!大家多交流嘛! 使用软件模拟IIC吗?
为什么不用AVR的硬件IIC呢,可能硬件的更好吧
? 呵呵,正准备换成TWI呢!今天是没有时间了,改天吧! TWI 的程序来喽! 为什么不用AVR的硬件IIC呢???? 请问LZ,如果改了频率为16M,程序里面有什么地方需要改吗?单片机的外部时钟晶振对8563有影响吗 在网上找了一个下5,只发现了这个程序只改一点点就能用,5分钟前把程序头改了一下,能用。很好。特来道谢!这个程序序昨天我搞了一天,水平有线。没搞定 怎么我用这个头文件用不了,调用总是返回GETPCF8563中的相与值0x7f,0x7f,0x37..?
请问各位是什么原因?? 学习一下 俺也用这个芯片.一直正常 TWI一点都不觉得好用,配置复杂
IO口固定
没ARM的专用硬件方便,I2C和SPI都是专用的,速度快,而且IO可配置,灵活的硬件使用 mark 学习一下 mark。 学习了!!!!!!!! 顶! mARK mark 谢谢! 学习 mark h和c不区分的典型情况。。。多个文件中调用该驱动就不方便了 jh mark ,谢谢分享 mark 试下,谢谢共享 回复【楼主位】hhrfjz---
-----------------------------------------------------------------------
谢谢分享。 在/INT 脚产生周期为1s 的脉冲中断信号 怎么改程序呢 d=Read_I2C_Byte();
d=d>>1;
I2C_Stop();
return d;
其中d=d>>1;
是什么意思,请楼主指教一下 好东西,顶一下 顶一下 mark~~~~~~ 卸下楼主分享! moouse 发表于 2011-12-30 22:12 static/image/common/back.gif
d=Read_I2C_Byte();
d=d>>1;
I2C_Stop();
左移一位 学习一下 顶个
但不知楼主 SET();子函数在哪哦, mark,留用 {:smile:}{:smile:}{:smile:}{:smile:} {:smile:}顶 学习一下.... 正说要做这个来玩玩 {:lol:}{:lol:}老贴,很具有参考意义! 学习了{:smile:}
页:
[1]