hfi*_*ter 3 c embedded interrupt
背景
我正在使用基于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;
}
}
Run Code Online (Sandbox Code Playgroud)
旧的反应迟钝的代码
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
问题
为什么一个响应而另一个完全没用?
当我说响应时,我指的是当我旋转编码器时,屏幕变化是响应的.这两种方法都"有效",但从使用的角度来看,这是不可接受的.
除了一个非常微妙的区别之外,这两段代码几乎是等价的.
如果您尝试重构旧代码以使其看起来更像您的新代码,您会发现旧代码会进行一次额外的函数调用.仔细看看差异:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用新代码并添加该行,看看是否会导致无响应问题.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |