搜索
bottom↓
回复: 26

我写的PCF8563程序不知道哪里出错了,请高手帮帮忙看一下错在哪里谢拉

[复制链接]

出0入0汤圆

发表于 2008-8-11 22:58:15 | 显示全部楼层 |阅读模式
/******************************************************
时钟模块
时钟由FPC8563产生,程序如下:
作者:sjx  2008-7-27    QQ:307870154
*********************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl1=P2^0;//定义数码管时钟线
sbit sda1=P2^1;//定义数码管数据线
sbit scl3=P2^4;//定义数码管时钟线
sbit sda3=P2^5;//定义数码管数据线
sbit scl4=P2^6;//定义数码管时钟线
sbit sda4=P2^7;//定义数码管数据线
sbit scl=P0^6;//定义8563 I2C的时钟线       
sbit sda=P0^7; //定义8563 I2C的数据线
uchar a,miao,shi,fen,number, b;
uint  day,week,month,year;
uchar code  tab[]={0x11,0x7d,0x23,0x29,0x4d,                         // 0 1 2 3 4 //
                0x89,0x81,0x3d,0x01,0x09,          // 5 6 7 8 9 //
                0x05,0xc1,0x93,0x61,0x83,0x87        }; // A B C D E F
void delay()
{ ;; }
//=========8563起始信号子程序===============
void start()  
{       
   
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
//==========8563终止信号子程序================
void stop()
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}
//===========8563应答信号子程序====================
void respons()
{
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<250))i++;  //若无应答,重新开始发送地址
        scl=0;
        delay();
}
//===========8563总线初始化子程序=======================
void init()
{
        sda=1;
        delay();
        scl=1;
        delay();
}
//===========写入1字节子程序======================

void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;          //写入数据date


        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
            delay();
                sda=CY;         //往数据线送date最高位,循环8次送完date
                delay();
                scl=1;
                delay();
                scl=0;
        delay();
        }
        sda=1;         //释放数据总线,以便读取应答信号
        delay();
}
//===========读取1字节子程序============================
uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++) //读回时是一位一位的所以要读8次
        {
                scl=1;          // scl置1数据才稳定才可以读取数据
                delay();       
                k=(k<<1)|sda;         //sda送过来的数据送到k的最底位,循环8次从最高位读完sda上的数据
                scl=0;
                delay();       
        }
        return k;        //程序执行完返回k的值
}
//============延时子程序=====================================
void delay1(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
         for(b=100;b>0;b--);
}
//===========写一8位数据子程序===================================
void write_add(uchar address,uchar date)  
{                                         
        start();  //调用起始信号子程序,开始写入信号            
        write_byte(0xa2); //找芯片所在地址
        respons();                  //调用应答信号
        write_byte(address);//找芯片内部存储器地址
        respons();
        write_byte(date);//        写入数据,写进芯片内部存储器
        respons();
        stop();                         //调用终止信号子程序,终止信号写入
}
//===========读一8位数据子程序 ================================
uchar read_add(uchar address)
{
        uchar date;
        start();         //调用起始信号子程序
        write_byte(0xa2);  //取芯片地址
        respons();
        write_byte(address);//取芯片内部存储器地址
        respons();
        start();          //调用起始信号子程序,开始读取信号
        write_byte(0xa3);//芯片读地址
        respons();
        date=read_byte();//把读取字节子程序的返回值给date
        stop();
        return date;   // 程序执行完返回date的值
}
//===============写时间子程序=============
void write_8563(uchar w_miao,uchar w_fen,uchar w_shi,uchar w_day,uchar w_week,uchar w_month,uchar w_year)
{   init();
    start();
        write_add(0x00,0x00);
   write_add(0x01,0x00);
   write_add(0x02, w_miao);
   delay1(100);
   write_add(0x03,w_fen);
   delay1(100);
   write_add(0x4,w_shi);
   delay1(100);
   write_add(0x05,w_day);
   delay1(100);
   write_add(0x06,w_week);
   delay1(100);
   write_add(0x7,w_month);
   delay1(100);
   write_add(0x8,w_year);
   delay1(100);
   
}

//===============读时间子程序============
   void read_8563()
   {   
       miao=read_add(0x02)&0x7f;//获取秒数据       
       miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);//BCD码转换成10进制数
           if(miao>=60){miao=0;}
          

           fen=read_add(0x03)&0x7f;//获取分钟
           fen=((fen&0xf0)>>4&0x0f)*10+(fen&0x0f);//BCD码转换成10进制数
           if(fen>=60){fen=0;}
      

           shi=read_add(0x04)&0x3f;//获取小时
           shi=((shi&0xf0)>>4&0x0f)*10+(shi&0x0f);//BCD码转换成10进制数
           if(shi>=24){shi=0;}
          

           day=read_add(0x05)&0x3f;//获取日数据       
        day=(( day&0xf0)>>4&0x0f)*10+( day&0x0f);//BCD码转换成10进制数
           if( day>=31){ day=0;}
          

           week=read_add(0x06)&0x07;//获取星期
           if(week>6){week=0;}
      
           month=read_add(0x07)&0x1f;//获取月
           month=((month&0xf0)>>4&0x0f)*10+(month&0x0f);//BCD码转换成10进制数
           if(month>=24){month=0;}
          
           year=read_add(0x08)&0xff;//获取年
           shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BCD码转换成10进制数
           delay1(100);
   }
/********************************************************
********************************************************/
//============数码管移位子程序===================
void  shift1()
{
   uchar i,t;
   number=tab;
   scl1=0;
   for(i=0;i<8;i++)
    {
      t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000
      sda1=t;                 //        往数据线送最高位
      scl1=1;                 //上跳
      number=number<<1;         //左移一位
      scl1=0;                         //下跳
     }
}

