hhrfjz 发表于 2006-8-13 14:49:26

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();

}

hhrfjz 发表于 2006-8-13 15:20:05

不好意思,延时子程序给忘了贴了,

//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();

}

okay51 发表于 2006-8-13 15:21:01

支持!谢谢 我正在学习这些外围器件使用

thank you very much!

hhrfjz 发表于 2006-8-13 18:30:02

客气什么啊!大家多交流嘛!

hs03 发表于 2006-8-13 21:49:55

使用软件模拟IIC吗?

为什么不用AVR的硬件IIC呢,可能硬件的更好吧

?

hhrfjz 发表于 2006-8-13 22:18:44

呵呵,正准备换成TWI呢!今天是没有时间了,改天吧!

hhrfjz 发表于 2006-8-15 13:41:48

TWI 的程序来喽!

ningmeng7294 发表于 2006-8-15 17:02:58

为什么不用AVR的硬件IIC呢????

florence 发表于 2006-12-10 14:37:12

请问LZ,如果改了频率为16M,程序里面有什么地方需要改吗?单片机的外部时钟晶振对8563有影响吗

wdmfhvk 发表于 2006-12-13 15:27:15

在网上找了一个下5,只发现了这个程序只改一点点就能用,5分钟前把程序头改了一下,能用。很好。特来道谢!这个程序序昨天我搞了一天,水平有线。没搞定

lilei0902 发表于 2006-12-26 13:59:23

怎么我用这个头文件用不了,调用总是返回GETPCF8563中的相与值0x7f,0x7f,0x37..?

请问各位是什么原因??

sdwflml 发表于 2009-6-19 22:33:05

学习一下

lysoft 发表于 2009-6-19 22:39:22

俺也用这个芯片.一直正常

lysoft 发表于 2009-6-19 22:41:24

TWI一点都不觉得好用,配置复杂
IO口固定
没ARM的专用硬件方便,I2C和SPI都是专用的,速度快,而且IO可配置,灵活的硬件使用

skyxjh 发表于 2010-2-19 18:19:55

mark

ymnymn 发表于 2010-2-19 19:27:54

学习一下

zhangjw 发表于 2010-5-4 21:37:25

mark。

hpdell 发表于 2010-5-10 16:43:15

学习了!!!!!!!!

wangfan0212 发表于 2010-6-18 09:24:36

顶!

qaswd 发表于 2010-8-24 11:58:22

mARK

swustlx86 发表于 2010-8-25 15:08:22

mark

aiyige 发表于 2010-9-12 22:32:21

谢谢!

zsgood6688 发表于 2011-1-15 23:42:16

学习

outt60777 发表于 2011-1-16 00:14:47

mark

albert_w 发表于 2011-1-16 00:50:47

h和c不区分的典型情况。。。多个文件中调用该驱动就不方便了

foolishMan 发表于 2011-1-18 16:15:52

jh

csq463276932 发表于 2011-1-21 08:28:09

mark ,谢谢分享

wpnx 发表于 2011-1-21 08:42:31

mark

duxingkei 发表于 2011-5-9 18:20:43

试下,谢谢共享

121william 发表于 2011-6-21 17:27:54

回复【楼主位】hhrfjz---
-----------------------------------------------------------------------
谢谢分享。

act8811 发表于 2011-7-23 14:09:04

在/INT 脚产生周期为1s 的脉冲中断信号 怎么改程序呢

moouse 发表于 2011-12-30 22:12:55

d=Read_I2C_Byte();
d=d>>1;
I2C_Stop();
return d;

其中d=d>>1;
是什么意思,请楼主指教一下

hubinghuandi 发表于 2012-3-28 00:12:42

好东西,顶一下

yanjs1016 发表于 2012-3-28 07:43:31

顶一下   

memory4597 发表于 2012-7-16 16:05:16

mark~~~~~~

wangku001wei 发表于 2012-7-17 22:17:59

卸下楼主分享!

mingzhi5288 发表于 2012-9-13 23:40:57

moouse 发表于 2011-12-30 22:12 static/image/common/back.gif
d=Read_I2C_Byte();
d=d>>1;
I2C_Stop();


左移一位

ddcchh 发表于 2012-9-28 12:36:54

学习一下

WoW 发表于 2012-11-12 20:48:13

顶个
但不知楼主 SET();子函数在哪哦,

gxy508 发表于 2012-11-29 13:01:28

mark,留用

lpandadp 发表于 2013-1-5 18:50:22

{:smile:}{:smile:}{:smile:}{:smile:}

zhangcanjie 发表于 2013-1-28 10:37:40

{:smile:}顶

jz701209李 发表于 2013-4-12 11:16:29

学习一下....

qiancuit2012 发表于 2017-3-21 14:49:50

正说要做这个来玩玩

wt19891114 发表于 2017-7-27 14:47:05

{:lol:}{:lol:}老贴,很具有参考意义!

LiLi-Long 发表于 2017-7-29 10:25:33

学习了{:smile:}
页: [1]
查看完整版本: PCF8563 的头文件做好了!有需要的来看看啊!呵呵