嵌入式C编程:正确清除LCD
Embedded C programming: Clearing LCD properly
我正在尝试为嵌入式板 (RX63N) 编写代码,我想在其中使用 LCD 和板载开关来实现以下功能:
按下开关时,程序应 "pause" 或 "unpause",具体取决于先前的状态,LCD 应在暂停时显示 "paused"。取消暂停时,LCD 应在 x 和 y 定义的位置显示自定义图形。它使用函数 Set_LCD_Char(N) 显示,其中 N 定义为来自位图图像的自定义图形。但在进行任何更改之前,我需要清除 LCD,这就是我苦苦挣扎的地方。在任何地方使用 lcd_clear() 函数时,LCD 都会保持空白(或几乎空白,即文本和图形非常微弱,就像不存在一样好)有人可以帮我吗?这是代码:
while (1)
{
// lcd_clear();
if(g_sw3_press == true){ //detect switch press
pause_flag = !pause_flag;
g_sw3_press = false; //reset switch
}
if (pause_flag){
RESET_ALL_LEDS();
jet_x = 0;
jet_y = 0;
Set_Font_Bitmap(); //changes from text mode to bitmap
Set_LCD_Pos(jet_x,jet_y);
Set_LCD_Char(3);
}
else if(!(pause_flag)){
ALL_RED_LEDS_ON();
Set_Font_8_by_8();
lcd_display(LCD_LINE1, " PAUSED ");
}
}
首先,像您所做的那样进行繁忙的轮询循环通常不是一个好主意。但我不能推荐任何具体的替代平台作为平台,OS(如果有的话)还没有提供(也许你的平台不支持事件)。
无论如何,不确定这是否是您需要的答案。但是既然你要了一个例子,而我不能有效地将代码放入评论中,下面就是我的意思。问题是您不断地写入和清除 LCD。所以实际上这两个操作是相互竞争的。所以解决这个问题的一种方法是只在状态改变时更新 LCD。
while (1)
{
if(g_sw3_press == true){ //detect switch press
pause_flag = !pause_flag;
g_sw3_press = false; //reset switch
} else {
/* No state change - nothing to do. Poll again. */
continue;
}
lcd_clear();
if (pause_flag){
RESET_ALL_LEDS();
jet_x = 0;
jet_y = 0;
Set_Font_Bitmap(); //changes from text mode to bitmap
Set_LCD_Pos(jet_x,jet_y);
Set_LCD_Char(3);
} else {
ALL_RED_LEDS_ON();
Set_Font_8_by_8();
lcd_display(LCD_LINE1, " PAUSED ");
}
}
我正在尝试为嵌入式板 (RX63N) 编写代码,我想在其中使用 LCD 和板载开关来实现以下功能: 按下开关时,程序应 "pause" 或 "unpause",具体取决于先前的状态,LCD 应在暂停时显示 "paused"。取消暂停时,LCD 应在 x 和 y 定义的位置显示自定义图形。它使用函数 Set_LCD_Char(N) 显示,其中 N 定义为来自位图图像的自定义图形。但在进行任何更改之前,我需要清除 LCD,这就是我苦苦挣扎的地方。在任何地方使用 lcd_clear() 函数时,LCD 都会保持空白(或几乎空白,即文本和图形非常微弱,就像不存在一样好)有人可以帮我吗?这是代码:
while (1)
{
// lcd_clear();
if(g_sw3_press == true){ //detect switch press
pause_flag = !pause_flag;
g_sw3_press = false; //reset switch
}
if (pause_flag){
RESET_ALL_LEDS();
jet_x = 0;
jet_y = 0;
Set_Font_Bitmap(); //changes from text mode to bitmap
Set_LCD_Pos(jet_x,jet_y);
Set_LCD_Char(3);
}
else if(!(pause_flag)){
ALL_RED_LEDS_ON();
Set_Font_8_by_8();
lcd_display(LCD_LINE1, " PAUSED ");
}
}
首先,像您所做的那样进行繁忙的轮询循环通常不是一个好主意。但我不能推荐任何具体的替代平台作为平台,OS(如果有的话)还没有提供(也许你的平台不支持事件)。
无论如何,不确定这是否是您需要的答案。但是既然你要了一个例子,而我不能有效地将代码放入评论中,下面就是我的意思。问题是您不断地写入和清除 LCD。所以实际上这两个操作是相互竞争的。所以解决这个问题的一种方法是只在状态改变时更新 LCD。
while (1)
{
if(g_sw3_press == true){ //detect switch press
pause_flag = !pause_flag;
g_sw3_press = false; //reset switch
} else {
/* No state change - nothing to do. Poll again. */
continue;
}
lcd_clear();
if (pause_flag){
RESET_ALL_LEDS();
jet_x = 0;
jet_y = 0;
Set_Font_Bitmap(); //changes from text mode to bitmap
Set_LCD_Pos(jet_x,jet_y);
Set_LCD_Char(3);
} else {
ALL_RED_LEDS_ON();
Set_Font_8_by_8();
lcd_display(LCD_LINE1, " PAUSED ");
}
}