void  shift3()
{
   uchar i,t;
   number=tab;
   scl3=0;
   for(i=0;i<8;i++)
    {
      t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000
      sda3=t;                 //        往数据线送最高位
      scl3=1;                 //上跳
      number=number<<1;         //左移一位
      scl3=0;                         //下跳
     }
}

void  shift4()
{
   uchar i,t;
   number=tab;
   scl4=0;
   for(i=0;i<8;i++)
    {
      t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000
      sda4=t;                 //        往数据线送最高位
      scl4=1;                 //上跳
      number=number<<1;         //左移一位
      scl4=0;                         //下跳
     }
}
//============数码管显示程序========================
void  dispaly()
{       
      b=miao%10;//秒个位
          shift3();
          b=miao/10;//秒十位
          shift3();
          b=fen%10;
          shift4();
          b=fen/10;
          shift4();
          b=shi%10;
          shift4();
          b=shi/10;
          shift4();

          b=week%10;//秒个位
          shift1();
         
          b=day%10;
          shift1();
          b=day/10;
          shift1();
          b=month%10;
          shift1();
          b=month/10;
          shift1();
          b=year%10; //年个位
          shift1();
          b=(year%100)/10;//年十位
          shift1();
          b=(year%1000)/100;//年百位
          shift1();
          b=year/1000;
          shift1();
          delay1(500);

}
//===========主程序=======================================================
void main()
{
        init();
        delay1(500);                  
        write_8563(0x50,0x59,0x23,0x11,0x01,0x09,0x2008);//初始化秒 分 时,日,星期,月,年
        delay1(500);      //调用延时函数
    while(1)
    {       
    read_8563();  //读取秒 时 分
        dispaly();         //显示秒 分 时
        }
   
}
此程序显示读取年和小时那里出错了。单独读取时 分 秒是没有错 但是同时读取年月日星期时分秒时,读不出小时。而且年的千位也是一直读不出请高手帮忙改正谢拉

出0入0汤圆

