常见的屏幕显示函数(固定参数)
Lcd_showString(startPixelX, startRowY, printBuf, fontSize );
进化成类似printf的变参
void Lcd_printf(int startPixelX, int startRowY, uint8_t fontSize, const char *format, …)
屏幕变参显示函数
void Lcd_printf(int startPixelX, int startRowY, uint8_t fontSize, const char *format, ...)
{
char printBuf[64]; // 临时缓冲区用于存储格式化后的字符串
va_list args;
va_start(args, format);
vsprintf(printBuf, format, args); // 将格式化字符串和参数列表写入缓冲区
va_end(args);
Lcd_showString(startPixelX, startRowY, printBuf, fontSize );
}
HTML元素标签+中英文自动识别
使用示例
Lcd_printf(0, 0, 16, "hello world: "); 包含内容反色
void Lcd_showString(int startPixelX, int startRowY, char *str, uint8_t fontSize)
{
int x = startPixelX;
int y = startRowY;
int charWidth = fontSize / 2;
bool isReverse = false;
for (size_t i = 0; i < strlen((const char *)str); ++i)
{
if (str[i] == '<' && str[i + 1] == 'r' && str[i + 2] == '>')
{
isReverse = true;
i += 2; // 跳过 '<r>'
continue;
}
else if (str[i] == '<' && str[i + 1] == '/' && str[i + 2] == 'r' && str[i + 3] == '>')
{
isReverse = false;
i += 3; // 跳过 '</r>'
continue;
}
if (is_chinese((uint8_t *)&str[i]))
{
Lcd_showChinese(x, y, &str[i++], isReverse);
x += charWidth; // 中文比英文宽1倍
}
else
{
Lcd_showChar(x, y, str[i], fontSize, isReverse);
}
x += charWidth; // 移动到下一个字符的位置
}
}
反色实现 if (isReverse) data = ~data;
void Lcd_showChar(int startPixelX, int startRowY, uint8_t chr, uint8_t fontSize, bool isReverse)
{
int i, j, x_len = fontSize / 2, y_len = fontSize;
chr = chr - ' ';
EXT_LCD_CS_PIN_SET(GPIO_PIN_RESET);
for (j = 0; j < (y_len + 4) / 8; j++)
{
lcd_address(startPixelX, 4 + startRowY++, x_len, y_len);
for (i = 0; i < x_len; i++)
{
uint8_t data;
if (fontSize == 16)
data = asc2_1608[chr][i + x_len * j];
else if (fontSize == 32)
data = asc2_3216[chr][i + x_len * j];
if (isReverse)
data = ~data; // 如果需要反色,则取反数据
Lcd_transfer_data(data);
}
}
EXT_LCD_CS_PIN_SET(GPIO_PIN_SET);
}