单片机实时时钟 问题

[复制链接]
1440|18
 楼主| 小盼abc 发表于 2014-12-3 14:06 | 显示全部楼层 |阅读模式
unsigned char Ds1302_Read_Byte(unsigned char addr)
{

        unsigned char i;
        unsigned char temp=0x00;
        RST_SET;       

        //写入目标地址:addr
        addr = addr | 0x01;//最低位置高
        for (i = 0; i < 8; i ++)
            {
             
                if (addr & 0x01)
                   {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                addr = addr >> 1;
                }
       
        //输出数据:temp
        for (i = 0; i < 8; i ++)
            {
                if (IO_R)
                   {
                        temp |= 0x80;
                        }
                else
                   {
                        temp &= 0x7F;
                        }
                SCK_SET;
                SCK_CLR;
                temp = temp >> 1;
                }
       
        RST_CLR;        //停止DS1302总线
        return temp;
}

unsigned char i;
        unsigned char temp=0x00;
        RST_SET;       

        //写入目标地址:addr
        addr = addr | 0x01;//最低位置高
        for (i = 0; i < 8; i ++)
            {
             
                if (addr & 0x01)
                   {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                addr = addr >> 1;
                }
       
        //输出数据:temp
        for (i = 0; i < 8; i ++)
            {
                temp = temp >> 1;
                if (IO_R)
                   {
                        temp |= 0x80;
                        }
                else
                   {
                        temp &= 0x7F;
                        }
                SCK_SET;
                SCK_CLR;
                }
       
        RST_CLR;        //停止DS1302总线
        return temp;
}

仅仅是temp = temp >> 1;先后的问题  为什么结果会不一样??
wangch_sh 发表于 2014-12-3 14:55 | 显示全部楼层
当然会不一样了,好好分析一下。
NE5532 发表于 2014-12-3 15:11 | 显示全部楼层
一个在入口,一个在出口,一个进来先执行一次,一个到执行一圈以后才执行,楼主你说怎么会一样?不要认为一个圈,就哪里都是一样的了,从哪里进去有时候非常关键。
 楼主| 小盼abc 发表于 2014-12-3 15:40 | 显示全部楼层
NE5532 发表于 2014-12-3 15:11
一个在入口,一个在出口,一个进来先执行一次,一个到执行一圈以后才执行,楼主你说怎么会一样?不要认为一 ...

第一个temp=0啊,那么刚进入的时候,temp = temp >> 1的先后不就没有区别了
 楼主| 小盼abc 发表于 2014-12-3 15:41 | 显示全部楼层
wangch_sh 发表于 2014-12-3 14:55
当然会不一样了,好好分析一下。

汗死  我当然知道不一样  不然结果怎么不一样  问题是我查不出  咨询下大家
wxjcan 发表于 2014-12-3 16:25 | 显示全部楼层
这种问题  自己随便找个数试着把两种程序走一遍,就能看出区别了
 楼主| 小盼abc 发表于 2014-12-3 16:35 | 显示全部楼层
wxjcan 发表于 2014-12-3 16:25
这种问题  自己随便找个数试着把两种程序走一遍,就能看出区别了

区别我当然知道  就是不知道为什么有这种区别啊
wxjcan 发表于 2014-12-3 17:04 | 显示全部楼层
原因就是3楼说的,放的位置不对;      

都移动8次的话,上面的程序相当于把第一位数据给舍弃了(unsigned char temp 是8为的数据);
下面的程序虽然也移了8次。但是第一次的无用数据是移走的。
玄德 发表于 2014-12-3 19:19 | 显示全部楼层
赶脚哪里话说拧了,LZ没说清问题。

NE5532 发表于 2014-12-3 22:28 | 显示全部楼层
不一样吧,有一个最后一次读到的数据没有移位,另一个移位了。楼主把3楼的回帖再仔细琢磨琢磨。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

86

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部