1

Я хочу отображать значение поплавка на ЖК-дисплее. У меня есть компилятор avr5.1 и использование функции snprintf для преобразования значения float в ASCII. Но он дает результат на Proteus «?».Как отобразить значение поплавка на ЖК-дисплее 16x2

Вот код, который я использую; Я также включают в себя библиотеку printf_flt:

temp1=ADCH; 
// FOR MEASURING VOLTAGE 
temp=(temp1*19.53)*2.51;     
LCD_goto(1,1);          
snprintf(buffer,6, "%2.2f", temp); 
lcd_data1(buffer); 
lcd_data1("mV"); 
percent=(temp-11500); 
LCD_goto(2,2); 
snprintf(buffer1,4, "%2.2f", percent); 
lcd_data1(" "); 
lcd_data1(buffer1); 
lcd_data1("%");  

Вот картина выхода:

output of my code

ответ

1

Многие инструменты разработки имеют несколько версий printf и связанных с ними функций, которые поддерживают различные уровни возможностей. Математический код с плавающей запятой является громоздким и сложным, поэтому включение функций, которые не используются, будет тратить много пространства кода.

Некоторые инструменты автоматически пытаются определить, какие параметры должны быть включены, но некоторые из них не очень хороши, а некоторые просто требуют, чтобы программист явно выбирал подходящую версию printf, используя аргументы командной строки, файлы конфигурации или другие подобные означает. Может потребоваться, чтобы компилятор включил версию связанных с printf функций, которая поддерживает спецификатор %f, или же использовать другие средства форматирования вывода. Мой собственный предпочтительный подход состоит в том, чтобы преобразовать значение в масштабированное целое число (например, 100x желаемое значение), а затем написать метод, который будет выводить цифры наименее значимые сначала и вставить период после вывода некоторого количества цифр. Что-то вроде:

uint32_t acc; 

uint8_t divMod10() 
{ 
    uint8_t result = acc % 10; 
    acc /= 10; 
} 

// output value in acc using 'digits' digits, with a decimal point shown after dp. 
// If dp is greater than 128, don't show decimal point or leading zeroes 
// If dp is less than 128 but greater than digits, show leading zeroes 
void out_number(uint8_t digits, uint8_t dp) 
{ 
    acc = num; 
    while(digits-- > 0) 
    { 
    uint8_t ch = divMod10(); 
    if (ch != 0 || (dp & 128) == 0) 
     out_lcd(ch + '0'); 
    else 
     out_lcd(ch); 
    if (--dp == 0) 
     out_lcd('.');  
    } 
} 

Поскольку ЖК-модулей может быть сконфигурирован для приема данных справа налево, вывод чисел в этой форме может быть полезным упрощение. Обратите внимание, что я очень редко использую любые функции «printf» на небольших микроконтроллерах, поскольку код, подобный выше, часто намного более компактен.