Background
我正在使用基于8052的微控制器。我有一个LCD和编码器轮连接。 用户可以通过旋转和按下编码器滚轮来导航LCD上显示的菜单。
编码器轮的旋转是基于中断的。
编码器轮的旋转方向(encoder_turn
)在编码器中断内部设置。
我在循环中调用update_lcd()
。
新的响应式代码
void update_lcd()
{
//ENCODER TURN
switch(encoder_turn)
{
case RIGHT:
lcd_clear();
next_screen();
break;
case LEFT:
lcd_clear();
previous_screen();
break;
default:
break;
}
}
void next_screen()
{
if(current_test_screen < screen5)
{
current_test_screen++;
}
draw_current_test_screen();
}
void draw_current_test_screen()
{
switch(current_test_screen)
{
case screen1:
draw_screen1();
break;
case screen2:
draw_screen2();
break;
case screen3:
draw_screen3();
break;
case screen4:
draw_screen4();
break;
case screen5:
draw_screen5();
break;
default:
break;
}
}
旧的无响应代码
void update_lcd()
{
//ENCODER TURN
switch(encoder_turn)
{
case RIGHT:
lcd_clear();
next_screen();
break;
case LEFT:
lcd_clear();
previous_screen();
break;
default:
break;
}
switch(current_test_screen)
{
case screen1:
draw_screen1();
break;
case screen2:
draw_screen2();
break;
case screen3:
draw_screen3();
break;
case screen4:
draw_screen4();
break;
case screen5:
draw_screen5();
break;
default:
break;
}
}
void next_screen()
{
if(current_test_screen < screen5)
{
current_test_screen++;
}
}
问题
为什么一个响应式而另一个完全没用?
当我说响应式时,我指的是当我旋转编码器时,屏幕变化是响应式的。 这两种方法都"有效",但从使用的角度来看,其中一种方法是不可接受的。
这两段代码几乎是等价的,除了一个非常微妙的区别。
如果您尝试重构旧代码以尝试使其看起来更像新代码,您会发现旧代码会进行一次额外的函数调用。仔细看区别:
void update_lcd()
{
//ENCODER TURN
switch(encoder_turn)
{
case RIGHT:
lcd_clear();
next_screen();
break;
case LEFT:
lcd_clear();
previous_screen();
break;
default:
draw_current_test_screen(); // <--- your new code omits this call
break;
}
}
尝试获取新代码并添加该行,看看它是否会导致无响应问题。
只是一个猜测,但我怀疑:由于您唯一更改的是函数嵌套,因此优化器可能正在缓存encoder_turn
。您需要将encoder_turn
标记为易失性,因为中断可能随时发生并更改其值。