发表于 2008-8-13 10:14:15 | 显示全部楼层
你单独能读出时,分,秒说明你在8563的时序读写上是没有错的.能显示出来,说明显示部分是没有问题的.
至于你说年的千位你读不出来那是正常的.因为你认真看一下PCF8563的PDF,年的专用寄存器08H的描述,此位寄存器存放的是BCD形式的年的值,范围是0~99啊.所以你再读也是读不出年的百位千位啊..
现实中制作东西的时候年的百位和千位都是大家默认给出来的啊.也就是说大家根本没有去读它的值,20**年.那两位直接写20不就可以了吗.因为它两们的变动要经历100年呢,到时你的产品可能早就跟不上时代了.
当然如果你要读年也可以,你再仔细看一下8563的PDF,年的百位千位的读取可以通过07H 月/世纪寄存器来读值计算.也就是最高位第7位,有个标志C,你可以读取它来判断百位和千位的值的.当年寄存器由99变化为00时,C就有变化了.这样你软件上稍作处理就可以了.
至于你说同时读取年月日星期时分秒时时小时读不出来,你仔细看一下你的程序:
shi=read_add(0x04)&0x3f;//获取小时
shi=((shi&0xf0)>>4&0x0f)*10+(shi&0x0f);//BCD码转换成10进制数
if(shi>=24){shi=0;}


year=read_add(0x08)&0xff;//获取年
shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BCD码转换成10进制数
delay1(100);  
"shi"这个变量你在读取小时的时候已经用到了,为什么读取年的时候还要用它呢,按程序执行的顺序那你不是把以前读取的小时值给覆盖了吗.所以你应该重新定义一个变量来存放年的10进制值 啊.所以你一起读的时候不会出来小时也就正常了.

出0入0汤圆

 楼主| 发表于 2008-8-13 18:58:02 | 显示全部楼层
啊 "staryanzi 琰琰"
太感谢你拉 "shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BCD码转换成10进制数"中的"shi"应该是"year"
是我写错了 查的时候太粗心没有看出 哈哈
还有我不知道怎么设置他的闹钟功能程序,不知你是否还能帮忙教下我不胜感激啊

出0入0汤圆

发表于 2008-8-14 13:58:25 | 显示全部楼层
不用谢的.
你可能是因为笔误写成了shi.查错误的时候没有想到罢了,这种问题我也遇到过的.出来了就好.
至于闹钟问题,我给你发一个PCF8563的PDF吧.讲的很清楚.
你通过其中的控制/状态寄存器2 和报警寄存器 里边所讲的就能合理的置入闹钟程序了.你所设定的时间值写在报警寄存器里就可以了.
给好各控制位的值后,合理的利用3号管脚/INT在报警发生时输出的信号,或者AF位判断是否到了你所设定的时间.

出0入0汤圆

发表于 2008-8-14 13:59:47 | 显示全部楼层
pcf8563中文datasheetourdev_378613.pdf(文件大小:232K) (原文件名:PCF8563yingrong.pdf)

出0入0汤圆

发表于 2008-8-14 14:02:40 | 显示全部楼层
请问,PCF856秒寄存器是不是只读的?

出0入0汤圆

发表于 2008-8-14 15:25:42 | 显示全部楼层
一直没有给秒寄存器写过东西过.不过我想它应该是不可写的.因为它不属于控制寄存器啊.

但是有一点让人也可以理解为它是可写的,因为有个VL位啊.VL=0,保证准确的时钟.VL=1不保证准确的时钟.所谓时钟芯片我想大家都是用它的时间功能吧.所以默认值应该是零.而现实中也不应该去管它的吧.

出0入0汤圆

 楼主| 发表于 2008-8-16 15:56:35 | 显示全部楼层
加入按键设置时间,是不是把设置控制状态寄存器的位STOP=1,让时钟停止运行,如果时钟停止运行了还可以读和写时间吗

出0入0汤圆

发表于 2008-8-16 16:27:55 | 显示全部楼层
谢谢6楼的回答,确实没必要去写,呵呵.

