历史上的今天

今天是:2024年11月13日(星期三)

2019年11月13日 | PCF8563 时钟芯片驱动程序 (STM8S/STM8L)

发布者:梦回归处 来源: eefocus关键字:PCF8563  时钟芯片  驱动程序  STM8S  STM8L 手机看文章 扫描二维码
随时随地手机看文章

模拟I2C读取时钟芯片PCF8563中的日期时间 


#define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号

#define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1)

#define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号

#define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2)


u8 buf[7];


void SDA_IN(u8 in) 

{

  if(in)

     GPIO_Init(GPIOD, GPIO_PIN_2,  GPIO_Mode_In_PU_IT );         //输入

  else

     GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_Mode_Out_OD_HiZ_Slow);   //输出

}


void delay_u()    

{

while(--10);

}

/**************************************************

**************************************************/

void Start()

{

SCLK_Set();     

        SDIN_Set();

        delay_u();

SDIN_Clr();

        delay_u();

SCLK_Clr();

}

/**********************************************

//IIC Stop

**********************************************/

void Stop()

{

        SCLK_Clr();

        delay_u();

SDIN_Clr();

        delay_u();        

        SCLK_Set();

        delay_u();

SDIN_Set();

        delay_u();

}




void WriteACK(u8 ack)

{

  if(ack)        SDIN_Set();

  else           SDIN_Clr();

  

    delay_u();

    SCLK_Set();

    delay_u();

    SCLK_Clr();

}




void WaitACK()

{  

   u8 errtime;

   errtime = 0;

   SDA_IN(1);

   SCLK_Set();

   delay_u();

   while(SDA_READ)

   {  errtime++;

      if(errtime==20)

      {Stop();

      break;}

   }

   SCLK_Clr();

   SDA_IN(0);

}

/**********************************************

// IIC Write byte

**********************************************/

void writebyte(u8 IIC_Byte)

{

u8 i;

u8 m,da;

da=IIC_Byte;

        SDA_IN(0);

SCLK_Clr();

for(i=0;i<8;i++) 

{

m=da;

m=m&0x80;

if(m==0x80)

{SDIN_Set();}

else SDIN_Clr();

da=da<<1;

SCLK_Set();

                delay_u();

SCLK_Clr();

}

        WaitACK();              //关键问题

}


u8 Readbyte()

{

   u8 i,bytedata;

   SDA_IN(1);

   delay_u(); 

   SDIN_Set();

   for(i=0;i<8;i++)

   {

      SCLK_Set(); 

      bytedata<<=1;

      if(SDA_READ)

      {

         bytedata++;

      }

      SCLK_Clr();

      delay_u();

   }

   SDA_IN(0);

   return(bytedata);

}

/**********************************************

// IIC Write Command

**********************************************/

void writeData(u8 address,u8 mdata)

{

Start();

writebyte(0xa2); /*写命令*/

writebyte(address); /*写地址*/

writebyte(mdata); /*写数据*/ 

Stop();

}

/********************************************

输入数据<-pcf8563

********************************************/

u8 ReadData(u8 address) /*单字节*/

{  u8 rdata =0;

   Start();

   writebyte(0xa2); /*写命令*/

   writebyte(address); /*写地址*/

   Start();   

   writebyte(0xa3); /*读命令*/

   rdata=Readbyte();

   WriteACK(1);

   Stop();

   return(rdata);

}


void ReadData1(u8 address,u8 count,u8 * buff) /*多字节*/

