请求广大工程师,51单片机简单的 GPIO读取 + 静态变量 的函数
函数功能 是
1、根据当前拨码的位置(即两个IO口的高低电平)切换模式
2、添加了静态变量last_mode只有当拨码有变化才会更新频率
问题出现在
1、只有初始化的第一次才能进入FREQ_MODEL0(模式0)
2、后面无论怎么切换都无法更新FREQ_MODEL0,但是对应的 静态变量last_mode 和局部变量updatemode 都是正常赋值
我处理的方法
1、原本 uint32_t updatemode = 0; 我改成 uint32_t updatemode = 0xFF; (改完后函数就能正常运行了)
2、另一个方法,在整个函数中添加Delay_ms(500);
疑惑求解答:
这是51单片机的什么机制吗,还是说51keil也有什么优化等级
整个函数的逻辑也没没检查出啥问题,ai也没给出一个准确的解答。
// #define FREQ_MODEL0 0
// #define FREQ_MODEL1 1
// #define FREQ_MODEL2 2
// #define FREQ_MODEL3 3
void Read_Dial_State(void)
{
static uint32_t last_mode = 0; // 上一次模式
uint32_t updatemode = 0; //
/* 模式0:1KHz */
if(P03 && P04){
Delay_ms(20);
if(P03 && P04){
updatemode = g_FreqMode = FREQ_MODEL0;
}
}
/* 模式1:500Hz */
else if((!P03) && P04){
Delay_ms(20);
if((!P03) && P04){
updatemode = g_FreqMode = FREQ_MODEL1;
}
}
/* 模式2:250Hz */
else if(P03 && (!P04)){
Delay_ms(20);
if(P03 && (!P04)){
updatemode = g_FreqMode = FREQ_MODEL2;
}
}
/* 模式3:125Hz */
else if((!P03) && (!P04)){
Delay_ms(20);
if((!P03) && (!P04)){
updatemode = g_FreqMode = FREQ_MODEL3;
}
}
if(updatemode != last_mode){ //模式有变化才更新PWM
last_mode = updatemode;
PWM_FreqDuty_Update(g_FreqMode_Buffer[g_FreqMode], g_DutyVal);
}
}
