OLED显示小数驱动程序(基于stm32f103)

驱动程序:

//z_len为整数显示位数,f_len为小数显示位数,size2为字体大小
void OLED_Showdecimal(u8 x,u8 y,float num,u8 z_len,u8 f_len,u8 size2)
{         	
	u8 t,temp;
	u8 enshow;
	int z_temp,f_temp;      
	z_temp=(int)num;
	//整数部分
	for(t=0;t<z_len;t++)
	{
		temp=(z_temp/oled_pow(10,z_len-t-1))%10;
		if(enshow==0 && t<(z_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); 
	}
	//小数点
	OLED_ShowChar(x+(size2/2)*(z_len),y,'.',size2); 
	
	f_temp=(int)((num-z_temp)*(oled_pow(10,f_len)));
  //小数部分
	for(t=0;t<f_len;t++)
	{
		temp=(f_temp/oled_pow(10,f_len-t-1))%10;
		OLED_ShowChar(x+(size2/2)*(t+z_len)+5,y,temp+'0',size2); 
	}
}

运行主函数程序:

int main(void)
{	
	float vol_1=78.566;
	float vol_2=9.2;
	
	OLED_Init();
	OLED_On();
	OLED_Clear();

  while(1)
	{			
		OLED_Showdecimal(35,0,vol_1,2,3,16);    //显示函数
		OLED_Showdecimal(35,2,vol_2,1,2,16);
	}	
}

实验现象:

在这里插入图片描述
第二个小数显示有所偏差,这是因为计算器的精度有限,有一些十进制小数用二进制表示会出现无限循环,比如0.1(十进制)=0.00011001100…(以1100循环)(二进制),由于计算机精度有限,会截取后面的一部分,由此造成误差。

发布了5 篇原创文章 · 获赞 3 · 访问量 326

猜你喜欢

转载自blog.csdn.net/weixin_43368814/article/details/103073458