在上一篇的代码的oledr.c的基础上,再加入以下函数就可以实现
1 字符串显示函数 OLED_ShowString
函数源码
//显示字符串
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr)
{
unsigned char j=0;
while(chr[j] != '\0') //判断是不是最后一个字符
{
OLED_ShowChar(x,y,chr[j]); //显示字符
x+=8; //列数+8,一个字符占8
if(x>128)
{
x= 0;
y+=2;
}
j++;
}
}
函数形参说明
| 形参 | 作用 |
|---|---|
| x | 字符串起始横坐标 |
| y | 字符串起始纵坐标(页地址) |
| *chr | 待显示字符串首地址 |
逐行原理解析
unsigned char j=0;定义下标变量,从字符串第一个字符开始遍历。while(chr[j] != '\0')C 语言字符串默认以\0作为结束标志,循环遍历直到读取到结束符,终止显示。OLED_ShowChar(x,y,chr[j]);调用底层单字符显示函数,逐个打印字符串内的字符。x+=8;项目使用8×16标准 ASCII 字体,单个字符横向占用 8 列像素,显示完一个字符横坐标右移 8 位。if(x>128)OLED12864 屏幕横向最大像素为 128,坐标超出屏幕边界时触发自动换行。x=0; y+=2;横坐标归零回到行首,8×16 字体纵向占用 2 个页面,换行纵坐标直接加 2。j++;下标自增,读取字符串下一个字符。
调用示例
OLED_ShowString(10,1,"STM32 OLED"); //1行10列显示英文
OLED_ShowString(0,3,"TEST CODE"); //3行首列显示测试字符
2 次方运算函数 oled_pow
函数源码
//计算m的n次方
unsigned int oled_pow(unsigned char m,unsigned n)
{
unsigned int result = 1;
while(n--)
result *=m;
return result;
}
功能定位
专用工具函数,仅为数字显示函数服务,不单独用于屏幕显示,核心作用快速计算整数次方,多用于计算 10 的 N 次方拆分数字。
原理解析
unsigned int result = 1;次方运算初始值固定为 1,避免初始值为 0 导致运算结果恒为 0。while(n--)循环执行 n 次次方相乘运算。result *=m;循环内不断累乘底数 m,最终得出 m 的 n 次方结果。
运算示例
oled_pow(10,0) = 1
oled_pow(10,1) = 10
oled_pow(10,2) = 100
oled_pow(10,3) = 1000
3 数字显示函数 OLED_ShowNum
函数源码
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size)
{
unsigned char t,temp;
unsigned char enshow = 0;
for(t=0;t<len;t++)
{
temp = (num/oled_pow(10,len-t-1))%10; //取出输入数字的每个位,由高到低
if(enshow == 0 && t<(len - 1)) //判断是否为无效前导0
{
if(temp == 0) //如果该数为0
{
OLED_ShowChar(x+(size/2)*t,y,' '); //空格占位隐藏0
continue; //跳过剩下语句,避免重复显示
}else enshow=1; //遇到非0数字,开启正常显示
}
OLED_ShowChar(x+(size/2)*t,y,temp+'0'); //显示最后一个位
}
}
函数形参说明
| 形参 | 作用 |
|---|---|
| x、y | 数字起始显示坐标 |
| num | 需要显示的纯数字(无符号整型) |
| len | 固定显示数字总位数 |
| size | 字体大小,固定填 16 适配 8×16 字体 |
核心核心逻辑拆解
-
数字拆分核心公式
temp = (num/oled_pow(10,len-t-1))%10;从高位到低位依次拆分数字每一位例:数字 567,位数 3 位t=0:拆分百位 5t=1:拆分十位 6t=2:拆分个位 7 -
前导零屏蔽功能 变量
enshow为显示使能标志,默认关闭;当高位数字为 0 且不是最后一位数字时,用空格替代 0 隐藏无效前置零;遇到第一个非 0 数字后,开启显示标志,后续数字正常显示。 -
数字转 ASCII 字符
temp+'0':将纯数字数值转换为屏幕可识别的 ASCII 字符,是 OLED 显示数字的固定写法。
调用示例
OLED_ShowNum(20,2,2026,4,16); //显示4位数字2026
OLED_ShowNum(20,4,520,3,16); //显示3位数字520
4 函数组合实战用法(main.c)
int main(void)
{
OLED_Init(); //屏幕初始化
delay(1000);
OLED_Clear(); //清空屏幕
OLED_ShowString(0,0,"Project Code"); //显示字符串
OLED_ShowNum(0,2,20260519,8,16); //显示8位日期数字
while(1)
{
//主循环
}
}
5 常见报错与问题解决
-
字符串显示乱码 原因:字符串形参
char与无符号unsigned char类型不匹配解决:调用时强制转换(unsigned char *)"字符串" -
数字显示出现多余 0原因:未开启前导零屏蔽逻辑,位数填写过大解决:严格按照数字实际位数填写 len 参数
-
字符重叠错位原因:字体坐标偏移值错误解决:8×16 字体固定横向偏移 8 列,换行纵向偏移 2 页,不可随意修改
-
编译提示未定义函数 解决:将三组函数完整写入
oledr.c,头文件oledr.h补充对应函数声明