驅動程序:
//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循環)(二進制),由於計算機精度有限,會截取後面的一部分,由此造成誤差。