完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#ifndef _DS1302_H_
#define _DS1302_H_ #define uchar unsigned char ***it SCLK=P2^3; //ds1302时钟线定义 ***it IO=P2^4; //数据线 ***it RST=P2^5; //复位线 uchar sec,min,hour,day,mon,year,week; //uchar n_year,n_mon,n_day;//农历显示的函数 /*------------------------------------------------ DS1302编程部分 ------------------------------------------------*/ void write_1302(uchar add,uchar dat) //写操作 (写地址+写数据) { uchar i; RST=0; SCLK=0; RST=1; //把复位线拉高 for(i=0;i<8;i++) { SCLK=0;//时钟信号为低,开始写地址 IO = add & 0x01; add >>= 1; //把地址右移一位 SCLK=1; //时钟线拿高 } for(i=0;i<8;i++) { SCLK=0;//时钟信号为低,开始写数据 IO = dat & 0x01; dat >>= 1; //把地址右移一位 SCLK=1; //时钟线拿高 } SCLK=1; RST=0;//写操作结束 } uchar read_1302(uchar add) //读操作(写地址+读数据) { uchar i,value; RST=0; SCLK=0; RST=1; //把复位线拉高 for(i=0;i<8;i++) { SCLK=0;//时钟信号为低,开始写地址 IO = add & 0x01; //让IO保存add的最低位 add >>= 1; //把地址右移一位 SCLK=1; //时钟线拿高 } for(i=0;i<8;i++) { value >>= 1; //把数据右移一位 if(IO == 1) value |= 0x80; // 将数据放在value的最高位,达到保存数据的结果 SCLK=1; SCLK=0; //时钟信号为低,开始写数据 } SCLK=1; RST=0;//读操作结束 IO =0; return value; //返回读出来的数据 } uchar BCD_Decimal(uchar bcd) { uchar Decimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F)); } /*************把要的时间 年月日 都读出来***************/ void read_time() { sec = BCD_Decimal(read_1302(0x81)); min = BCD_Decimal(read_1302(0x83)); hour = BCD_Decimal(read_1302(0x85)); day = BCD_Decimal(read_1302(0x87)); mon = BCD_Decimal(read_1302(0x89)); year=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); // Conversion(0,year,mon,day); //农历转换 // n_year = year_moon ; // n_mon = month_moon ; // n_day = day_moon ; } //秒 分 时 日 月 年 星期 //uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //写地址 //uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //读地址 //uchar code tab1[]={"2020-06-19 FRI"}; //uchar code tab2[]={"10:32:48"}; /*************把要写的时间 年月日 都写入ds1302里***************/ void write_time() { uchar temp; write_1302(0x8e,0x00); //打开写保护 write_1302(0x80,sec|0x00); sec= (tab2[6]-0x30)*10+(tab2[7]-0x30); temp=(sec)/10*16+(sec)%10; write_1302(0x80,0x00|temp); min= (tab2[3]-0x30)*10+(tab2[4]-0x30); temp=(min)/10*16+(min)%10; write_1302(0x82,0x00|temp); hour= (tab2[0]-0x30)*10+(tab2[1]-0x30); temp=(hour)/10*16+(hour)%10; write_1302(0x84,0x00|temp); day= (tab1[8]-0x30)*10+(tab1[9]-0x30); temp=(day)/10*16+(day)%10; write_1302(0x86,0x00|temp); mon= (tab1[5]-0x30)*10+(tab1[6]-0x30); temp=(mon)/10*16+(mon)%10; write_1302(0x88,0x00|temp); write_1302(0x8e,0x80); //关闭写保护 } //*************把数据保存到ds1302 RAM中**0-31*************/ //void write_1302ram(uchar add,uchar dat) //{ // add <<= 1; //地址是从第二位开始的 // add &= 0xfe; //把最低位清零 是写的命令 // add |= 0xc0; //地址最高两位为 1 // write_1302(0x8e,0x00); // write_1302(add,dat); // write_1302(0x8e,0x80); //} //*************把数据从ds1302 RAM读出来**0-31*************/ //uchar read_1302ram(uchar add) //{ // add <<= 1; //地址是从第二位开始的 // add |= 0x01; //把最高位置1 是读命令 // add |= 0xc0; //地址最高两位为 1 // return(read_1302(add)); //} /*************初始化ds1302时间***************/ void init_ds1302() { RST = 0; //第一次读写数据时要把IO口拿低 SCLK=0; IO= 0; write_time(); } #endif
|
|
相关推荐
5个回答
|
|
哪边显示不正常
|
|
|
|
是值显示不正常还是格式显示不正常
|
|
1 条评论
|
|
LCD上显示本来应该是日期,它选择就年显示正常,如月日时间都显示@5
|
|
|
|
你这程序也只有1302部分啊,这也没法看是不是LCD部分的问题,先不读取1302,直接显示任意数值看显示是否正确,显示正确后再调试1302
|
|
6 条评论
|
|
就1302不一样,我的实物是开发板 。刚刚我在proteus中换了也没有用
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
494 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
1050 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1151 浏览 0 评论
887 浏览 0 评论
928 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11841 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 08:42 , Processed in 0.656470 second(s), Total 60, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号