{  

   u8 i;

   Start();

   writebyte(0xa2); /*写命令*/

   writebyte(address); /*写地址*/

   Start();

   writebyte(0xa3); /*读命令*/

   for(i=0;i   {

        buff[i]=Readbyte();

        if(i   }

  WriteACK(1);

  Stop();

}

/********************************  

 读入时间到内部缓冲区  

*********************************/ 

void P8563_Read(void)  

{

    buf[0]=ReadData(0x02);

    buf[1]=ReadData(0x03);   

    buf[2]=ReadData(0x04);   

    buf[3]=ReadData(0x05);   

    buf[4]=ReadData(0x06);   

    buf[5]=ReadData(0x07);   

    buf[6]=ReadData(0x08);   

    Stop();  

    buf[0]=buf[0]&0x7F;//秒

    buf[1]=buf[1]&0x7F;//分

    buf[2]=buf[2]&0x3F;//时

    buf[3]=buf[3]&0x3F;//日

    buf[4]=buf[4]&0x07;//星期

    buf[5]=buf[5]&0x1F;//月  

    delay_u();

    buf[0]=HexToBcd(buf[0]);

    buf[1]=HexToBcd(buf[1]);

    buf[2]=HexToBcd(buf[2]);

    buf[3]=HexToBcd(buf[3]);

    buf[5]=HexToBcd(buf[5]);

    buf[6]=HexToBcd(buf[6]);     

}  

/*******************  

 写时间修改值  

*******************/  

void RTC_Set_Time(u8 sec,u8 min,u8 hour,u8 day,u8 week,u8 month,u8 year)  

{  

    sec=BcdToHex(sec);

    min=BcdToHex(min);

    hour=BcdToHex(hour);

    day=BcdToHex(day);

    week=week;

    month=BcdToHex(month);

    year=BcdToHex(year);

    delay_u();

    

    writeData(0x02,sec);

    writeData(0x03,min);

    writeData(0x04,hour);

    writeData(0x05,day);

    writeData(0x06,week);

    writeData(0x07,month);

    writeData(0x08,year); 

}  

/****************************  

 P8563的初始化   

********************************/  

void P8563_init(void)  

{  

  writeData(0x00,0x20); //时钟停止  

  RTC_Set_Time(30,12,12,1,5,12,17);  //秒,分,时,天,星期,月,年   

  delay_u();

  writeData(0x00,0x00); //时钟开始  

}  

/********************************************************************/

关键字:PCF8563  时钟芯片  驱动程序  STM8S  STM8L 引用地址:PCF8563 时钟芯片驱动程序 (STM8S/STM8L)

上一篇:STM8L051F3_01_GPIO应用
下一篇:STM8L 151G6U6 驱动RW1820温度传感器

推荐阅读

在亚洲国际物流展上,新松机器人自动化股份有限的轮廓导航移动机器人正式亮相,对外展示出移动机器人在柔性物流技术中的特殊作用。展会同时举行了新松移动机器人整系统获颁CE认证书仪式,标志着新松成为我国首个得到欧盟认证的机器人整系统出口企业。 激光轮廓导航技术是目前国际上移动机器人主要研发方向之一,具有快速部署,灵活高效等特点。拥有该...
进入HALT注意事项将未使用到的IO口设置为输出低;关闭所有用到的外设时钟(如 ADC、USART等);失能所使用到的外设;实测进入HALT模式待机约为0.3uA下面列出示例代码,如有错误,还请广大网友指出。 ^_^#include "stm8l15x.h"uint8_t sys_1ms_flg = 0;uint16_t SleepTime = 0;/*LED工作2S灭 进入HALT模式 外部唤醒 */void main(void){ CLK_...
2020年11月12日, 特斯拉公布《特斯拉车辆安全报告》调查方法 。此前,特斯拉自2018年10月起,就开始发布《特斯拉车辆安全报告》,目前已经连续9个季度发布,报告可给公众提供特斯拉汽车的重要安全信息。最近的一份安全报告称,在Autopilot自动辅助驾驶的参与下,特斯拉能将行车安全提升近10倍。根据特斯拉2020年第三季度车辆安全报告显示,在有Autopilo...
本周,A股三大指数集体上涨。截至本周五收盘,沪指本周上涨77.39点,涨幅为2.31%,收报3430.14点;深证成指跌大涨242.75点,涨幅为1.68%,收报14705.37点;创业板指数涨77.39点,涨幅为2.31%,收报3430.14点。Wind半导体指数本周持续上攻。截至周五收盘,本周涨287.65点,涨幅为3.82%,收报7826.91点。集微网从电子元件、材料、设备、设计、制造、IDM、封...

史海拾趣

问答坊 | AI 解惑

仪陇153单片机实现灯的渐亮控制,请帮我看下出了什么问题?

以下是我编的用em78p153单片机控制led灯渐亮程序,没有发现有什么错误的地方,软件仿真过了。可是烧录后用万用表接p5口发现表的指针在3-4v间摆个不停。实在找不出软件有什么问题了。 会不会是153的ic不适合用于这样的控制啊?头疼。 R17 EQ ...…

查看全部问答∨

ASIC Verification Engineer

ASIC Verification Engineer LSI上海研发中心高薪诚聘通讯存储领域人才,薪水待遇优厚,部分人员有出国培训机会。(部门内部推荐,成功机会更大) 有意者请将中英文简历发送至:asic_tapeout@hotmail.com ASIC Verification Engineer DESCRIPTION ...…

查看全部问答∨

有人用过EP9307-II的板子吗?

如题,刚开始学,想请教一下。…

查看全部问答∨

WinCE下取得硬件唯一标识

首先问一下,硬件唯一标识是不是就是指IMEI号。 如果硬件唯一标识是指IMEI号,那么在WinCE5.0下如何取得呢,我找了资料了,很多人说用“lineGetGeneralInfo”这个方法,但是我在WinCE5.0上试了,首先WinCE5.0的SDK中没有CellCore.lib,我下载了WM ...…

查看全部问答∨

MSP430USB仿真器制作全套资料

在网上看见的,赶紧转发过来,以前一直想自己做一个,后来一连上了好几个项目,没有时间来玩了,其实工作了的朋友可以找利尔达买,透露个小秘密他们是可以讲价的,喊价400,买一送一,实际上和淘宝上价格差不多了,但是他们有技术支持和服务的,比 ...…

查看全部问答∨

DSP的地址线和数据线有相应的寄存器吗?

DSP的地址线和数据线有相应的寄存器吗?如果没有,那么怎么写数据呢? 另外,我在一本书上见到用DSP的低8位数据线连接LCD的数据线,用DSp的8-12位做LCD的控制线,不明白该怎样控制,是何道理,各位高手帮我解决一下吧,我是初学者,这些问题困扰我 ...…

查看全部问答∨

谁有IIC通信成功的程序

谁有IIC通信成功的程序,借我看看…

查看全部问答∨

这是什么元件?

这是什么元件? [ 本帖最后由 王阿东 于 2012-5-3 20:10 编辑 ]…

查看全部问答∨

感觉 【stm32/stm8】这块越来越垃圾

不知道为什么,感觉 【stm32/stm8】这块越来越垃圾 唉。。。…

查看全部问答∨

高频头馈电

高频头的馈电是18V和13V,垂直极化的话是13V,如果用12V有什么影响吗?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved