zhenglingo 发表于 2012-9-10 17:40:18

菜鸟求大神——关于ds1302中的诡异事情

写了个ds1302+lcd1602的程序来作电子时钟,可是程序写完了,检查科很久都发现问题,就是时钟不走动,昨天刚把ds1302中的for循环里的i改成8-0递减就正常了,求大神帮我看看是哪里出错了                                                



#include<reg52.h>
#define uchar unsignedchar
#define uint unsigned int   
ucharsec1,sec2,min1,min2,hour1,hour2,mon1,mon2,day1,day2,year1,year2,week1;
//1602引脚定义
sbitrs=P2^4;
sbitrw=P2^5;
sbiten=P2^6;
//1302定义
sbitscl=P3^6;
sbitio=P3^4;
sbitrst=P3^5;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
ucharsecond,minute,hour,year,month,day,week;
ucharone[]="20";
uchartwo[]="0123456789";       
/******************延时函数********************************
**********************************************************/
//毫秒延时函数
void delay_ms(uchar z)
{
        uint x,y;
        for(y = z;y>0;y--)
        {
          for(x = 110;x>0;x--);
        }
}

/******************1602相关函数****************************
**********************************************************/
//1602写命令函数
voidcommand(uchar com)
{
        rs = 0;
        rw = 0;
        en = 0;
        P0 = com;
        delay_ms(5);
        en = 1;
        delay_ms(5);
        en = 0;
}
//1602 写数据函数
void write(uchar dat)
{
        rs = 1;
        rw = 0;
        en = 0;
        P0 = dat;
        delay_ms(5);
        en = 1;
        delay_ms(5);
        en = 0;
}
//1602初始化函数
void initialize()
{
                en = 0;
        command(0x38);
        command(0x0c);
        command(0x06);
        command(0x01);
        command(0x80);
}

/********************ds1302相关函数*****************
***************************************************/
//写地址函数
voidwrite_byte(uchar dat)
{
        uchar j ;
        ACC = dat;
      for(j=8;j>0;j--)   //错误出处,当i为0-8时液晶就不走了,显示为年月日 周为2000-00-00 0时间为00:00:00如果改成1-9就能正常了
         {       
                scl=0;
        io = ACC0;
        scl = 1;
        scl = 0;
        ACC = ACC >> 1;       
         }       
}
//读取地址函数
uchar read_byte()
{
        uchar i;
       for(i = 8;i > 0;i--)
          {
        ACC = ACC>>1;       
        ACC7 = io;       
        scl = 1;
        scl = 0;
          }

        return(ACC);

}
//写入数据函数
void write_date(uchar addr,uchar date)
{
           rst = 0;
        scl = 0;
                rst = 1;

        write_byte(addr);
        write_byte(date);

        scl = 1;
        rst = 0;
}
//读入数据函数
uchar read_date(uchar addr)
{
    uchar uaddr;

        rst = 0;
        scl = 0;
                rst = 1;

        write_byte(addr);
        uaddr=read_byte();

        scl = 1;
        rst = 0;
       
        return(uaddr);
}
//写入时间
voidwrite_time()
{               
             write_date(0x8e,0x00); //WP=0 写操作
             write_date(0x90,0x00); //关闭充电功能
             write_date(0x80,0x12);// second
             write_date(0x82,0x58);// minute
             write_date(0x84,0x11);// hour
             write_date(0x86,0x09);// day
             write_date(0x88,0x09);// month
             write_date(0x8c,0x12);// year
             write_date(0x8a,0x07);// week
             write_date(0x8e,0x80); //WP=1 写保护          
}
void display()
{               
      
            second = read_date(0x81);          
            sec1 = second&0x0f;
            sec2 = second>>4;

            minute = read_date(0x83);
            min1 = minute&0x0f;
            min2 = (minute>>4);

            hour = read_date(0x85);
            hour1 = hour&0x0f;
            hour2 = (hour>>4);

            day = read_date(0x87);
            day1 = day&0x0f;
            day2 = (day>>4);

            month = read_date(0x89);
            mon1 = month&0x0f;
            mon2 = (month>>4);

               year=read_date(0x8d);
               year1 = year&0x0f;
               year2 = (year>>4);

                week = read_date(0x8b);
                week1 = week&0x0f;
               
               command(0x80+0x47);
               write(two);
               command(0x80+0x46);
               write(two);
               command(0x80+0x45);
               write(':');

               command(0x80+0x44);
               write(two);
               command(0x80+0x43);
               write(two);
               command(0x80+0x42);
               write(':');

               command(0x80+0x41);
               write(two);
               command(0x80+0x40);
               write(two);

               command(0x80+0x0b);
               write(two);
               
               command(0x80+0x09);
               write(two);
               command(0x80+0x08);
               write(two);
               command(0x80+0x07);
               write('-');

               command(0x80+0x06);
               write(two);
               command(0x80+0x05);
               write(two);
               command(0x80+0x04);
               write('-');
       
            command(0x80+0x03);
            write(two);
            command(0x80+0x02);
            write(two);

            command(0x80+0x01);
            write('0');
            command(0x80+0x00);
            write('2');
       
}
/****************主函数***********************
*********************************************/
void main()
{       

                initialize();
       
               delay_ms(5);

               write_time();
       
        delay_ms(5);

        while(1)
        {
           display();
                }
}      

lcw_swust 发表于 2012-9-10 20:01:59

楼主所说“for(j=8;j>0;j--)   //错误出处,当i为0-8时”
是指的哪种情况?
for(j=0;j>8;j--)    ?
for(j=0;j<8;j--)    ?
for(j=0;j>8;j++)    ?
for(j=0;j<8;j++)    ?

zhenglingo 发表于 2012-9-10 21:09:46

lcw_swust 发表于 2012-9-10 20:01 static/image/common/back.gif
楼主所说“for(j=8;j>0;j--)   //错误出处,当i为0-8时”
是指的哪种情况?
for(j=0;j>8;j--)    ?


是指for(i = 0;i<8;i++);   这种情况啊

lcw_swust 发表于 2012-9-10 22:37:39

zhenglingo 发表于 2012-9-10 21:09 static/image/common/back.gif
是指for(i = 0;i

这还真是诡异了
不知是不是编译器设置问题

zhenglingo 发表于 2012-9-10 22:47:04

我就查不出来是哪里出错了啊   很郁闷

sf49ers 发表于 2012-9-10 22:52:53

对比两种写法编译出来的汇编语言看看,能不能找到差别

beijinggood2008 发表于 2012-9-11 19:44:30

有点诡异!~

younge 发表于 2012-9-16 20:03:40

也碰到过,一直没法解决
我的问题是不能设置年份为十位超过8的年,比如设置年份为87、97年则自定调成00年。很是苦闷
页: [1]
查看完整版本: 菜鸟求大神——关于ds1302中的诡异事情