搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 2012-9-10 17:40:18 | 显示全部楼层 |阅读模式
写了个ds1302+lcd1602的程序来作电子时钟,可是程序写完了,检查科很久都发现问题,就是时钟不走动,昨天刚把ds1302中的for循环里的i改成8-0递减就正常了,求大神帮我看看是哪里出错了                                                



#include<reg52.h>
#define uchar unsigned  char
#define uint unsigned int   
uchar  sec1,sec2,min1,min2,hour1,hour2,mon1,mon2,day1,day2,year1,year2,week1;
//1602引脚定义
sbit  rs=P2^4;
sbit  rw=P2^5;
sbit  en=P2^6;
//1302定义
sbit  scl=P3^6;
sbit  io=P3^4;
sbit  rst=P3^5;
sbit  ACC0=ACC^0;
sbit  ACC7=ACC^7;
uchar  second,minute,hour,year,month,day,week;
uchar  one[]="20";
uchar  two[]="0123456789";       
/******************延时函数********************************
**********************************************************/
//毫秒延时函数
void delay_ms(uchar z)
{
        uint x,y;
        for(y = z;y>0;y--)
        {
            for(x = 110;x>0;x--);
        }
}

/******************1602相关函数****************************
**********************************************************/
//1602写命令函数
void  command(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相关函数*****************
***************************************************/
//写地址函数
void  write_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);
}
//写入时间
void  write_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[sec1]);
               command(0x80+0x46);
               write(two[sec2]);
               command(0x80+0x45);
               write(':');

               command(0x80+0x44);
               write(two[min1]);
               command(0x80+0x43);
               write(two[min2]);
               command(0x80+0x42);
               write(':');

               command(0x80+0x41);
               write(two[hour1]);
               command(0x80+0x40);
               write(two[hour2]);

               command(0x80+0x0b);
               write(two[week1]);
               
               command(0x80+0x09);
               write(two[day1]);
               command(0x80+0x08);
               write(two[day2]);
               command(0x80+0x07);
               write('-');

               command(0x80+0x06);
               write(two[mon1]);
               command(0x80+0x05);
               write(two[mon2]);
               command(0x80+0x04);
               write('-');
       
              command(0x80+0x03);
              write(two[year1]);
              command(0x80+0x02);
              write(two[year2]);

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

                initialize();
       
               delay_ms(5);

               write_time();
       
        delay_ms(5);

        while(1)
        {  
           display();
                }
}      

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 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++)    ?

出0入0汤圆

 楼主| 发表于 2012-9-10 21:09:46 | 显示全部楼层
lcw_swust 发表于 2012-9-10 20:01
楼主所说“for(j=8;j>0;j--)     //错误出处,当i为0-8时”
是指的哪种情况?
for(j=0;j>8;j--)    ?

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

出0入0汤圆

发表于 2012-9-10 22:37:39 | 显示全部楼层
zhenglingo 发表于 2012-9-10 21:09
是指for(i = 0;i

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

出0入0汤圆

 楼主| 发表于 2012-9-10 22:47:04 | 显示全部楼层
我就查不出来是哪里出错了啊   很郁闷

出0入0汤圆

发表于 2012-9-10 22:52:53 | 显示全部楼层
对比两种写法编译出来的汇编语言看看,能不能找到差别

出0入0汤圆

发表于 2012-9-11 19:44:30 | 显示全部楼层
有点诡异!~

出0入0汤圆

发表于 2012-9-16 20:03:40 | 显示全部楼层
也碰到过,一直没法解决
我的问题是不能设置年份为十位超过8的年,比如设置年份为87、97年则自定调成00年。很是苦闷
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表