历史上的今天
今天是:2024年11月13日(星期三)
2019年11月13日 | PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
2019-11-13 来源: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); //时钟开始 } /********************************************************************/
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 现在,家庭有多台电视是常见的,如果家庭成员在房间、客厅都想收看数字收费电视,该怎么办呢?有了综合布线之后,你就不会有这方面的困扰了,而且也可以轻易实现卫星电视和数字电视的交换 ...… 查看全部问答> |
|
既然STM32如此名声鹊起--不得不看看STM32 Primer 既然STM32如此名声鹊起--不得不看看STM32 Primer 编号: 1475040 类型:菜鸟提问 作者:geyin 时间:2009-4-11 10:45:26 访问次数:0 发贴IP:221.232.138.131 投票加精0 & ...… 查看全部问答> |
|
我们公司100多人,要把目前使用的传统电话系统换成ip的。调研了很多,思科和Avaya东西是不错,可是老板批的钱有限,受用不起,国内一些小厂商的东西又担心稳定性太低。近期朋友推荐一款据说整体性价比还可以的美国捷思锐的中小企业语音通信系统,已 ...… 查看全部问答> |
|
印制电路设计中的工艺缺陷 一、焊盘的重叠 1、焊盘(除表面贴焊盘外)的重叠,意味孔的重叠,在钻孔工序会因为在一处多次钻孔导致断钻头,导致孔的损伤。 2、多层板中两个孔重叠,如一个孔位为隔离盘,另一孔位为连接盘(花焊盘),这样 ...… 查看全部问答> |
|
这款来自台湾的Misumi MO-R803摄像头号称全球最小的摄像头。镜头直径为4.4毫米,长为15毫米。后面连有一段可弯曲的蛇形把手,方便你拿取。 不过由于体积的限制,这款摄像头的分辨率只能达到320×240.目前还没有进一步的价格信息。… 查看全部问答> |
|
//************************************************************************* // 串口通信 //环境:C805 ...… 查看全部问答> |
|
在 8962 can_device_qs 例程中为什么要使能 JTAG 的上拉电阻 在 8962 can_device_qs 例程中为什么要使能 JTAG 的上拉电阻 // // Enable the pull-ups on the JTAG signals. // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);  ...… 查看全部问答> |