出0入0汤圆

 楼主| 发表于 2008-8-16 20:44:33 | 显示全部楼层
pcf8563加入按键设置时间程序,是不是把设置控制状态寄存器的位STOP=1,让时钟停止运行,如果时钟停止运行了还可以读和写时间吗 ???????????

出0入0汤圆

 楼主| 发表于 2008-8-16 23:24:55 | 显示全部楼层
我写的pcf8563加入按键设置时间秒加一程序如下,miao为秒,key2为按键为什么不能实现按键秒加一 ,哪位能指点下啊 谢啦           
              if(key2==0)
                {  delay1(10)
                   if(key2==0)
                 {  while(!key);//等待松键
                      write_add(0x00, 0x20);//芯片时钟停止运行
                    miao=read_add(0x02)&0x7f;//读取秒数据         
                      miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);//BCD码转换成10进制数
                      miao=miao++;      //秒加一
                      if(miao>=60){miao=0;}
                    write_add(0x02,miao);//写秒数据
                    miao=read_add(0x02)&0x7f;//读取秒数据         
                      miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);//BCD码转换成10进制数
                  
                 }
                }
                write_add(0x00, 0x00);//芯片时钟运行
                display0();         //调用显示程序

出0入0汤圆

 楼主| 发表于 2008-8-18 01:00:26 | 显示全部楼层
???????????????怎么没人理我啊

出0入0汤圆

发表于 2008-8-18 01:03:54 | 显示全部楼层
我用试过只要一写秒寄存器就当机,其它都正常.

出0入0汤圆

发表于 2008-8-18 10:10:20 | 显示全部楼层
to sukexi
  write_8563(0x50,0x59,0x23,0x11,0x01,0x09,0x2008);//初始化秒 分 时,日,星期,月,年通过它你可以将这一串的时间初始值数据写入到PCF8563里边,启动计时.同理你可心把这一串数据放到一个数组里边啊.然后通过按键改变它们的值就可以了.不一定得加一次读一次的.只需要将数组里的值写进去就可以了.如果想在用按键改变值的时候看到相应值变化显示加入显示程序就行了,最近一次写进去,启动就可以了.

出0入0汤圆

 楼主| 发表于 2008-8-18 20:34:16 | 显示全部楼层
staryanzi 琰琰:

先谢谢你的指点。“不一定得加一次读一次的”如果不加一次读一次的这么知道时间加到哪了呢?我按键设置的不是初始值,而是像电子表那样按键调整某一时间,如调整分或者秒。还有按键调整时间时是不是把设置控制状态寄存器的位STOP=1,让时钟停止运行,如果时钟停止运行了还可以读和写时间吗?

出0入0汤圆

发表于 2008-8-19 09:14:17 | 显示全部楼层
to zcdyyu:
   不好意思啊,前些时间理解有误,秒寄存器不是只读的吧。因为我们在写入初始时间值时就行给秒寄存器写入你所期望的初始时间值啊。所以秒寄存器我理解为可写的。PCF8563有一个写入数据地址,同时也有个读出数据地址。所以我认为例如初始时间值中的秒值就应该是写入到了秒寄存器中的。在启动时钟芯片后,再按照芯片的正常工作自动从你的初始值开始计时而已吧。

出0入0汤圆

