打印
[国产单片机]

STC89C52程序赋初值的问题

[复制链接]
1142|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wxhwdh|  楼主 | 2014-8-17 21:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近研究DS1302做的一个只显示小时、分钟和秒的程序时,在其的一个子程序中发现的一个问题,子程序代码如下:

* 函 数 名         : Ds1302Read
* 函数功能                   : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat2
*******************************************************************************/

uchar Ds1302Read(uchar addr)
{   
        uchar n,dat1,dat2;                     
        EA =0;          //在此设置一个断点,调试发现程序第一次到这里时,addr=0x81,dat1=0x81,dat2=0x08;而且在执行下面第一个for循环时,dat2的值总是与addr的值相同的,此程序在其他地方没有出现或者用到这个dat2,为什么第一次在初始化dat2后会有值?不应该是0么?而且addr与dat1为什么总是相同的?
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(CE)置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();

        for(n=0; n<8; n++)//读取8位数据
        {
               
                dat1 = DSIO;//从最低位开始接收
                dat2 = (dat2>>1) | (dat1<<7);          
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
    EA = 1;
        return dat2;       
}
请大神指教!!

相关帖子

沙发
kadada| | 2014-8-23 22:23 | 只看该作者
定义的变量没有赋初值就是一个随机数,碰巧而已,或编译器有意为之,不用管它。

使用特权

评论回复
板凳
ayb_ice| | 2014-8-26 15:04 | 只看该作者
局部变量,你都没有赋初值,任何值都是正常的

此处,因为是局部变量,都被编译器优化了,分配给了同一寄存器,所以值是相同的

不信可以看反汇编

使用特权

评论回复
地板
wang1979| | 2014-8-27 23:33 | 只看该作者
同意上面的说法,变量没有赋值的话,就不要用这个变量!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

33

帖子

1

粉丝