潘多拉開發(fā)板有個(gè)小屏幕,并且提供了屏幕的驅(qū)動(dòng),所以我一直想著把這個(gè)屏幕用起來,最后把tshell輸出到串口的內(nèi)容最終也輸出到屏幕上 最終成果如下
實(shí)現(xiàn)的過程如下
1.使能lcd
即打開 Enalbe LCD ,下面的Enalbe LCD_console 是我自己加的
2.測試lcd屏幕
在打開后lcd后,rt-studio 會(huì)提供一個(gè) 樣例讓你輸出(自動(dòng)添加到applitcations 下面),測試一下lcd是否可以正常使用
3.實(shí)現(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ù)打印在屏幕上
最終我選擇了第一個(gè)方案,因?yàn)榕硕嗬跊]有實(shí)現(xiàn)發(fā)送的回調(diào)函數(shù),以下是具體實(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時(shí),調(diào)用shell_show_lcd,這個(gè)函數(shù)會(huì)將串口發(fā)送的內(nèi)容打印到屏幕上,為什么有了BSP_USING_LCD_CONSOLE ,還要加個(gè)lcd_show_flag來控制呢?因?yàn)樵陂_始rt_kprintf第一次被調(diào)用的時(shí)候,spi還沒有被初始化,直接調(diào)用會(huì)導(dǎo)致報(bào)錯(cuò),所以我在main中定義lcd_show_flag,并且調(diào)用main運(yùn)行后,將lcd_show_flag置1。
3.2實(shí)現(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
不到一百行代碼,非常簡單,我們逐步看一下
首先我們看最重要的一個(gè)函數(shù)
lcd_show_string,這個(gè)官方提供的,其函數(shù)原型如下
x y 是你要輸出的位置,size是字符的大小,fmt則是要輸出的字符,其中size時(shí)限定16 24 32 的,其他的尺寸會(huì)報(bào)錯(cuò)
第2行 定義 x,y,以及字體大小font
第7-11行 處理clear指令,clear指令發(fā)送后,會(huì)輸出”x1b[2Jx1b[H”,我們在讀到這串代碼將屏幕清空,并將xy置0
第16-27行,處理n,主要在處理完n后我清空了下一行,主要時(shí)屏幕太小,很容易擠滿,看不清輸出到哪里了
第30-34行,處理 r ,清楚當(dāng)前行,重置x
第36-44行,處理 del 和 backspace ,計(jì)算回退的位置,并且用空格來填充
第52-61行,判斷下一個(gè)字符是否會(huì)超過xy的邊界值
第63-65行,輸出字符,將x自增,并且繼續(xù)處理下一個(gè)字符
-
LCD屏
+關(guān)注
關(guān)注
0文章
122瀏覽量
15526 -
Shell
+關(guān)注
關(guān)注
1文章
366瀏覽量
23469 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11626 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40415
發(fā)布評論請先 登錄
相關(guān)推薦
正點(diǎn)原子潘多拉開發(fā)板免費(fèi)試用
如何在RT-Thread潘多拉開發(fā)板上實(shí)現(xiàn)電源管理?
如何在潘多拉開發(fā)板上運(yùn)行Modbus主機(jī)與從機(jī)?
怎樣去解決潘多拉開發(fā)板SFUD初始化失敗的問題
快速上手STM32L475潘多拉開發(fā)板BSP的方法
用rtt studio的模板下載到潘多拉開發(fā)板之后開發(fā)板就黑屏了,如何讓屏幕變亮?
潘多拉開發(fā)板+RT-Thread Studio芯片沒有反應(yīng)如何處理?
潘多拉開發(fā)板+RT-Thread Studio選擇按芯片創(chuàng)建無反應(yīng)請問這是什么原因呢
有沒有其他方法在潘多拉開發(fā)板上能夠?qū)崿F(xiàn)網(wǎng)絡(luò)播放功能
有沒有其他方法在潘多拉開發(fā)板上能夠?qū)崿F(xiàn)網(wǎng)絡(luò)播放功能呢
基于潘多拉開發(fā)板的tshell串口輸出內(nèi)容
STM32CubeMX使用-1.點(diǎn)個(gè)燈(正點(diǎn)原子潘多拉開發(fā)板)
![STM32CubeMX使用-1.點(diǎn)個(gè)燈(正點(diǎn)原子<b class='flag-5'>潘多拉開發(fā)板</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
潘多拉開發(fā)板SFUD初始化失敗問題[SFUD] Error W25Q128 flash device is initialize fail
![<b class='flag-5'>潘多拉開發(fā)板</b>SFUD初始化失敗問題[SFUD] Error W25Q128 flash device is initialize fail](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
rt-studio潘多拉開發(fā)板最新rt-thread不能運(yùn)行解決辦法
![rt-studio<b class='flag-5'>潘多拉開發(fā)板</b>最新rt-thread不能運(yùn)行解決辦法](https://file1.elecfans.com/web2/M00/A8/50/wKgaomUs3NeARitmAABYZRpNG6w033.jpg)
評論