PCF8563 时钟芯片驱动程序 (STM8S/STM8L)

发布者:Lihua1314520最新更新时间:2019-12-16 来源: 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)

上一篇:STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片
下一篇:STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片

推荐阅读最新更新时间:2024-11-21 01:10

终于搞定STM8S的活跃停机电流11uA
如果你象其它单片机一样,开启了AWU,然后来一句halt(); 那么此时的电流为200uA左右,到此差不多心灰意冷,STM8S这么差劲儿! 仔细阅读《STM8S系列MCU功耗管理》,它的电源分为MVR和LPVR,也搞不懂ST的科学家们为什么单片机在halt()时直接变为LPVR供电算了,非要手动设一下,通过设置内部时钟寄存器CLK_ICKR 的REGAH位可实现此功能 CLK_SlowActiveHaltWakeUpCmd(ENABLE); 经过这么一整,电流有改进,在69uA,和官方的PDF的68uA很接近,但仍不能满足电池供电需求,官方PDF活跃停机电流为 11uA@5V 9uA@3.3V ,再仔细读,原来必须要关闭F
[单片机]
嵌入式Linux技术在工业控制网络中的应用
     随着Internet的飞速发展,网络应用越来越广泛,对各种工业控制设备的网络功能要求也越来越高。当前的要求是希望工业控制设备能够支持TCP/IP以及其它Internet协议,从而能够通过用户熟悉的浏览器查看设备状态、设置设备参数,或者将设备采集到的数据通过网络传送到Windows或Unix/Linux服务器上的数据库中。   这就要求工控系统必须具备两方面的功能:   一是要在现场完成复杂的测控任务,因为通常一些任务都具有一定的实时性要求;   二是要求测控系统能够与某一类型的控制网相连,以实现远程监控。在目前应用的大多数测控系统中,嵌入式系统的硬件采用的是8/16位单片机;软件多采用汇编语言编程,由于这些程
[嵌入式]
STM8S单片机入门4(串口通讯及蓝牙模块的使用)
串口通讯具有悠久历史的,最基本、最简单的通讯方式,即使在当前这个注重移动和无线互联的时代,也少不了串口通讯的身影。比如对小数据量数据的无线传输,虽然物理链路用蓝牙或WIFI传输,但最后到单片机数据交互上,可能还是用了串口通讯。 STM8S系列单片机有1~3个通用异步收发器(UART)支来持串口通讯,在这个部分里,将以STM8S单片机通过蓝牙与智能手机通讯,实现一个echo功能(单片机将收到来自于手机的数据原样返回给手机),来讲解如何使用单片机的串口功能。 1、电路设计 电路采用一款蓝牙转串口的模块实现蓝牙通讯,这款蓝牙模块有四个引脚,VCC、GND、TXD、RXD,只要将模块的VCC、GND引脚与电源
[单片机]
<font color='red'>STM8S</font>单片机入门4(串口通讯及蓝牙模块的使用)
stm8s之STVD中stm8s903k.h: No such file or directory问题解决
关键问题是找不到stm8s903k.h 那么stm8s903k.h到底在哪呢? 查一下STVD安装路径C:Program Files (x86)STMicroelectronicsst_toolsetinclude 相信您能找到超多的ST系列单片机之.h文件 stm8s903k.h也在其中 把stm8s903k.h的路径加进去,OK!
[单片机]
<font color='red'>stm8s</font>之STVD中stm8s903k.h: No such file or directory问题解决
STM8S串口中断卡死调试记录
项目使用STM8S003单片机,数据发送速率比较慢时,一切正常。当速率快的时候,系统卡死,具体表现为一直运行中断服务程序,无法执行while(1)里面的内容了。 调试记录 开始怀疑是一直在响应某个中断,断点调试后发现是一直在响应UART1接收中断。调试步骤如下: 怀疑是串口中断里做了数据解析工作,导致在解析途中又收到了第二个串口接收中断,然后发生异常。解决办法是在串口接收中断中关闭串口接收中断,数据解析完成后再打开串口接收中断,防止在本次数据解析时发生下一次接收中断。具体代码表现如下: /** * @brief UART1 RX Interrupt routine * @param None * @retv
[单片机]
<font color='red'>STM8S</font>串口中断卡死调试记录
初识STM8S的电源管理
丰富的片上设备模块和可配置熔丝选项是AVR强过老一辈MCU的优势之一。不过STM8S出世以后,AVR的这一优势就有点光环顿失了。 下面是我对电源管理部分的理解,这是我看过STM8S手册和STM8S20X器件资料后的初步认识。 除了运行模式,可以采用以下三种低功耗模式:等待、主动停机、停机。 1)等待(Wait)模式:CPU停止工作,片上设备可以选择被关断,任意内部外部中断及复位均可唤醒,耗电2.4mA@24MHz,5v。 2)主动停机模式(Active Halt):保留一个定时唤醒单元AWU工作,CPU和片上设备全停止工作,AWU和外部中断及复位均可唤醒,耗电11uA - 1000uA,取决于片上稳压器(MVR还是LPV
[单片机]
MSP430应用技巧3:MSP-FET430UIF V3驱动程序的安装
原先一直使用正版windows操作系统和CCS进行MSP430的程序设计,在升级CCS以后,插上仿真器都会要求升级仿真器上的firmware,更新后一直使用正常。由于计算机硬盘损坏,装了个和谐的windows win7旗舰版操作系统(这里说明的是,Dell公司很不像话,操作系统的镜像虽然在硬盘上,但是操作系统也是用户花钱购置的,你不能硬盘坏了,操作系统就不能用了吧,为这事情我和Dell公司沟通很多次,三位支持工程师给我了三种不同的回答,第一个说给我一个正版的光盘寄过来,我等了一周没有消息了;第二个说给我个正版的链接,我自己装就好了,呵呵,仔细一看哪个连接是Microsoft的Win7 SP2的更新,真不知这位工程师怎么配在Dell
[单片机]
MSP430应用技巧3:MSP-FET430UIF V3<font color='red'>驱动程序</font>的安装
LCD显示模块并行接口驱动程序设计
  引 言   人们在日常生活中,LCD占有很大的地位。人们使用的电脑、手机、车载系统、各种测量设备、显示设备等等,都把LCD作为重要的人机接口,它把使用者需要的信息及时反应出来。目前市场上存在着各种LCD和相对应的驱动模块,驱动模块所带的驱动程序都是针对本身模块开发的,各种驱动程序之间通用性差,而且在不同的平台上很难移植。每换一种LCD产品,都要根据它的驱动模块重写驱动程序。这样产品开发资源浪费,开发周期长,成本增加。本文将介绍一种LCD图形液晶驱动器的使用方法以及程序裁剪、移植和扩展,实现在任意坐标上显示图形和汉字。这款驱动器不带字库,对需要显示的汉字和字母通过字模产生器产生数据,通过程序设计把字体在LCD通过描点描述出来(本文
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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