STM32——oled显示字符串和数字

在上一篇的代码的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 待显示字符串首地址

逐行原理解析

  1. unsigned char j=0;定义下标变量,从字符串第一个字符开始遍历。
  2. while(chr[j] != '\0')C 语言字符串默认以\0作为结束标志,循环遍历直到读取到结束符,终止显示。
  3. OLED_ShowChar(x,y,chr[j]);调用底层单字符显示函数,逐个打印字符串内的字符。
  4. x+=8;项目使用8×16标准 ASCII 字体,单个字符横向占用 8 列像素,显示完一个字符横坐标右移 8 位。
  5. if(x>128)OLED12864 屏幕横向最大像素为 128,坐标超出屏幕边界时触发自动换行。
  6. x=0; y+=2;横坐标归零回到行首,8×16 字体纵向占用 2 个页面,换行纵坐标直接加 2。
  7. 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 次方拆分数字。

原理解析

  1. unsigned int result = 1;次方运算初始值固定为 1,避免初始值为 0 导致运算结果恒为 0。
  2. while(n--)循环执行 n 次次方相乘运算。
  3. 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 字体

核心核心逻辑拆解

  1. 数字拆分核心公式 temp = (num/oled_pow(10,len-t-1))%10;从高位到低位依次拆分数字每一位例:数字 567,位数 3 位t=0:拆分百位 5t=1:拆分十位 6t=2:拆分个位 7

  2. 前导零屏蔽功能 变量enshow为显示使能标志,默认关闭;当高位数字为 0 且不是最后一位数字时,用空格替代 0 隐藏无效前置零;遇到第一个非 0 数字后,开启显示标志,后续数字正常显示。

  3. 数字转 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 常见报错与问题解决

  1. 字符串显示乱码 原因:字符串形参char与无符号unsigned char类型不匹配解决:调用时强制转换(unsigned char *)"字符串"

  2. 数字显示出现多余 0原因:未开启前导零屏蔽逻辑,位数填写过大解决:严格按照数字实际位数填写 len 参数

  3. 字符重叠错位原因:字体坐标偏移值错误解决:8×16 字体固定横向偏移 8 列,换行纵向偏移 2 页,不可随意修改

  4. 编译提示未定义函数 解决:将三组函数完整写入oledr.c,头文件oledr.h补充对应函数声明

相关推荐
深圳市晨芯阳科技有限公司1 小时前
带延时功能的电压检测系列晨芯阳HC809
单片机·嵌入式硬件·电源芯片·深圳市晨芯阳科技有限公司
xiangw@GZ2 小时前
DDR2 / DDR3 / DDR4 颗粒信号差异对照表
单片机·嵌入式硬件
科芯创展2 小时前
1A,60VIN,1MHz,XZ4116,降压恒流LED驱动芯片 输入电压:5V-60V
stm32·单片机·嵌入式硬件
振浩微433射频芯片3 小时前
工业环境下的“硬核”选择:如何科学评估国产433芯片的可靠性?
网络·人工智能·科技·单片机·物联网·学习
天天爱吃肉82183 小时前
新能源汽车单级车载电源及高频高密度DCDC设计开发技术入门指南
大数据·人工智能·功能测试·嵌入式硬件·汽车
2zcode4 小时前
基于深度学习与STM32的野猪检测与预警系统
人工智能·stm32·深度学习·野猪检测
SKY -dada4 小时前
01--阴雨天逆变器频报“GFCI故障”?勿当简单跳闸!深度解析与排查指南
单片机·嵌入式硬件
jghhh014 小时前
STM32 上使用 SPI 总线驱动 OLED 的程序
stm32·单片机·嵌入式硬件
foundbug9995 小时前
STM32 + uIP协议栈实现TCP/UDP功能指南
stm32·tcp/ip·udp