你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

函数返回值的问题?

[复制链接]
watercici 提问时间:2018-5-3 15:03 /
本帖最后由 watercici 于 2018-5-3 15:07 编辑

我又一个IIC的读函数如下;
u8 I2C_Read_Byte(unsigned char ack)  
{  
    //unsigned char i,receive=0;  
                u8 i,receive = 0;
    SDA_IN();
    for(i=0;i<8;i++ )  
    {  

                                SCL_H();
                          delay_us(5);
        receive<<=1;
                        
        if(READ_SDA())receive++;     
        delay_us(5);
        SCL_L();   
        delay_us(5);                        
    }                     
    if (!ack)  
        I2C_NACK();
    else  
        I2C_ACK();   
               
    return receive;  
}  


他的上一层是:void I2C_Read_Function(u8 ReadAddr,u8 ReData)
{
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_W);
    if(I2C_Wait_ACK())return;  
    I2C_Send_Byte(ReadAddr);
    if(I2C_Wait_ACK())return;  
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_R);      
    if(I2C_Wait_ACK())return;  
    ReData = I2C_Read_Byte(0);  
    I2C_STOP();  

}
而这个函数的上一层是:
I2C_Read_Function(PCF8563_SECOND_REGISTER,R_date.Second_Time);
这个函数在调试的时候发现,receive是有读取到值,当我顶层调用的时候,ReData也是有值的,可是顶层R_date.Second_Time的值一直都是0x00
这个是什么原因呢,数据类型都是U8没有问题啊?

<
收藏 评论15 发布时间:2018-5-3 15:03

举报

15个回答
wenyangzeng 回答时间:2018-5-3 15:15:25
if(READ_SDA())时:receive不应该是++,而是置位receive相对应 i 的的位

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

黑皮男 回答时间:2018-5-3 15:18:55
你这个不应该是这样吗
void I2C_Read_Function(u8 ReadAddr,u8 *ReData)

I2C_Read_Function(PCF8563_SECOND_REGISTER,&R_date.Second_Time);

函数参数是局部变量,只在函数内有效

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

watercici 回答时间:2018-5-3 15:27:19
黑皮男 发表于 2018-5-3 15:18
你这个不应该是这样吗
void I2C_Read_Function(u8 ReadAddr,u8 *ReData)

你的意思参数必须得定义成指针吗,是这样吗,我之前也有直接传递变量的时候啊
黑皮男 回答时间:2018-5-3 15:44:58
watercici 发表于 2018-5-3 15:27
你的意思参数必须得定义成指针吗,是这样吗,我之前也有直接传递变量的时候啊 ...

如果,你是需要往函数里传入值,可以直接传递变量,如果你要从函数返回值,要么直接返回,要么通过参数的指针来操作函数外层的参数
watercici 回答时间:2018-5-3 16:57:27
本帖最后由 watercici 于 2018-5-3 17:04 编辑
黑皮男 发表于 2018-5-3 15:44
如果,你是需要往函数里传入值,可以直接传递变量,如果你要从函数返回值,要么直接返回,要么通过参数的 ...

那下面这个函数呢:

        R_date.Second_Time = (u8)BCDToDec(R_date.Second_Time & 0x7f);                  

unsigned char BCDToDec(unsigned char _BCD)
{
  unsigned char temp = 0;
        unsigned char temp1 = 0;

  temp = ((unsigned char)(_BCD & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
  temp1 = temp + (_BCD & (unsigned char)0x0F);
        return temp1;
}
这个是temp1的返回值给不了R_date.Second_Time,这个是怎么回事??
在线等,谢谢,有点儿着急
anobodykey 回答时间:2018-5-3 17:19:16
watercici 发表于 2018-5-3 16:57
那下面这个函数呢:

        R_date.Second_Time = (u8)BCDToDec(R_date.Second_Time & 0x7f);           ...

你这个函数是对的呀,你在PC上单独测试这个函数是正确的

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

与龙共舞 回答时间:2018-5-3 17:24:24
watercici 发表于 2018-5-3 16:57
那下面这个函数呢:

        R_date.Second_Time = (u8)BCDToDec(R_date.Second_Time & 0x7f);           ...

老铁 黑皮男说的对
你坚持值传递也可以如下
u8 I2C_Read_Function(u8 ReadAddr)
{
u8 ReData ;
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_W);
    if(I2C_Wait_ACK())return;  
    I2C_Send_Byte(ReadAddr);
    if(I2C_Wait_ACK())return;  
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_R);      
    if(I2C_Wait_ACK())return;  
    ReData = I2C_Read_Byte(0);  
    I2C_STOP();  
return ReData ;

}



R_date.Second_Time=I2C_Read_Function(PCF8563_SECOND_REGISTER);

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

watercici 回答时间:2018-5-3 17:30:19
anobodykey 发表于 2018-5-3 17:19
你这个函数是对的呀,你在PC上单独测试这个函数是正确的

可是,我的值传不上来,现在也不能调试,一点运行按钮,就停止,PC指针指向0x00000000
anobodykey 回答时间:2018-5-3 17:39:57
本帖最后由 anobodykey 于 2018-5-3 17:42 编辑
watercici 发表于 2018-5-3 17:30
可是,我的值传不上来,现在也不能调试,一点运行按钮,就停止,PC指针指向0x00000000 ...

你的BCDToDec函数是对的,返回值可以正确的返回,你可以通过PC来测试

可以看到num的值是变了的,至于你说的在单片机上,值传不上来是其他的问题。
QQ截图20180503173658.jpg
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版