屏幕变参显示函数+类HTML网页元素标签的反色功能

在这里插入图片描述

常见的屏幕显示函数(固定参数)

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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值