发表于 2008-8-19 09:50:15 | 显示全部楼层
sukexi:
  设置时间就是让时间达到你要设定的标准值,我所说的是在你准备给时钟芯片设置时间前,你定义数组,然后对数组中的相对应的秒,分,时,日,星期,月,年作相应的更改,当你对数组你的值更改完毕之后,你再一次将时间写入时钟芯片。你的做法是同样在它停止工作同时,对修改对象加一次,读一次时间再显示,是为了知道在你的按键作用下时间究竟到了什么值了。你是有显示界面的,将你更改的数组里的对象值所对应的当前值显示出来啊。
  如果要按电子表的时间设置方式来做,那么就是做时间的微调,也就是说你从时间芯片里读出来的时间值和标准时间值相差不是很大吧,那样我想就应该是在你时间修改按键按下以后,读最后一次时间值,然后停止时钟作修改吧。这样只需要稍微作调整就能达到标准时间值了,然后重新启动就可以了。也就是说这个时候时钟芯片应该是停止工作的。其实观察电子表也一样,比如你调整分钟吧,你调整完毕之后按下确定,到下一次分改变之前还是经过了60秒的,所以这个时候它的秒也该是停止工作的。
    如果要单独的调整一位的时间,别的位正常走时,那你只能在芯片STOP=0的状态下进修改了,应该能达到的。按键的处理还是有要求的,要不小心你的时间跑不准了。
  能不能在STOP=1的时间写进去时间值你可以试一下,很方便的。将你给00寄存器写的初始值放到写时间之后就知道了。

出0入0汤圆

 楼主| 发表于 2008-8-20 12:49:26 | 显示全部楼层
哈哈,解决了.原来还是我上面写的程序的思路.只是要注意写入时间和读出时间,进制间的转换.

出0入0汤圆

发表于 2010-1-31 21:28:35 | 显示全部楼层
请问楼主PCF8563写入和读出是什么进制呀?  我现在正在用这个片子可时间和日期一直显示0呀 不知什么原因愁死了
谢谢楼主

出0入0汤圆

发表于 2010-1-31 23:10:34 | 显示全部楼层
????

出0入0汤圆

发表于 2010-6-17 10:51:05 | 显示全部楼层
谢谢楼主跟1楼的兄台!    我正要用!!!!!LZ这程序有点像郭天祥老师的范例!

出0入0汤圆

发表于 2010-7-1 11:40:32 | 显示全部楼层
if(key2==0)
                {  delay1(10)
                   if(key2==0)
{  while(!key);//等待松键
                      write_add(0x00, 0x20);//芯片时钟停止运行
    miao=read_add(0x02)&0x7f;//读取秒数据         
                      miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);//BCD码转换成10进制数  
                      miao=miao++;      //秒加一
                      if(miao>=60){miao=0;}



  ^^^^^^^^  write_add(0x02,miao);//写秒数据 ^^^^^^^^^^^^^可以这可样调整时间么?miao在这时好像是一个10进制数啊?
    miao=read_add(0x02)&0x7f;//读取秒数据         
                      miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);//BCD码转换成10进制数  



可以这可样调整时间么?miao在这时好像是一个10进制数啊?

出0入0汤圆

发表于 2010-7-1 11:42:19 | 显示全部楼层
LZ给我解说一下好么谢谢!我看不懂!

出0入0汤圆

发表于 2014-10-10 14:22:01 | 显示全部楼层
大家好啊,我用LPC1114写PCF8563,不知为何一直读不出时间来,代码呈上

********************************************************/
/*内部函数,PCF8563 开始*/
void Start(void)
{
   SDA_ON;                //SET
   delay_us(2);
   SCL_ON;
   delay_us(2);
   SDA_OFF;
   delay_us(2);
   SCL_OFF;
   return;
}

/*内部函数,PCF8563 结束*/
void Stop(void)
{
   SDA_OFF;
   SCL_OFF;
   delay_us(2);
   SCL_ON;
   delay_us(2);
   SDA_ON;
   delay_us(2);
   return;
}

/*内部函数,输出ACK=0*/
void WriteACK(void)
{
    SDA_OFF;
    delay_us(2);
    SCL_ON;
    delay_us(2);
    SCL_OFF;
        return;
}

/*内部函数,输出ACK=1*/
void writenoack(void)
{
    SDA_ON;
    delay_us(2);
    SCL_ON;
    delay_us(2);
    SCL_OFF;
        return;
}


