LCD浮点数显示函数的探讨

本文介绍在STM32单片机上显示浮点数的两种方法:一种是通过自定义函数逐位分离整数与小数部分并显示;另一种是利用C语言sprintf函数将浮点数转化为字符串后显示。

单片机开放附赠的学习资料里面很少见到显示浮点数的函数,显示浮点数的操作也相当烦坠!

一般转换显示法

拿STM32单片机资源,我们选取ADC采样部分函数来看显示过程

adcx=Get_Adc_Average(ADC_Channel_5,20);
LCD_ShowxNum(134,130,adcx,4,16,0);   
temp=(float)adcx*(3.3/4096);          
adcx=temp;                          
LCD_ShowxNum(134,150,adcx,1,16,0);    
temp-=adcx;                         
temp*=1000;                           
LCD_ShowxNum(150,150,temp,3,16,0X80); 
LED0=!LED0;
delay_ms(250);  

分别取出整数部分和小数部分,分别显示出来

调整改进

void OLED_ShowFloatNum(u8 x,u8 y,double num,u8 len,u8 size)
{ 
u32 interger=(u32)num;
u32 fractional=(u32)((num-interger)*1000);
u32 x_tmp;
if(num<0)
{
    OLED_ShowString(x,y,"Minus!",16);
}       
else
{
    if(interger>=100)
    {
            x_tmp=x;
            OLED_ShowNum(x,y,interger,3,size);
    }
    else if(interger>=10&&interger<=99)
    {
        x_tmp=x-8;
        OLED_ShowNum(x,y,interger,2,size);
    }
    else if(interger>=1&&interger<=9)
    {
        x_tmp=x-16;
        OLED_ShowNum(x,y,interger,1,size);
    }
    else
    {
        x_tmp=x-16;
        OLED_ShowNum(x,y,0,1,size);
    }

    OLED_ShowChar(x_tmp+24,y,'.',size,1);

    if(fractional>=100)
        OLED_ShowNum(x_tmp+32,y,fractional,3,size);
    else if(fractional>=10&&fractional<=99)
    {
        OLED_ShowNum(x_tmp+40,y,fractional,2,size);
        OLED_ShowChar(x_tmp+32,y,'0',size,1);
    }
    else if(fractional>=1&&fractional<=9)
    {
        OLED_ShowNum(x_tmp+48,y,fractional,1,size);
        OLED_ShowChar(x_tmp+40,y,'0',size,1);
        OLED_ShowChar(x_tmp+32,y,'0',size,1);   
    }
    else
    {
        OLED_ShowChar(x_tmp+32,y,'0',size,1);
        OLED_ShowChar(x_tmp+40,y,'0',size,1);
        OLED_ShowChar(x_tmp+48,y,'0',size,1);
    }
}
} 

另一种直接调用c语言函数sprintf

定义buffer,这里注意添加头文件#include“stdio.h”

 adcx=Get_Adc_Average(ADC_Channel_0,10);
 temp=(float)adcx*(3.3/4096);
 sprintf(buffer,"%5.2f",temp);//浮点型数据转为指定格式的字符串
 LCD_ShowString(152,150,200,16,16,buffer); //直接送字符显示函数
关于 OLED 显示浮点数,一般可以通过将浮点数转换为字符数组,然后将字符数组显示在 OLED 屏幕上来实现。具体实现方法可以参考下面的代码: ```C #include <stdio.h> #include <stdlib.h> #include <string.h> // OLED 显示 void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t Char_Size) { uint8_t c = 0,i = 0,j = 0; switch(Char_Size) { case 16: { while (chr[j]!='\0') { c = chr[j]-32; if(x>112){x=0;y+=16;} OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+8); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); x+=8; j++; } } break; case 12: { while (chr[j]!='\0') { c = chr[j]-32; if(x>116){x=0;y+=12;} OLED_Set_Pos(x,y); for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c][i],OLED_DATA); x+=6; j++; } } break; } } // 浮点数转换为字符数组 void FloatToStr(float f, char *str) { int i = 0; int integer = (int)f; // 取整数部分 float decimal = f - integer; // 取小数部分 if (integer < 0) // 处理负数 { integer = -integer; decimal = -decimal; str[i++] = '-'; } // 转换整数部分 if (integer == 0) { str[i++] = '0'; } else { while (integer > 0) { str[i++] = integer % 10 + '0'; integer /= 10; } } // 转换小数部分 str[i++] = '.'; decimal = decimal * 1000000; integer = (int)decimal; if (integer == 0) { str[i++] = '0'; } else { while (integer > 0) { str[i++] = integer % 10 + '0'; integer /= 10; } } str[i] = '\0'; // 反转字符数组 for (int j = 0; j < i / 2; j++) { char temp = str[j]; str[j] = str[i - j - 1]; str[i - j - 1] = temp; } } // 测试函数 void test() { float f = 3.1415926; char str[20]; FloatToStr(f, str); OLED_ShowString(0, 0, (uint8_t *)str, 16); } int main() { test(); return 0; } ``` 在上面的代码中,`FloatToStr()` 函数浮点数转换为字符数组,`OLED_ShowString()` 函数将字符数组显示在 OLED 屏幕上。具体的显示方法可以根据自己的 OLED 屏幕型号和驱动芯片进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值