OLED使用printf格式化打印和显示汉字

OLED使用printf格式化打印

底层使用 显示字符串函数

/**
  * 函    数:OLED格式化打印函数
  * 参    数:x 字符显示列
  * 参    数:y 字符显示行
  * 参    数:FontSize 显示字符的字体
  * 参    数:format 显示的字符串
  * 参    数:... 变参·
  * 返 回 值:无
  */
void OledPrintf(uint8_t x,uint8_t y,uint8_t FontSize,char *format,...){
    char str[30] = {0};
    va_list ap;					//使用ap保存变参变量
    va_start(ap,format);		//获取变参列表
    vsprintf(str,format,ap);	//将变参写入到格式化字符串中
    va_end(ap);					//释放变参结构体
    OledShowStr(x,y,str,FontSize);
}

OLED显示汉字

创建汉字结构体

汉字结构体 由索引和数据量部分组成 ,索引的长度和编码格式有关。UTF-8编码下一个汉字占三个字节,GBK编码下占两个。

#define OLED_CHN_CHAR_WIDTH	(3)

typedef struct{
	char index[OLED_CHN_CHAR_WIDTH+1];	//汉字索引
	uint8_t Data[32];					//汉字对应的字模数据
}ChineseCell_t;

在字模软件中获取对应汉字的数据

在这里插入图片描述

生成字模索引数组

const ChineseCell_t OLED_CF16X16[] = {
    
    "你",
    0x00,0xC0,0x60,0xF8,0x06,0x42,0x60,0x1C,0x1E,0xD8,0xD8,0x18,0x58,0x78,0x18,0x00,
    0x00,0x00,0x00,0x7F,0x00,0x18,0x0C,0x07,0x42,0x7F,0x7F,0x00,0x03,0x0E,0x18,0x00,
    
    "好",
    0x00,0x20,0xA0,0x7C,0x26,0xA0,0xE0,0x00,0x0C,0x0C,0x0C,0xEC,0x1C,0x1C,0x0C,0x00,
    0x00,0x42,0x23,0x14,0x0C,0x1F,0x30,0x01,0x01,0x41,0x41,0x7F,0x01,0x01,0x01,0x00,
    
    "世",
    0x00,0x40,0x40,0xFC,0x40,0x40,0xFE,0xFE,0x40,0x40,0xFE,0xFE,0x40,0x40,0x40,0x00,
    0x00,0x00,0x00,0x7F,0x40,0x40,0x4F,0x4F,0x4C,0x4C,0x4F,0x4F,0x40,0x40,0x00,0x00,
    
    "界",
    0x00,0x00,0x7E,0x7E,0x52,0x52,0x52,0xFE,0xFE,0x52,0x52,0x52,0x7E,0x00,0x00,0x00,
    0x00,0x04,0x04,0xC4,0x62,0x1E,0x01,0x01,0x01,0x02,0xFE,0x06,0x04,0x04,0x0C,0x00,
    
	"",
	0xFF,0x01,0x01,0x01,0x31,0x09,0x09,0x09,0x09,0x89,0x71,0x01,0x01,0x01,0x01,0xFF,
	0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x96,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,
};

显示汉字


/**
  * 函    数:OLED显示中文
  * 参    数:x 字符显示列
  * 参    数:y 字符显示行
  * 参    数:chinese 显示中文
  */
void OledShowChinese(uint8_t x,uint8_t y,char *chinese){
	uint8_t pchinese = 0;
	uint8_t pindex;

	char singlechinese[OLED_CHN_CHAR_WIDTH+1] = {0};
	for(uint8_t i = 0; chinese[i] != '\0'; i++){
		singlechinese[pchinese] = chinese[i];
		pchinese++;
	
		if(pchinese >= OLED_CHN_CHAR_WIDTH){
			pchinese = 0;
			for(pindex = 0;strcmp(OLED_CF16X16[pindex].index,"") != 0;pindex++){
				if(strcmp(OLED_CF16X16[pindex].index,singlechinese) == 0){
					break;
				}
			}
			OledShowImage(x+((i+1)/OLED_CHN_CHAR_WIDTH-1)*16,y,16,16,OLED_CF16X16[pindex].Data);	
		}

	}
}

结果展示

在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛霸霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值