完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我的ds1302能显示时间了,而且正常走时间就是在59秒进分的时候,秒位会变成“??”,然后过一会变回数字!同时我的年设置成了11年!11那个数字一直在数字和“??”之间变化!
#include #define uint unsigned int #define uchar unsigned char #define LCD1602_IO P0 ***it ce=P3^4;//是由T0非控制当为1的时候没被选中,当为0的时候选中。 ***it sclk=P3^3; ***it dio=P3^2; ***it E=P3^5;//1602的EA ***it RS=P3^7;//1602 void delay_ms(uint a);//毫秒级别延时; void wr_com(uchar dat);//1602写指令函数; void wr_dat(uchar dat);//1602写数据函数; void init_1602(void);//1602初始化函数; //void init();//时钟初始化 //void _10zhuan16();//将10进制时间转化成16进制的8421BCD; //void write_byte(uchar a);//DS1302写1个字节函数; //uchar read_byte();//DS1302读一个字节函数; //void write_date(uchar address,uchar date);//正对某个字节写; //uchar read_date(uchar address);//针对某个字节读; //void read_time();//连续读取时间 uchar init_time[6]={0};//初始化时间 uchar write_address[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写地址数组 uchar read_address[6]={0x8d,0x89,0x87,0x85,0x83,0x81};//读地址数组 void delay(uint z) { uint x,y; for(y=z;y>0;y--) for(x=110;x>0;x--); } void write(uchar add,uchar date) { uchar temp,t; ce=1; sclk=0; ce=0; temp=add; for(t=0;t<8;t++)//地址控制 { if((temp&0x01)==1) { dio=1; } else dio=0; sclk=1; delay(1); sclk=0; temp=temp>>1; } temp=date; for(t=8;t>0;t--) //写数据 { if((temp&0x01)==1) { dio=1; } else dio=0; sclk=1; delay(1); sclk=0; temp=temp>>1; } ce=1; } uchar read(uchar add) { uchar temp,t; ce=1; sclk=0; ce=0; temp=add; for(t=0;t<8;t++) { if((temp&0x01)==1) dio=1; else dio=0; sclk=1; sclk=0; temp>>=1; } temp=0; for(t=0;t<8;t++) { if(dio==1) temp|=(0x01< sclk=0; } ce=1; return temp; } void read_time()//连续读出年周月日 { uchar i; for(i=0;i<6;i++) { init_time[i]=read(read_address[i]); delay_ms(10); } } void chu() { write(0x8e,0x00);//写保护 write(0x80,0x00); //写秒 write(0x82,0x43);//写分 write(0x84,0x15); //写时 write(0x86,0x17); write(0x88,0x7); write(0x8c,0x11); write(0x8e,0x80); } void main() { init_1602(); chu(); //init(); while(1) { read_time(); wr_dat('2'); wr_dat('0'); wr_dat(init_time[0]/16+0x30); wr_dat(init_time[0]%16+0x30); wr_dat('y'); wr_dat(init_time[1]/16+0x30); wr_dat(init_time[1]%16+0x30); wr_dat('m'); wr_dat(init_time[2]/16+0x30); wr_dat(init_time[2]%16+0x30); wr_dat('d'); wr_dat(init_time[3]/16+0x30); wr_dat(init_time[3]%16+0x30); wr_dat('t'); wr_dat(init_time[4]/16+0x30); wr_dat(init_time[4]%16+0x30); wr_com(0x80+0x40); wr_dat('m'); wr_dat(init_time[5]/16+0x30); wr_dat(init_time[5]%16+0x30); wr_dat('s'); wr_com(0x80); } } void delay_ms(uint a)//毫秒级别延时; { uchar x,y; for (a;a>0;a--) for(x=0;x<114;x++) for(y=0;y<1;y++); } void wr_com(uchar dat)//1602写指令函数; { E=0; RS=0;; LCD1602_IO=dat; E=1; delay_ms(2); E=0;delay_ms(2); } void wr_dat(uchar dat)//1602写数据函数; { E=0; RS=1; LCD1602_IO=dat; E=1;delay_ms(2); E=0;delay_ms(2); } void init_1602(void)//1602初始化函数; { delay_ms(20); wr_com(0X38); delay_ms(5); wr_com(0X38); delay_ms(5); wr_com(0X01); wr_com(0X06); wr_com(0X0c); wr_com(0X80); } |
|
相关推荐
4个回答
|
|
显示不稳定,在这个位置上市不是也写入其他数字了,或者说在数字改变的时候进行一次清空
|
|
|
|
貌似不是啊!很有规律在秒位正常的时候年位的数值总是在“11”和“??”之间变化,但是当秒进位成“??”时年位就正常了!然后再过整整一分钟,秒位变数字年位就变回数字与??之间变化,挺郁闷的!
|
|
|
|
帮帮忙吧!谢谢啦,谁能帮我解决下!奉上全部积分
|
|
|
|
是不是进制的问题
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
250 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
473 浏览 2 评论
571 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
260 浏览 0 评论
400 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11974 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 01:33 , Processed in 0.539103 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号