//        GPIO0->DIR |=(1<<9);    //P0.9 (P09 28)   DS_DA  OUTPUT         PCF8563  SCLK
//        GPIO0->DIR |=(1<<10);   //P0.10(P010 29)  DS_RST OUTPUT         PCF8563  SDA

/*内部函数,等待ACK*/
void WaitACK(void)
{   unsigned char errtime=20;
    SDA_ON;
    delay_us(2);          /*读ACK*/
    SCL_ON;
    delay_us(2);
        GPIO0->DIR&=~(1<<10);
        delay_us(2);
    while((GPIO0->DATA&(1<<10))==(1<<10))
    {  
           if(errtime>0)  {errtime--;}
           else{LED_SHOW=0X55;}
           //delay_us(2);
       //if(!errtime) Stop();
    }
         
    SCL_OFF;
        GPIO0->DIR |=(1<<10);
    delay_us(2);
        return;
}

//        GPIO0->DIR |=(1<<9);    //P0.9 (P09 28)   DS_DA  OUTPUT         PCF8563  SCLK
//        GPIO0->DIR |=(1<<10);   //P0.10(P010 29)  DS_RST OUTPUT         PCF8563  SDA       

/**内部函数.输出数据字节  入口:B=数据*/
void writebyte(unsigned char wdata)
{
    unsigned char i;
        SCL_OFF;
    for(i=8;i>0;i--)
    {
        if(wdata&0x80!=0) {SDA_ON;}
        else {SDA_OFF;}
        wdata<<=1;
        SCL_ON;
        delay_us(2);
        SCL_OFF;
    }
                       
    WaitACK();
        return;
}

//        GPIO0->DIR |=(1<<9);    //P0.9 (P09 28)   DS_DA  OUTPUT         PCF8563  SCLK
//        GPIO0->DIR |=(1<<10);   //P0.10(P010 29)  DS_RST OUTPUT         PCF8563  SDA

/*内部函数.输入数据  出口:B*/
unsigned char Readbyte(void)
{
    unsigned char i,bytedata;
    //SDA_ON;
        GPIO0->DIR&=~(1<<10);
        delay_us(2);
    for(i=0;i<8;i++)
    {
       SCL_ON;
       bytedata<<=1;
           if((GPIO0->DATA&(1<<10))==(1<<10))         {bytedata|=0X01;}

       SCL_OFF;
       delay_us(2);
    }
        GPIO0->DIR |=(1<<10);
        delay_us(2);
    return(bytedata);
}

/**输出数据->pcf8563*/
void writeData(unsigned char address,unsigned char mdata)
{
    Start();
    writebyte(0xa2);          /*写命令*/
    writebyte(address);          /*写地址*/
    writebyte(mdata);          /*写数据*/
    Stop();
        return;
}

/*输入数据<-pcf8563*/
unsigned char ReadData(unsigned char address)         /*单字节*/
{   
    unsigned char rdata;
    Start();
    writebyte(0xa2);             /*写命令*/
    writebyte(address);          /*写地址*/
    Start();
    writebyte(0xa3);             /*读命令*/
    rdata=Readbyte();
    writenoack();
    Stop();
    return(rdata);
}         

/*
void ReadData1(unsigned char address,unsigned char count,unsigned char *buff)   //多字节
{   
    unsigned char i;
    Start();
    writebyte(0xa2);             //写命令
    writebyte(address);          //写地址
    Start();
    writebyte(0xa3);             //读命令
    for(i=0;i<count;i++)
    {
        time_get[i]=Readbyte();
        if(i<count-1) WriteACK();
    }
    writenoack();
    Stop();
        return;
}
*/
void ReadData1(unsigned char address)   //多字节
{   
    unsigned char i;
    Start();

    writebyte(0xa2);         //写命令
       
    writebyte(0X02);         //写地址
        LED_SHOW=0X01;
    Start();
    writebyte(0xa3);             //读命令
         
    for(i=0;i<6;i++)
    {
        time[i]=Readbyte();
                WriteACK();
    }
        time[6]=Readbyte();
    writenoack();
    Stop();
        return;
}

