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);
}
}
}