1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
只显示时间,时间不动,而且不是初始化的时间。
求解救。 #include #include #define uchar unsigned char #define uint unsigned int //lcd1602 void delay10ms(uint c); void lcdwritecom(uchar com); void lcdwritedata(uchar dat); void lcdinit(void); #define LCD P0 ***it RS=P2^6; ***it RW=P2^5; ***it LCDE=P2^7; //////////////////////// //ds1302 ***it SCLK=P3^6; ***it DSIO=P3^4; ***it RST=P3^5; uchar ds1302read(uchar addr); void ds1302write(uchar addr,uchar dat); void ds1302init(void); void ds1302readtime(void); void lcddisplay(void); uchar readaddr[7]={0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar writeaddr[7]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; uchar time[7]={0, 0, 0x12, 0x30, 0x03, 0x07, 0x14}; //////////////////////////////////////////////////// void main() { lcdinit(); ds1302init(); while(1) { ds1302readtime(); lcddisplay(); } } void lcddisplay(void) { lcdwritecom(0x80+0x40); lcdwritedata('0'+time[2]/16); lcdwritedata('0'+(time[2]&0x0f)); lcdwritedata('-'); lcdwritedata('0'+time[1]/16); lcdwritedata('0'+(time[1]&0x0f)); lcdwritedata('-'); lcdwritedata('0'+time[0]/16); lcdwritedata('0'+(time[0]&0x0f)); lcdwritecom(0x80); lcdwritedata('2'); lcdwritedata('0'); lcdwritedata('0'+time[6]/16); lcdwritedata('0'+(time[6]&0x0f)); lcdwritedata('-'); lcdwritedata('0'+time[4]/16); lcdwritedata('0'+(time[4]&0x0f)); lcdwritedata('-'); lcdwritedata('0'+time[3]/16); lcdwritedata('0'+(time[3]&0x0f)); lcdwritecom(0x8D); lcdwritedata('0'+(time[5]&0x07)); } /******************************************************************************* * 函 数 名 : ds1302readtime * 函数功能 : 读取ds1032时间 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void ds1302readtime(void) { uchar n; for(n=0;n<7;n++) { time[n]= ds1302read(readaddr[n]); } } /******************************************************************************* * 函 数 名 : ds1302init * 函数功能 : ds1032初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void ds1302init(void) { uchar n,tmp; for (n=0; n<7; n++) { tmp = time[n] / 10; time[n] = time[n] % 10; time[n] = time[n] + tmp*16; } ds1302write(0x8E,0x00); for(n=0;n<7;n++) { ds1302write(writeaddr[n],time[n]); } ds1302write(0x8E,0x80); } /******************************************************************************* * 函 数 名 : ds1302read * 函数功能 : ds1032读操作 * 输 入 : uchar addr * 输 出 : 无 *******************************************************************************/ uchar ds1302read(uchar addr) { uchar n,dat,dat1; RST=0; _nop_(); SCLK=0; _nop_();_nop_();_nop_(); RST=1; _nop_(); for(n=0;n<8;n++) { DSIO=addr&0x01; addr>>=1; SCLK=1; _nop_(); SCLK=0; _nop_(); } _nop_(); for(n=0;n<8;n++) { dat1=DSIO; dat=dat>>1; dat1=dat1<<7; SCLK=1; _nop_(); SCLK=0; _nop_(); } RST=0; _nop_(); SCLK=1; _nop_(); DSIO=0; _nop_(); DSIO=1; _nop_(); return dat; } /******************************************************************************* * 函 数 名 : ds1302write * 函数功能 : ds1032写操作 * 输 入 : uchar addr ,dat * 输 出 : 无 *******************************************************************************/ void ds1302write(uchar addr,uchar dat) { uchar n; RST=0; _nop_(); SCLK=0; _nop_();_nop_();_nop_(); RST=1; _nop_(); for(n=0;n<8;n++) { DSIO=addr&0x01; addr>>=1; SCLK=1; _nop_(); SCLK=0; _nop_(); } for(n=0;n<8;n++) { DSIO=dat&0x01; dat>>=1; SCLK=1; _nop_(); SCLK=0; _nop_(); } RST=0; _nop_(); } /******************************************************************************* * 函 数 名 : lcdwritecom * 函数功能 : LCD写指令 * 输 入 : uchar com * 输 出 : 无 *******************************************************************************/ void lcdwritecom(uchar com) { LCDE=0; RS=0; RW=0; LCD=com; delay10ms(1); LCDE=1; delay10ms(1); LCDE=0; } /******************************************************************************* * 函 数 名 : lcdwritedata * 函数功能 : LCD写数据 * 输 入 : uchar dat * 输 出 : 无 *******************************************************************************/ void lcdwritedata(uchar dat) { LCDE=0; RS=1; RW=0; LCD=dat; delay10ms(1); LCDE=1; delay10ms(1); LCDE=0; } /******************************************************************************* * 函 数 名 : delay10ms * 函数功能 : 延时 10ms * 输 入 : uint c * 输 出 : 无 *******************************************************************************/ void delay10ms(unsigned int c) { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--) ; } } } /******************************************************************************* * 函 数 名 : lcdinit * 函数功能 : 初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void lcdinit(void) { lcdwritecom(0x38); lcdwritecom(0x0c); lcdwritecom(0x01); lcdwritecom(0x06); lcdwritecom(0x80); } |
|
相关推荐
4个回答
|
|
|
|
又经过本人亲身测试,发现你的程序有一些问题。第一:DS1302初始化有问题,
第一个for循环可以去掉,根本不用什么转换了,比如time[7]={0, 0, 0x12, 0x30, 0x03, 0x07, 0x14}; 直接保存进去就是2014-03-30 12-00-00了。 第二:你程序不能正常显示是因为你的读取有问题,以此总是显示0.我发我改过后的程序给你,不懂再来问。
|
|
|
|
直接对时间数据进行赋值,调试一下看看是DS1302的问题还是液晶的问题。
|
|
|
|
主程序死循环中应该加较长时间的延时才好
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:19 , Processed in 0.557697 second(s), Total 84, Slave 63 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号