大哈欠E 发表于 2013-5-9 07:25:03

关于ds1302和lcd1602问题,请大神指教,好人好报,急。

这次想做个ds1302的时钟用lcd1602来显示,可是在写完程序之后发现模拟的电路运行不正常,我觉得电路应该没问题,1302已经给他置了初值进去便能计时,现在lcd1602不能显示出正确的时间,我估计是读取1302哪里的问题,要么就是转换为bcd码 再转换为十进制错了这里的转换我一直不理解 我用的是模块化编程 贴上一部分代码我是小白 望大神指教。谢谢了。

这个是1302的程序
#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uintunsigned int

sbit rst=P3^4;
sbit sclk=P3^5;
sbit io=P3^6;
uchartime_data={13,1,5,6,20,47,32} ;//年 星期 月 日 小时 分 秒
uchartime_add={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
ucharread_add={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}        ;
void write_ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
   sclk=0;
   io=dat&0x01;   //从低位开始传输
   dat=dat>>1;
   sclk=1;                   //数据在上升沿有效 开始写入
   
   }
}
uchar read_ds1302_byte(uchar add)
{
uchar i;
uchar dat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_ds1302_byte(add);//由于写时sclk为高电平
for(i=0;i<8;i++)
{
    sclk=0;                               //读下降沿有效
        dat=dat>>1;          //只移7位
        if(io)
        {
       dat=dat|0x80;
          sclk=1;
       }
    }
   rst=0;
   _nop_();
   sclk=0;
   _nop_();
   sclk=1;
   _nop_();
   io=1;
   return(dat);
}

void write_ds1302(uchar add,uchar dat)
{

rst=0;
_nop_();
rst=1;
_nop_();
sclk=0;
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sclk=1;
}
void set_rtc()
{
uchar i,j;
for(i=0;i<7;i++)
   {
          j=time_data/10;                      //十位
       time_data=time_data%10;          //个位
       time_data=j*16+time_data;//转换为十六进制
      }
write_ds1302(0x8e,0x00);             //去除写保护
   for(i=0;i<7;i++)
   {
           write_ds1302(time_add,time_data);
    }
   write_ds1302(0x8e,0x80);                           //加写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
   time_data=read_ds1302_byte(read_add); //读取的是16进制数 需转换
   }
}

这是1602的代码
#include"LCD1602.H"
#include<reg52.h>
#include"DELAY.H"
#include"dds1302.h"
#define uchar unsigned char
#define uintunsigned int
sbit rs=P1^1;
sbit rw=P1^2;
sbit en=P1^3;

unsigned char digital={"0123456789"} ;

void write_data(unsigned char dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delay_50us(6);
en=1;
delay_50us(20);
en=0;
}
void write_command(unsigned char com)           /***lcd1602写指令***/
{
rs=0;
rw=0;
en=0;       //先拉低使能端,因为初始化默认为高电平
P0=com;
delay_50us(6);
en=1;
delay_50us(20);
en=0;
}

void disp_year()
{
uint i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0x80+5);
write_data(digital);
write_command(0x80+6);
write_data(digital);
delay_50us(200);      //延时1ms

}
void disp_month()
{
uchar i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0x80+8);
write_data(digital);
write_command(0x80+9);
write_data(digital);
delay_50us(200);      //延时1ms

   }
void disp_date()                          //日
{
   uchar i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0x80+11);
write_data(digital);
write_command(0x80+12);
write_data(digital);
delay_50us(200);      //延时1ms

}
void disp_day()                    /***星期***/
{
   uchar i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0x80+14);           //第一列 14行
write_data(digital);
write_command(0x80+15);
write_data(digital);
delay_50us(200);      //延时1ms
}
void disp_hour()
{
uchar i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0xc0+5);           //第一列 14行
write_data(digital);
write_command(0xc0+6);
write_data(digital);
delay_50us(200);      //延时1ms
}
void disp_minute()
{
uchar i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0xc0+8);           //第一列 14行
write_data(digital);
write_command(0xc0+9);
write_data(digital);
delay_50us(200);      //延时1ms
}
void disp_second()
{
uint i ,j;                 //十位 个位
i=time_data/16;       //十位
j=time_data%16;       //个位
write_command(0xc0+11);           //第一列 14行
write_data(digital);
write_command(0xc0+12);
write_data(digital);
delay_50us(200);      //延时1ms
}
void disp_all_date()
{
disp_year() ;
disp_month();
disp_day();   //星期
disp_date();    //日
disp_hour();
disp_minute();
disp_second();
}

void init_lcd1602(void)
{
write_command(0x38);
delay(20);
write_command(0x38);
delay(20);
write_command(0x38);
write_command(0x0c);
delay(20);
write_command(0x06);
delay(20);
write_command(0x01);
delay(20);
}

这是主函数main()

#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#include"DELAY.H"
#include"LCD1602.H"

void main()
{
set_rtc();
init_lcd1602();
write_command(0x80);
write_data('D');
write_data('a');
write_data('t');
write_data('e');
write_data(':');
   while(1)
   {
    read_rtc();
    disp_all_date();
        }

}
附上模拟电路图片

大哈欠E 发表于 2013-5-9 07:54:46

怎么没有人了。。。????求助啊

lmt50211 发表于 2013-5-9 08:27:44

同求。。。。。。

xiaobendan001 发表于 2013-5-9 09:31:33

一部分一部分的测试了

bbssilverkey 发表于 2013-5-9 10:03:25

用串口先输出来看结果,如果这个你不想也估计没人能帮你了

大哈欠E 发表于 2013-5-9 14:10:23

bbssilverkey 发表于 2013-5-9 10:03 static/image/common/back.gif
用串口先输出来看结果,如果这个你不想也估计没人能帮你了

已经解决了 ,折腾了几个小时 谢谢

bbssilverkey 发表于 2013-5-9 17:48:25

大哈欠E 发表于 2013-5-9 14:10 static/image/common/back.gif
已经解决了 ,折腾了几个小时 谢谢

呵呵,加油吧,以后经常都会遇到这种事.
页: [1]
查看完整版本: 关于ds1302和lcd1602问题,请大神指教,好人好报,急。