/*内部函数,读入时间到内部缓冲区*/
void P8563_Read(void)
{  
   
    ReadData1(0x02);  //02-08       

        time_buf[0]=time[6]>>4&0x0F;          //08H 年
        time_buf[1]=time[6]&0x0F;
        //if(time_buf[0]==0)   {time_buf[0]=20;}        

        time_buf[2]=time[5]>>4&0x01;         //07H 月
        time_buf[3]=time[5]&0x0F;  
        //if(time_buf[2]==0)   {time_buf[2]=20;}
       
        time_buf[4]=time[4]&0x07;            //06H 星期

        time_buf[5]=time[3]>>4&0x03;         //05H 日
        time_buf[6]=time[3]&0x0F;
        //if(time_buf[5]==0)   {time_buf[5]=20;}

        time_buf[7]=time[2]>>4&0x03;         //04H 时
        time_buf[8]=time[2]&0x0F;
        //if(time_buf[7]==0)   {time_buf[7]=20;}

        time_buf[9]=time[1]>>4&0x03;         //03H 分
        time_buf[10]=time[1]&0x0F;
        //if(time_buf[9]==0)   {time_buf[9]=20;}   
       
        time_buf[11]=time[0]>>4&0x07;        //02H 秒
        time_buf[12]=time[0]&0x0F;
        //if(time_buf[11]==0)   {time_buf[11]=20;}  

/*
    time_buf[0]=time[0]&0x7f;        //秒
    time_buf[1]=time[1]&0x7f;        //分
    time_buf[2]=time[2]&0x3f;        //小时
    time_buf[3]=time[4]&0x07;        //星期
*/
        return;
}       

/**写时间修改值*/
void P8563_settime(void)
{
   unsigned char i;
   time_buf[0]=1;time_buf[1]=5;                 //08H 年          //2015 1 1-11:59:00 星期四
   time_buf[2]=0;time_buf[3]=1;                 //07H 月
   time_buf[4]=4;                                 //06H 星期四
   time_buf[5]=0;time_buf[6]=1;                 //05H 日
   time_buf[7]=1;time_buf[8]=1;                 //04H 时
   time_buf[9]=5;time_buf[10]=9;         //03H 分
   time_buf[11]=0;time_buf[12]=0;         //02H 秒

   i=time_buf[11]*10+time_buf[12];  writeData(2,i);         //02H 秒
   i=time_buf[9]*10+time_buf[10];   writeData(3,i);         //03H 分
   i=time_buf[7]*10+time_buf[8];    writeData(4,i);         //04H 时
   i=time_buf[5]*10+time_buf[6];    writeData(5,i);         //05H 日
   i=time_buf[4];                   writeData(6,i);         //06H 星期四
   i=time_buf[2]*10+time_buf[3];    writeData(7,i);         //07H 月
   i=time_buf[0]*10+time_buf[1];    writeData(8,i);         //08H 年

   return;
}

//volatile unsigned char time_buf[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
                                   /*  0十年 年  2     月  4星期  5    日   7   小时  9  分钟 11    秒*/       
//writeData(ADDRESS,DATA);
//Time and date registers
//02H:         VL_seconds (0-59)
//03H:         Minutes    (0-59)
//04H:         Hours      (0-23)
//05H:         Days       (1-31)
//06H:         Weekdays   (0-6)
//07H:         Century_months   (1-12)
//08H:         Years      (0-99)

/**P8563的初始化-----外部调用*/

void P8563_init(void)
{
  //unsigned char i;
  if((ReadData(0x0a)&0x3f)!=0x8)                          //检查是否第一次启动,是则初始化时间
    {
      P8563_settime();
    }
  //else
  //  {
       
  //  }

  return;
}

出0入0汤圆

发表于 2016-7-10 20:25:57 | 显示全部楼层
非常感谢 刚好用上
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 20:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表