完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
自己用AVR驱动PCF8563程序为什么显示出错
写进去的跟读出来的不一样而且还不变化 #include #include #include #include #include #include #include "pgmspace.h" #include "iocompat.h" #include "math.h" #include "define.h" #include "pcf8563.h" unsigned char nian=13,yue=8,ri=12,xingqi=1,shi=10,fen=30,miao=25; //初始化的年月日时分秒型 /************************************************************/ /********************IIC_Start起始函数***********************/ /************************************************************/ void IIC_Start(void) { SDA_OUT; //数据总线输出 SCL_OUT; //数据总线输出 SDA_1; //数据总线拉高 SCL_1; //时钟总线拉高 delay_us(5); //延迟 SDA_0; //数据总线拉低 delay_us(5); SCL_0; //数据总线拉高 delay_us(1); } /************************************************************/ /********************IIC_Stop停止函数************************/ /************************************************************/ void IIC_Stop(void) { SDA_OUT; //数据总线输出 SCL_OUT; //数据总线输出 SCL_1; //时钟总线拉高 delay_us(5); //延迟 SDA_0; //数据总线拉高 delay_us(5); SDA_1; //数据总线拉低 } /************************************************************/ /********************IIC_Ack发送应答函数*********************/ /************************************************************/ void IIC_Ack(void) { SDA_OUT; //数据输出 SCL_OUT; //时钟输出 delay_us(1); SDA_0; //发送应答 delay_us(1); SCL_0; //SCL拉低 delay_us(5); SCL_1; //SCL拉高 delay_us(5); SCL_0; //SCL拉低 } /************************************************************/ /********************IIC_NoAck发送应答函数*********************/ /************************************************************/ void IIC_NoAck(void) { SDA_OUT; //数据输出 SCL_OUT; //时钟输出 delay_us(1); SDA_1; //不发送应答 delay_us(1); SCL_0; //SCL拉低 delay_us(5); SCL_1; //SCL拉高 delay_us(5); SCL_0; //SCL拉低 } /************************************************************/ /*******************IIC_ReadACK等待应答**********************/ /************************************************************/ unsigned char IIC_ReadACK(void) { unsigned char errtime=255; SCL_OUT; //时钟总线输出 SDA_IN; //数据总线输入 delay_us(1); SCL_0; delay_us(5); SCL_1; delay_us(5); SDA_IN; //数据总线输入 delay_us(1); while(SDA_READ) //等待应答信号 { errtime--; if(errtime<0) { IIC_Stop(); //没有应答返回0 } } SCL_0; return true; //有返回1 } /************************************************************/ /*******************Write_Bit写一位数据**********************/ /************************************************************/ void Write_Bit(unsigned char data2) { unsigned char i; SDA_OUT; //数据总线输出 SCL_OUT; //数据总线输出 for(i=8;i>0;i--) { SCL_0; //时钟拉低因为只有在SCL=0时SDA变化才有效 if(data&=0x80) { SDA_1; //写1 } else { SDA_0; //写0 } SCL_1; //时钟拉高 delay_us(1); data<<=1; //左移一位 } SDA_1; delay_us(1); SCL_1; //时钟拉低 delay_us(1); } /************************************************************/ /*******************Read_Bit读一位数据***********************/ /************************************************************/ unsigned char Read_Bit(void) { unsigned char Read_data; unsigned char i; SCL_OUT; //时钟总线输出 SDA_IN; //时钟输入 for(i=8;i>0;i++) //8位一位一位的写 { SCL_0; //给一个时钟脉冲 delay_us(5); SCL_1; delay_us(5); if(SDA_READ) //读取1写1 { data|=0x01; } data<<=1; //左移一位 delay_us(1); } SCL_0; delay_us(1); return Read_data; //返回数据 } /************************************************************/ /*****************Write_Data指定地址写数据*******************/ /************************************************************/ void Write_Data(unsigned char address,unsigned char Write_data) { IIC_Start(); //起始信号 Write_Bit(0xa2); //允许写 IIC_ReadACK(); Write_Bit(address); //写地址 IIC_ReadACK(); Write_Bit(Write_data); //写数据 IIC_ReadACK(); IIC_Stop(); //停止信号 } /************************************************************/ /*****************Read_Data读指定地址数据********************/ /************************************************************/ unsigned char Read_Data(unsigned char address) { unsigned char Data_PCF; IIC_Start(); //起始信号 Write_Bit(0xa2); //允许写 IIC_ReadACK(); Write_Bit(address); //写地址 IIC_ReadACK(); IIC_Start(); //起始信号 Write_Bit(0xa3); //允许读 IIC_ReadACK(); Data_PCF=Read_Bit(); //读数据 IIC_Stop(); //停止信号 return Data_PCF; //返回 } /************************************************************/ /*****************BCD_16BCD转16进制**************************/ /************************************************************/ unsigned char BCD_16(unsigned char BCD_Data) { unsigned char temp_16; temp_16=((BCD_Data>>4)*10)+(BCD_Data&0x0f); return temp_16; } /************************************************************/ /*****************Six_BCD*16进制转BCD************************/ /************************************************************/ unsigned char Six_BCD(unsigned char Six_BCD) { unsigned char temp; unsigned char data_bcd; temp=Six_BCD%100; data_bcd=((temp/10)<<4)|(temp%10); return data_bcd; } /************************************************************/ /******************PCF_Start*启动时钟************************/ /************************************************************/ void PCF_Start(void) { Write_Data(0X00,0X00); //启动时钟 } /************************************************************/ /******************PCF_Stop*停止时钟*************************/ /************************************************************/ void PCF_Stop(void) { Write_Data(0X00,0X20); //停止时钟 } /************************************************************/ /******************Init_PCF*初始化时间***********************/ /************************************************************/ void Init_PCF(void) { Write_Data(0x02,Six_BCD(miao)); //初始化秒 Write_Data(0x03,Six_BCD(fen)); //初始化分 Write_Data(0x04,Six_BCD(shi)); //初始化时 Write_Data(0x05,Six_BCD(ri)); //初始化日 Write_Data(0x06,xingqi); //初始化星期 Write_Data(0x07,Six_BCD(yue)); //初始化月 Write_Data(0x08,Six_BCD(nian)); //初始化年 } void Read_PCF(void) //读取时钟的变化 { year=BCD_16(Read_Data(0x08)); //读取年 month=BCD_16(Read_Data(0x07)&0X1F); //读取月 week=Read_Data((0x06)&0X07); //读取星期 day=BCD_16(Read_Data(0x05)&0X3f); //读取天 time=BCD_16(Read_Data(0x04)&0X3f); //读取时 minute=BCD_16(Read_Data(0x03)&0X7f); //读取分 second=BCD_16(Read_Data((0x02)&0X7f)); //读取秒 } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
54 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
395 浏览 0 评论
439 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1265 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
529 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11749 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 03:18 , Processed in 0.454393 second(s), Total 39, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号