2016-12-10 6 views
0

저는 MCU ATMega16과 디지털 전압계를 사용하고 있습니다. LCD 디스플레이에 10 진수를 표시하고 싶습니다.AtmelStudio ADC 출력 십진수 값

#include <avr/io.h> 
#include <util/delay.h> 
#include "lcd.h" 
#include <stdlib.h> 

    signed int temp = 0; 
    double voltage = 0; 
    char buffer[10]; 

int main(void) 
{ 
    DDRD = 0b11111111; 
    PORTD = 0b00000000; 
    DDRB = 0b00001111; 
    PORTB = 0b00000000; 

    ADMUX = (0<<REFS1)|(1<<REFS0); 
    ADCSRA |= (1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); 

    lcd_init(LCD_DISP_ON_CURSOR); 
    _delay_ms(100); 
    lcd_clrscr(); 
    lcd_home(); 
    lcd_puts("Voltage= "); 

    while (1) 
    { 
     ADCSRA |= (1<<ADSC); 
     while(ADCSRA & (1<<ADSC)); 
     ADCSRA |= (1<<ADIF); 
     temp = ADCW; 

     if(temp <= 0) 
     { 
      lcd_gotoxy(8, 0); 
      lcd_puts("Null"); 
      _delay_ms(100); 
     } 
     else 
     { 
      voltage = (5.0 * temp * 5)/1023; 

      lcd_gotoxy(8, 0); 
      sprintf(buffer, "%f", voltage); 
      lcd_puts(buffer); 
      _delay_ms(100); 
     } 
} 
} 

이 .. 그리고 작동 : 이 내 코드입니다. 12.3 볼트로 배터리를 측정하면 LCD 값이 12.31671에 표시됩니다. 하지만, 프로젝트 설정을 "sprintf"함수로 변경했기 때문에 programm에 10 진수가 표시됩니다. LCD 디스플레이에 10 진수를 수동으로 어떻게 표시합니까? 도와주세요. 나는 그것을 만드는 방법을 이해할 수 없다. 나는 프로젝트 설정을 기본값으로 되돌리고 "spoaf"대신 "itoa"를 사용하면 programm에 숫자 12가 표시됩니다. 장래에 7 세그먼트 디스플레이에 값을 표시하고자하므로 필요합니다.

+0

int를 double 대신 전압으로 사용하거나 십진수 만 사용하려면 int로 변환하십시오. – koper89

+0

** [ "Arduino sprintf float not formatting"] (http://stackoverflow.com/a/27652012/6945651) **에 대한 답변을 살펴보십시오. 유용한 함수'dtostrf()'가 문제를 해결해야합니다. –

답변

0

전압을 정수로 선언하면 문제가 해결됩니다.