关于0.96 OLED显示屏显示数字

在使用0.96 OLED显示屏的时候,我发现显示数字是一个大问题,特别是关于显示浮点型数据,自己折腾了一番,目前虽然浮点型显示上还有不小的问题,但可以满足最低级别的需求。
首先声明,本文中使用的程序是在 正点原子 ALIENTEK战舰STM32开发板V3 代码为基础进行的修改,感谢原子哥!
遗留的问题会在后面罗列,希望路过的大佬多多指教。

显示整型数据

先把原子哥的代码贴出来

//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);
void OLED_ShowNumber(u8 x,u8 y,u16 num,u8 len,u8 size2)
{
	u8 t,temp;
	u8 enshow=0;
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
	}
}

原子哥的代码是用来显示正的整型数据的,同时还需要输入整型数据的位数,个人比较懒,所以在原子哥代码的基础上做了一些更改,使得它可以 显示正负整数,同时不需要手动输入整型数据的位数 ,需要手动输入的数据更少,操作更方便。
话不多说,直接上代码

/*
描述:显示整数(可显示正负数)(-65535~65535)
输入:
	x:显示的x起始位置
	y:显示的y起始位置
	num:要显示的数字
	Char_Size:要显示数字的大小
*/
void OLED_ShowIntegerNumber(u8 x,u8 y,int num,u8 Char_Size)
{
	unsigned char len=0;
	int buf=num;
	while(buf)
	{
		len++;
		buf/=10;
	}
	if(num>0)
		OLED_ShowNumber(x,y,num,len,Char_Size);
	else
	{
		OLED_ShowChar(x,y,'-',Char_Size);
		num=abs(num);
		if(Char_Size==16)
			OLED_ShowNumber(x+8,y,num,len,Char_Size);
		else
			OLED_ShowNumber(x+6,y,num,len,Char_Size);
	}
}

上面我个人的代码和原子哥的代码合并(使用上面代码时,仍需要原子个哥的代码),由于我上面重复调用了三次原子哥的代码,如果合并到一起,虽然子函数少了一个,但代码占用空间会变大

显示浮点型数据

关于浮点型数据是真的很头疼,直接上自己的代码

/*
描述:显示浮点数(可显示正负数)(-65535~65535)
输入:
	x:显示的x起始位置
	y:显示的y起始位置
	num:要显示的数字
	Char_Size:要显示数字的大小
局限:目前只能显示确定范围的小数,且小数部分显示不准确
*/
void OLED_ShowFloatNumber(u8 x,u8 y,float num,u8 Char_Size)
{
	unsigned char zheng_len=0,xiao_len=0,polarity_flag=0;
	int zheng=0,xiao=0;		//经读者“迷迷惘惘”提醒,为这两行局部变量赋值
	//附注:为防止程序运行过程中程序行为异常,需要对局部变量赋值
	if(num>0)
		polarity_flag=1;
	else
	{
		polarity_flag=0;
		num=-num;
	}
	zheng=(int)num;
	xiao=((num-zheng)*100)/1;	//显示小数点后两位
	while(zheng)	//计算整数部分位数
	{
		zheng_len++;
		zheng/=10;
	}
	xiao_len=2;
	zheng=(int)num;	//在计算整数部分数值时,原赋值被篡改,这里重新赋值
	if(polarity_flag)
	{	
		if(Char_Size==16)
		{
			OLED_ShowNumber(x,y,zheng,zheng_len,Char_Size);
			OLED_ShowChar(x+zheng_len*8,y,'.',Char_Size);
			OLED_ShowNumber(x+(zheng_len+1)*8,y,xiao,xiao_len,Char_Size);
		}
		else
		{
			OLED_ShowNumber(x,y,zheng,zheng_len,Char_Size);
			OLED_ShowChar(x+zheng_len*6,y,'.',Char_Size);
			OLED_ShowNumber(x+(zheng_len+1)*6,y,xiao,xiao_len,Char_Size);
		}
	}
	else
	{
		OLED_ShowChar(x,y,'-',Char_Size);
		if(Char_Size==16)
		{
			OLED_ShowNumber(x+8,y,zheng,zheng_len,Char_Size);
			OLED_ShowChar(x+(zheng_len+1)*8,y,'.',Char_Size);
			OLED_ShowNumber(x+(zheng_len+2)*8,y,xiao,xiao_len,Char_Size);
		}
		else
		{
			OLED_ShowNumber(x+6,y,zheng,zheng_len,Char_Size);
			OLED_ShowChar(x+(zheng_len+1)*6,y,'.',Char_Size);
			OLED_ShowNumber(x+(zheng_len+2)*6,y,xiao,xiao_len,Char_Size);
		}
	}
}

浮点型数据的显示思路是把浮点型数据分离成整数部分和小数部分的整数形式,但是在实际操作过程中,好像是因为 float类型 自身的数值显示问题,很多时候会对小数点后的数据带来误差

困惑 和 遗留问题(浮点型数据显示)

1.浮点型数据显示时只能显示小数点后的固定几位,虽然可以在程序里更改选定显示的具体位数,但很不舒服
2.浮点型数据在输入时,小数部分总会出现一些偏差,如:
在使用 stm32c8t6 进行硬件仿真的时候,实际代码为float a;a=63.2;但仿真时,在对数据进行赋值时,a的数据值被赋值为63.2000008,这就给上面代码的输入带来问题,影响最终显示。

  • 26
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
根据提供的引用内容,可以看出这段代码是用于控制Arduino连接0.96寸OLED显示屏的程序。该程序使用了Adafruit_SSD1306库来控制OLED显示屏的初始化和显示内容。在函数`oled_play`中,根据传入的参数`s`的不同,显示不同的文字内容,比如"Forward"、"Backward"、"Turn left"、"Turn right"和"Stop"。\[1\] 然而,根据提供的引用内容,没有直接提到如何在OLED显示屏显示中文字符。因此,需要进一步查找相关资料或者参考其他资源来实现在OLED显示屏显示中文字符。 #### 引用[.reference_title] - *1* [Arduino使用0.96OLED显示运行小车状态(C语言函数传参调用)](https://blog.csdn.net/weixin_53863236/article/details/124725446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [第二篇、基于Arduino uno,用oled0.96寸屏幕显示数字和字符——结果导向](https://blog.csdn.net/qq_55490300/article/details/130777356)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值