1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 臂力吧啦 于 2015-1-25 22:02 编辑
想利用ds1302和lcd1602做一个实时时钟,但程序不知道出了什么问题,LCD1602上显示的格式对了,但所有数字都是零。估计是DS1302部分的程序出了问题。本人新手菜鸟一枚,还望各位高手不i吝赐教!!!不胜感激!!!程序如下: #include "STC12C5A.h" ***it EN=P3^7; //位定义LCD1602的相关引脚 ***it RW=P3^6; ***it RS=P3^5; ***it SCLK=P1^3; //位定义DS1302的相关引脚 ***it IO=P3^4; ***it RST1=P0^7; ***it BIT0=ACC^0; ***it BIT7=ACC^7; unsigned char time[]={0x00,0x40,0x23,0x24,0x01,0x05,0x15}; //初始化时间 unsigned char now[7]; //当前时间 void delay_ms(unsigned int time) { unsigned int t; for(;time>0;time--) {t=1600;while(t--);} } /**********DS1302部分*******************/ /***************************************/ void ds1302_input(unsigned char addr,unsigned char dat) //往ds1302写入数据 { unsigned char i; RST1=0; SCLK=0; RST1=1; ACC=addr; for(i=0;i<8;i++) { SCLK=0; IO=BIT0; ACC>>=1; SCLK=1; } ACC=dat; for(i=0;i<8;i++) { SCLK=0; IO=BIT0; ACC>>=1; SCLK=1; } RST1=0; } unsigned char ds1302_output(unsigned char addr) //输出指定地址的数据 { unsigned char i; RST1=0; SCLK=0; RST1=1; ACC=addr; for(i=0;i<8;i++) { SCLK=0; IO=BIT0; ACC>>=1; SCLK=1; } for(i=1;i<8;i++) { SCLK=1; BIT7=IO; ACC>>=1; SCLK=0; } RST1=0; return ACC; } void time_init(unsigned char *time) //设置初始时间 { unsigned char addr=0x80,i; ds1302_input(0x8e,0x00); //取消写保护 for(i=0;i<7;i++) { ds1302_input(addr,time); addr=addr+2; } ds1302_input(0x8e,0x80); //开启写保护 } void get_time(unsigned char *now) //获取当前时间 { unsigned char addr=0x81,i,t; ds1302_input(0x8e,0x80); //开启写保护 for(i=0;i<7;i++) { ds1302_input(0x8e,0x00); t=ds1302_output(addr); ds1302_input(0x8e,0x80); addr=addr+2; now=(t/16)*10+(t&(0x0f)); } } /**********LCD1602部分*******************/ /***************************************/ void lcd_write_com(unsigned char com) //lcd1602输入命令 { RS=0; RW=0; P0=com; delay_ms(5); EN=1;EN=0; } void lcd_write_dat(unsigned char dat) //lcd1602输入数据 { RS=1; RW=0; P0=dat; delay_ms(5); EN=1;EN=0; } void lcd_init() //lcd1602初始化 { lcd_write_com(0x38); lcd_write_com(0x0c); lcd_write_com(0x06); lcd_write_com(0x01); } void show_time() //显示当前时间 { get_time(now); lcd_write_com(0x80); lcd_write_dat('0'+now[6]/10); lcd_write_dat('0'+now[6]%10); lcd_write_dat('-'); lcd_write_com(0x83); lcd_write_dat('0'+now[4]/10); lcd_write_dat('0'+now[4]%10); lcd_write_dat('-'); lcd_write_com(0x86); lcd_write_dat('0'+now[3]/10); lcd_write_dat('0'+now[3]%10); lcd_write_dat(' '); lcd_write_com(0x89); lcd_write_dat('0'+now[5]/10); lcd_write_dat('0'+now[5]%10); lcd_write_com(0x80+0x40); lcd_write_dat('0'+now[2]/10); lcd_write_dat('0'+now[2]%10); lcd_write_dat('-'); lcd_write_com(0x80+0x40+3); lcd_write_dat('0'+now[1]/10); lcd_write_dat('0'+now[1]%10); lcd_write_dat('-'); lcd_write_com(0x80+0x40+6); lcd_write_dat('0'+now[0]/10); lcd_write_dat('0'+now[0]%10); } void main() { lcd_init(); time_init(time); while(1) { show_time(); delay_ms(200); } } |
|
相关推荐
7个回答
|
|
now=(t/16)*10+(t&(0x0f)); //能解释下这个是什么意思么
|
|
|
|
|
|
|
|
你用的cpu芯片是c51还是c52
|
|
|
|
哦,你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积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:07 , Processed in 0.699414 second(s), Total 81, Slave 65 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号