ds1302在12864上显示时间,不走,与我的初始时间不一样

2019-07-15 19:57发布

发下我的程序,大家 看看哪有错误
#define uchar unsigned char
#define  unit unsigned int
#define           write_second 0x80
#define           write_minute        0x82
#define           write_hour        0x84
#define           read_second  0x83
#define           read_minute        0x85
#define           read_hour        0x8e
sbit SCLK=P3^3;
sbit SDA=P3^4;
sbit RST=P3^5;
uchar hour=23;minute=59;second=58;
void delay1(uchar x)
{
   uchar i;
   while(x--)
   for(i=0;i<110;i++);
}







void DS1302WriteByte(uchar dat)
{
uchar i;


for(i=0;i<8;i++
{
SDA=dat&0x01
delay1(2);
SCLK=1
delay1(2);
dat>>=1;
SCLK=0;
}
}


uchar DS1302ReadByte()
{
uchar i,dat;
delay1(2);
for(i=0;i<8;i++)
{
dat>>=1;
if(SDA==1
dat|=0x80;

delay1(2);
SCLK=0;
delay1(2);
}
return dat;
}


/*每次发起数据传输之前,要复位ds1302*/


void resetds1302(void)
{
         RST=0;
         SCLK=0;
         RST=1;
}
/*写数据前清除写保护*/
void cleards1302wp(void)
{
           resetds1302();
           RST=1;
           DS1302WriteByte(0X8E);
           DS1302WriteByte(0);
           SDA=0;
           RST=0;
}
/*写完数据设置写保护*/


void setds1302wp(void)
{
         resetds1302();
         RST=1;
         DS1302WriteByte(0X8E);
           DS1302WriteByte(0X80);
           SDA=0;
           RST=0;
}


uchar DS1302Read(uchar addr)
{
     uchar tmp=0;
     resetds1302();
     RST=1;
     DS1302WriteByte(addr);
         tmp=DS1302ReadByte();
         SDA=0;
         RST=0;
         return tmp;


}


void  DS1302Write(uchar addr,uchar dat)
{
    resetds1302;
        RST=1;
        DS1302WriteByte(addr);
        DS1302WriteByte(dat);
        SDA=0;
        RST=0;


}




void set_time(uchar addr,uchar time)
{
     uchar tmp;
         tmp=time/10;
         time=time%10;
         time=time+tmp*16;
         cleards1302wp();
     DS1302Write(addr,time);
     setds1302wp();
}


void read_time(uchar addr,uchar time)
{
        time=DS1302Read(addr);


}
void dispalytime(uchar addr,uchar time)
{
          uchar shi,ge;
          shi=time/16;
          ge=time%16;
          com(addr);
          dat(0x30+shi);
          dat(0x30+ge);
}




void  main()
{
  set_time(write_hour,hour);
         set_time(write_minute,minute);
         set_time(write_second,second);
    while(1)
        {  


          read_time(read_hour,hour);
          dispalytime(0x90,hour);
          read_time(read_minute,minute);
          dispalytime(0x92,minute);
          read_time(read_second,second);
          dispalytime(0x94,second);
       }
}


com(),dat()  是12864 显示所需子函数.  硬件上一开始显示初始值,完后马上显示17 : 3; : 3:
这算是乱码吗?且时间不变化,
硬件上没有在晶振处加电容   谁有能用的程序给一份  但是大多数都是这样的吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
lxc007
1楼-- · 2019-07-17 01:19
依然落叶飘零 发表于 2014-5-1 16:06
你程序问题多多。第一:uchar hour=23;minute=59;second=58;你这个定义错了。你这样定义hour是uchar,minute ...

我用定时搞定了时间,但有点别的问题,能看看我这个帖子里的问题吗?谢谢

http://bbs.elecfans.com/jishu_430158_1_1.html

lxc007
2楼-- · 2019-07-17 06:13
依然落叶飘零 发表于 2014-5-1 16:06
你程序问题多多。第一:uchar hour=23;minute=59;second=58;你这个定义错了。你这样定义hour是uchar,minute ...

就算数值转化有问题,但是显示出来,不走是什么原因?

还有往ds1302里写入数据需要把十进制转化为bcd码,我已经转了,可是往出读的时候就不用再转了吗?

我觉得还是ds1302没有工作,不然就不会把初始值转为16进制显示了,因为从ds1302里面读取的bcd值肯定需要
void dispalytime(uchar addr,uchar time)
{
          uchar shi,ge;
          shi=time/16;
          ge=time%16;
          com(addr);
          dat(0x30+shi);
          dat(0x30+ge);
}

处理才能显示吧?

好多说ds1302不工作需要在dat 接上拉电阻,还有说秒寄存器清ch位?

不懂啊

ds1302怎么这么难搞
lxc007
3楼-- · 2019-07-17 10:17
 精彩回答 2  元偷偷看……
依然落叶飘零
4楼-- · 2019-07-17 15:12
给你参考下………………

2 DS1302 LCD.rar 下载积分: 积分 -1 分

59.71 KB, 下载次数: 98, 下载积分: 积分 -1 分

lxc007
5楼-- · 2019-07-17 20:44
依然落叶飘零 发表于 2014-5-2 11:42
给你参考下………………

再请教你一个问题,我的按键要按下1秒多后松手才起作用,怎么办,用的就是简单延时消抖的  该怎么改才能速度快点.
依然落叶飘零
6楼-- · 2019-07-17 22:06
lxc007 发表于 2014-5-3 14:16
再请教你一个问题,我的按键要按下1秒多后松手才起作用,怎么办,用的就是简单延时消抖的  该怎么改才能速度 ...

抖动延时多久?一般延时10ms.

一周热门 更多>