潘多拉開發(fā)板有個小屏幕,并且提供了屏幕的驅(qū)動,所以我一直想著把這個屏幕用起來,最后把tshell輸出到串口的內(nèi)容最終也輸出到屏幕上 最終成果如下
實現(xiàn)的過程如下
1.使能lcd
即打開 Enalbe LCD ,下面的Enalbe LCD_console 是我自己加的
2.測試lcd屏幕
在打開后lcd后,rt-studio 會提供一個 樣例讓你輸出(自動添加到applitcations 下面),測試一下lcd是否可以正常使用
3.實現(xiàn)的思路
我這邊有兩種思路
1.在rt_kprintf 中串口中的內(nèi)容輸出后,再輸出到屏幕上
2.由第一種思路擴(kuò)展,rt-thread中提供串口的接受和發(fā)送的回調(diào)函數(shù),我們設(shè)置rt_kprintf使用串口的發(fā)送回調(diào)函數(shù),在發(fā)送數(shù)據(jù)后,將數(shù)據(jù)打印在屏幕上
最終我選擇了第一個方案,因為潘多拉串口沒有實現(xiàn)發(fā)送的回調(diào)函數(shù),以下是具體實現(xiàn)
3.1首先在 rtthread/src/kservice.c 中的rt_kprintf中添加如下
#ifdef BSP_USING_LCD_CONSOLE
if(lcd_show_flag){
shell_show_lcd(rt_log_buf);
}
#endif
其中#ifdef BSP_USING_LCD_CONSOLE 是我添加的lcd控制,lcd_show_flag 為1時,調(diào)用shell_show_lcd,這個函數(shù)會將串口發(fā)送的內(nèi)容打印到屏幕上,為什么有了BSP_USING_LCD_CONSOLE ,還要加個lcd_show_flag來控制呢?因為在開始rt_kprintf第一次被調(diào)用的時候,spi還沒有被初始化,直接調(diào)用會導(dǎo)致報錯,所以我在main中定義lcd_show_flag,并且調(diào)用main運(yùn)行后,將lcd_show_flag置1。
3.2實現(xiàn)調(diào)用shell_show_lcd
#ifdef BSP_USING_LCD_CONSOLE
int lcd_x = LCD_START,lcd_y = LCD_START,size_font=16;
void shell_show_lcd(char *rt_log_buf){
char str[2] ={0};
if(rt_strcmp(rt_log_buf, "x1b[2Jx1b[H")==0){
lcd_x = LCD_START,lcd_y = LCD_START;
lcd_clear(WHITE);
return ;
}
while(*rt_log_buf){
str[0] = *rt_log_buf;
//handle 'n'
if(str[0] == 'n'){
lcd_y = lcd_y + size_font - 1;
lcd_x = LCD_START;
rt_log_buf++;
//clear next line
if (lcd_y + size_font < LCD_H - size_font)
{
lcd_show_string(0, lcd_y + size_font , size_font, " ");
}
continue;
}
//handle 'r'
if(str[0] == 'r'){
lcd_x = LCD_START;
rt_log_buf++;
continue;
}
//hand del and backspace
if (str[0] == 0x7f || str[0] == 0x08){
lcd_x = lcd_x - (size_font/2 - 1);
if (lcd_x < LCD_START)
{
lcd_x = LCD_W - size_font / 2;
lcd_y -= size_font;
}
lcd_show_string(lcd_x, lcd_y , size_font, " ");
rt_log_buf++;
continue;
}
if (lcd_x > LCD_W - size_font / 2)
{
lcd_x =LCD_START;
lcd_y += size_font;
}
if (lcd_y > LCD_H - size_font)
{
lcd_y = lcd_x = LCD_START;
lcd_show_string(0, 0 , size_font, " ");
}
lcd_show_string(lcd_x, lcd_y , size_font, str);
lcd_x = lcd_x + size_font/2 - 1;
rt_log_buf++;
}
}
#endif
不到一百行代碼,非常簡單,我們逐步看一下
首先我們看最重要的一個函數(shù)
lcd_show_string,這個官方提供的,其函數(shù)原型如下
x y 是你要輸出的位置,size是字符的大小,fmt則是要輸出的字符,其中size時限定16 24 32 的,其他的尺寸會報錯
第2行 定義 x,y,以及字體大小font
第7-11行 處理clear指令,clear指令發(fā)送后,會輸出”x1b[2Jx1b[H”,我們在讀到這串代碼將屏幕清空,并將xy置0
第16-27行,處理n,主要在處理完n后我清空了下一行,主要時屏幕太小,很容易擠滿,看不清輸出到哪里了
第30-34行,處理 r ,清楚當(dāng)前行,重置x
第36-44行,處理 del 和 backspace ,計算回退的位置,并且用空格來填充
第52-61行,判斷下一個字符是否會超過xy的邊界值
第63-65行,輸出字符,將x自增,并且繼續(xù)處理下一個字符
-
LCD屏
+關(guān)注
關(guān)注
0文章
122瀏覽量
15368 -
Shell
+關(guān)注
關(guān)注
1文章
363瀏覽量
23257 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11528 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39837
發(fā)布評論請先 登錄
相關(guān)推薦
評論