历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

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

2019-12-16 来源:eefocus

模拟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); //时钟开始  

}  

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

推荐阅读

史海拾趣

Aces Electronics Co Ltd公司的发展小趣事

在发展过程中,Aces也面临过各种挑战和危机。例如,原材料价格波动、市场竞争激烈、贸易壁垒等因素都曾经给公司带来不小的压力。然而,Aces凭借敏锐的市场洞察力和强大的危机管理能力,成功应对了这些挑战。公司及时调整采购策略、优化产品结构、拓展销售渠道等措施,有效缓解了外部压力,保持了稳定的发展态势。

这些故事虽然基于假设和推测,但反映了一个电子企业在发展过程中可能遇到的各种情况。无论面对技术挑战、市场竞争还是行业变革,Aces Electronics Co., Ltd.都展现了坚韧不拔、勇往直前的精神风貌。未来,公司将继续致力于技术创新和市场拓展,为电子行业的发展贡献更多力量。

Exclara Inc公司的发展小趣事

随着LED技术的不断发展和市场需求的不断变化,Exclara看到了新的市场机遇。公司凭借在LED领域的技术积累和市场经验,成功进军了智能家居、智能照明等新兴市场。在这些新兴市场中,公司凭借其独特的技术优势和创新能力,迅速获得了市场份额和客户的认可。面对新的市场挑战和机遇,Exclara将继续保持创新精神和技术实力,为电子行业的发展贡献更多的力量。

请注意,以上故事框架仅供参考,具体内容和细节需要根据实际情况进行补充和完善。

虹冠电子(Champion)公司的发展小趣事

虹冠电子自成立以来,一直将技术创新作为公司发展的核心动力。早期,虹冠电子就投入大量资源研发AC-DC模拟电源IC,成功推出了一系列高效能、低能耗的产品,迅速在市场上建立了良好的口碑。随着技术的不断迭代,虹冠电子在电源管理技术方面取得了显著优势,尤其在电竞电源供应器领域,凭借卓越的性能和稳定性,赢得了众多专业用户和消费者的认可。

Don Connex Electronics Co Ltd公司的发展小趣事

作为一家有着高度社会责任感的企业,Don Connex Electronics在发展的同时不忘回馈社会。公司积极参与扶贫、助学等公益活动,为贫困地区的教育事业和经济发展做出了积极贡献。此外,公司还关注员工的成长和发展,为员工提供丰富的培训机会和广阔的发展空间。这些举措不仅增强了企业的凝聚力,也提升了企业的社会形象。

Eon公司的发展小趣事

在成立初期,E.ON面临着天然气产量下滑而消费量增长的挑战。为了应对这一局面,E.ON开始积极寻找天然气供应渠道,并与俄罗斯天然气工业集团(Gazprom)进行了多轮谈判。虽然初期合作并未如愿,但E.ON并未放弃,通过不断努力和策略调整,最终实现了与Gazprom的合作,为公司的天然气业务发展奠定了坚实基础。

艾吉芯(Agertech)公司的发展小趣事

随着公司业务的不断扩展,艾吉芯公司积极寻求与行业内其他企业的战略合作。通过与国内外知名电子企业的合作,艾吉芯成功将其产品应用于更广泛的领域,进一步拓宽了市场渠道。这些合作不仅提升了艾吉芯的品牌影响力,还为其带来了更多的商业机会和发展空间。

问答坊 | AI 解惑

第4/15原创:独立按键

事无巨细,独立键盘 经过多天的等待,元器件终于补齐了,虽然焊接的过程中出现了非常悲剧的事情,但最终我的板子得以“残”貌示人,就傻傻的高兴一下好了。 言归正传,今天写写独立按键的原理及编程方法。 按键是什么东西,我想这个就不必由我向 ...…

查看全部问答>

FPGA 的IO脚分配问题

我知道要FPGA工作要有一个flash ,可是如何连接FPGA和flash啊,还有怎么向flash里下载我写的那个模块啊? 我选的一个FPGA说有484个引脚可是为什么又说315个可用引脚啊? 我现在面临的问题主要是,FPGA里面的程序模块我已经写完了,可是现在要把它 ...…

查看全部问答>

“通用射频测量和EMC诊断测试解决方案”

海洋仪器诚邀您参加技术交流会 活动时间:2010年6月25日(星期五) 活动地点:北京湖北大厦贵宾楼二层楚宫 主办:德国罗德与施瓦茨公司(R&S公司)       北京海洋兴业科技有限公司 随着各种电子产品研发生 ...…

查看全部问答>

关于XtMapWidget的资料

哪位大侠能提供一下关于XtMapWidget这类函数的资料啊。…

查看全部问答>

怎么理解CPU只会做加法运算而不会乘除运算?

怎么理解CPU只会做加法运算而不会乘除运算?…

查看全部问答>

大家好,wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?

wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?…

查看全部问答>

求:RAPI自定义功能函数的使用方法???

如何在wince中实现自定义功能函数,能通过Rapi被PC程序调用? 我参考的Windows CE那本书上提供的例子代码尝试进行实现,可是PC就是调用不成功; 1、wince下dll实现后,拷贝在/windows目录下; 2、PC程序通过ceRapiInvoke函数调用; 3、PC程序进行 ...…

查看全部问答>

从事java开发的转向嵌入式开发困难吗?

从事java开发的转向嵌入式开发困难吗?两者是否有一些共通点呢?…

查看全部问答>

STM32F103VE引脚使用咨询

                                 STM32F103VE的那些I/O引脚可以承受5V电平?谢谢!…

查看全部问答>