历史上的今天
今天是: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); //时钟开始 } /********************************************************************/
史海拾趣
|
事无巨细,独立键盘 经过多天的等待,元器件终于补齐了,虽然焊接的过程中出现了非常悲剧的事情,但最终我的板子得以“残”貌示人,就傻傻的高兴一下好了。 言归正传,今天写写独立按键的原理及编程方法。 按键是什么东西,我想这个就不必由我向 ...… 查看全部问答> |
|
我知道要FPGA工作要有一个flash ,可是如何连接FPGA和flash啊,还有怎么向flash里下载我写的那个模块啊? 我选的一个FPGA说有484个引脚可是为什么又说315个可用引脚啊? 我现在面临的问题主要是,FPGA里面的程序模块我已经写完了,可是现在要把它 ...… 查看全部问答> |
|
海洋仪器诚邀您参加技术交流会 活动时间:2010年6月25日(星期五) 活动地点:北京湖北大厦贵宾楼二层楚宫 主办:德国罗德与施瓦茨公司(R&S公司) 北京海洋兴业科技有限公司 随着各种电子产品研发生 ...… 查看全部问答> |
|
大家好,wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢? wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?… 查看全部问答> |
|
如何在wince中实现自定义功能函数,能通过Rapi被PC程序调用? 我参考的Windows CE那本书上提供的例子代码尝试进行实现,可是PC就是调用不成功; 1、wince下dll实现后,拷贝在/windows目录下; 2、PC程序通过ceRapiInvoke函数调用; 3、PC程序进行 ...… 查看全部问答> |




