潘多拉開發板有個小屏幕,并且提供了屏幕的驅動,所以我一直想著把這個屏幕用起來,最后把tshell輸出到串口的內容最終也輸出到屏幕上 最終成果如下
實現的過程如下
1.使能lcd
即打開 Enalbe LCD ,下面的Enalbe LCD_console 是我自己加的
2.測試lcd屏幕
在打開后lcd后,rt-studio 會提供一個 樣例讓你輸出(自動添加到applitcations 下面),測試一下lcd是否可以正常使用
3.實現的思路
我這邊有兩種思路
1.在rt_kprintf 中串口中的內容輸出后,再輸出到屏幕上
2.由第一種思路擴展,rt-thread中提供串口的接受和發送的回調函數,我們設置rt_kprintf使用串口的發送回調函數,在發送數據后,將數據打印在屏幕上
最終我選擇了第一個方案,因為潘多拉串口沒有實現發送的回調函數,以下是具體實現
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時,調用shell_show_lcd,這個函數會將串口發送的內容打印到屏幕上,為什么有了BSP_USING_LCD_CONSOLE ,還要加個lcd_show_flag來控制呢?因為在開始rt_kprintf第一次被調用的時候,spi還沒有被初始化,直接調用會導致報錯,所以我在main中定義lcd_show_flag,并且調用main運行后,將lcd_show_flag置1。
3.2實現調用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
不到一百行代碼,非常簡單,我們逐步看一下
首先我們看最重要的一個函數
lcd_show_string,這個官方提供的,其函數原型如下
x y 是你要輸出的位置,size是字符的大小,fmt則是要輸出的字符,其中size時限定16 24 32 的,其他的尺寸會報錯
第2行 定義 x,y,以及字體大小font
第7-11行 處理clear指令,clear指令發送后,會輸出”x1b[2Jx1b[H”,我們在讀到這串代碼將屏幕清空,并將xy置0
第16-27行,處理n,主要在處理完n后我清空了下一行,主要時屏幕太小,很容易擠滿,看不清輸出到哪里了
第30-34行,處理 r ,清楚當前行,重置x
第36-44行,處理 del 和 backspace ,計算回退的位置,并且用空格來填充
第52-61行,判斷下一個字符是否會超過xy的邊界值
第63-65行,輸出字符,將x自增,并且繼續處理下一個字符
-
LCD屏
+關注
關注
0文章
126瀏覽量
15986 -
Shell
+關注
關注
1文章
372瀏覽量
24148 -
回調函數
+關注
關注
0文章
88瀏覽量
11869 -
RT-Thread
+關注
關注
32文章
1395瀏覽量
41734
發布評論請先 登錄
正點原子潘多拉開發板免費試用
如何在潘多拉開發板上運行Modbus主機與從機?
快速上手STM32L475潘多拉開發板BSP的方法
用rtt studio的模板下載到潘多拉開發板之后開發板就黑屏了,如何讓屏幕變亮?
潘多拉開發板+RT-Thread Studio芯片沒有反應如何處理?
潘多拉開發板+RT-Thread Studio選擇按芯片創建無反應請問這是什么原因呢
有沒有其他方法在潘多拉開發板上能夠實現網絡播放功能
有沒有其他方法在潘多拉開發板上能夠實現網絡播放功能呢
基于潘多拉開發板的tshell串口輸出內容
潘多拉開發板SFUD初始化失敗問題[SFUD] Error W25Q128 flash device is initialize fail
![<b class='flag-5'>潘多拉開發板</b>SFUD初始化失敗問題[SFUD] Error W25Q128 flash device is initialize fail](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論