在学习freertos过程中,没有串口线,导致没有办法实践,随后将ili9341驱动,发现野火没有提供字符串格式输出,导致没有办法输出表格。遂自行编写一个简陋代码,能够将LCD屏幕当作打印输出。效果如下
本文实现ILI9341屏幕显示printf格式输出字符串(%s)的功能。
void wprintf(char* p, char* string)
{
uint16_t linenum=0;
uint8_t testCNT1 = 0;//计数器,防止超过屏幕显示
char dispBuffString[200]; //保存有限字符串
sprintf(dispBuffString,p,string);
linenum=LINE(testCNT1++);
ILI9341_DispStringLine_EN(&linenum,dispBuffString);
if(testCNT1>19)
{
testCNT1=0;
}
}
/**
* @brief 在 ILI9341 显示器上显示英文字符串
* @param line :在特定扫描方向下字符串的起始Y坐标
* 本参数可使用宏LINE(0)、LINE(1)等方式指定文字坐标,
* 宏LINE(x)会根据当前选择的字体来计算Y坐标值。
* 显示中文且使用LINE宏时,需要把英文字体设置成Font8x16
* @param pStr :要显示的英文字符串的首地址
* @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
* @retval 无
*/
void ILI9341_DispStringLine_EN ( uint16_t* line, char * pStr )
{
uint16_t usX = 0;
while ( * pStr != '\0' )
{
if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) > LCD_X_LENGTH )
{
usX = ILI9341_DispWindow_X_Star;
*line += LCD_Currentfonts->Height;
}
if ( ( *line - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) > LCD_Y_LENGTH )
{
usX = ILI9341_DispWindow_X_Star;
*line = ILI9341_DispWindow_Y_Star;
}
while(* pStr==' '||* pStr==0x09||* pStr==0x0D||* pStr==0x0A)
{
if(* pStr==' ')
{
usX += 4;
}
if(* pStr==0x09)
{
usX += (LCD_Currentfonts->Width)*2;
}
if(* pStr==0x0D)
{
usX = ILI9341_DispWindow_X_Star;
*line += LCD_Currentfonts->Height;
}
pStr ++;
}
if(* pStr != '\0')
{
ILI9341_DispChar_EN ( usX, *line, * pStr);
pStr ++;
usX += LCD_Currentfonts->Width;
}
}
}
若要实现滚动显示,将 uint8_t testCNT1 = 0;设置为全局变量即可。
注意要是字符串太大则需要修改dispBuffString,防止溢出。(懒的写判断了)
示例:
vTaskGetRunTimeStats( taskbuffer ); //获取freertos运行时间表格,也可以自己写字符串
wprintf("%s\r\n",taskbuffer);
做的不是特别好,注释也没有写见谅(懒),代码有待优化,例如水平制表符算法(tab)没有实现,指示增加多行空格。