这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 带返回值的函数给全局变量赋值时出错,返回的值一直无变化

共2条 1/1 1 跳转至

带返回值的函数给全局变量赋值时出错,返回的值一直无变化

工程师
2024-11-24 10:06:59     打赏

在学习江科大的stm32课程编码器正转反转时,出现一些问题,

主函数代码如下:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"

int16_t Num;            //定义待被旋转编码器调节的变量

int main(void)
{
OLED_Init();        //OLED初始化
Encoder_Init();        //旋转编码器初始化

while (1)
{
Num += Encoder_Get();       //获取旋转编码器的增量值

OLED_ShowSignedNum(1, 5, Num, 5);    //显示Num

}
}

其中Num += Encoder_Get();  修改为Num = Encoder_Get();则实现不了编码器正反转OLED显示数值增减的现象。一直找不到问题出在哪里?

另外如果编码器模块里的状态获取函数更改为:

int16_t Encoder_Get(void)
{
return Encoder_Count;
}

然后主函数更改为:

while (1)
{
OLED_ShowSignedNum(1, 5, Encoder_Get(), 5);
}
也是可以的。还请大佬们指导下,本人小白,刚接触,一直没想明白。

另外还有一个问题:keil软件Debug时,如何查看中间变量值?比如Temp,我想通过watch窗口查看,显示非法数据,有什么方法可以看到中间变量值么?





关键词: 函数     全局     变量     赋值    

助工
2024-11-24 10:08:00     打赏
2楼

建议有时间先学一下C语言。函数内定义的Temp只是一个临时变量,退出Encoder_Get后就会被释放掉了。如果想保留这个值可以加static定义成静态变量.

int16_t Encoder_Get(void)
{
    /*使用Temp变量作为中继,目的是返回Encoder_Count后将其清零*/
    /*在这里,也可以直接返回Encoder_Count
      但这样就不是获取增量值的操作方法了
      也可以实现功能,只是思路不一样*/
    int16_t Temp;
    Temp = Encoder_Count;
    Encoder_Count = 0;
    return Temp;
}

出问题的地方就是这个获取增量值函数里面:Encoder_Count = 0;这句代码,加上这句,Return回去的值一直是0,不是需要的增量值,Temp一开始是增量值,等到执行该句代码后,Temp也变为常量0了,所以导致值一直是0,将该句代码注释掉后,一切显示正常。

这也是为啥采用Num += Encoder_Get(); 的方式。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]