Witam,
Mam pewien problem z oprogramowaniem mikrokontrolera Atmega8. Otóż:
Chcę zrobić menu składające się z 4 ekranów. Przewijanie ekranu odbywa się z wykorzystaniem dwóch przycisków > góra <dół.
Podczas wyświetlenia ekranów chciałbym aby na wyświetlaczu LCD pojawiały się aktualne nastawy (wartości zmiennych). Cały problem tkwi w konwersji zmiennych liczbowych double, bądź int na łańcuch znaków char. Przy kompilacji nie pojawiają się żadne problemy, natomiast podczas pojawienia się ekranu na którym ma zostać wyświetlona wartość zmiennej oprócz rzeczywistej wartości pojawia się ciąg ok 4 cyfr, bądź czasem znaków (np. @) i program jakby się zawieszał - nie ma możliwości przejścia do następnego ekranu. Sytuacja ta jest taka sama dla wszystkich zmiennych. Dodam tylko, że wykorzystuję plik nagłówkowy obsługi ekranu HD44780.h.
Poniżej zamieszczam kod (bez procedur inicjalizacji wyświetlacza)
Będę wdzięczny również za inne spostrzeżenia.
Pozdrawiam.
Mam pewien problem z oprogramowaniem mikrokontrolera Atmega8. Otóż:
Chcę zrobić menu składające się z 4 ekranów. Przewijanie ekranu odbywa się z wykorzystaniem dwóch przycisków > góra <dół.
Podczas wyświetlenia ekranów chciałbym aby na wyświetlaczu LCD pojawiały się aktualne nastawy (wartości zmiennych). Cały problem tkwi w konwersji zmiennych liczbowych double, bądź int na łańcuch znaków char. Przy kompilacji nie pojawiają się żadne problemy, natomiast podczas pojawienia się ekranu na którym ma zostać wyświetlona wartość zmiennej oprócz rzeczywistej wartości pojawia się ciąg ok 4 cyfr, bądź czasem znaków (np. @) i program jakby się zawieszał - nie ma możliwości przejścia do następnego ekranu. Sytuacja ta jest taka sama dla wszystkich zmiennych. Dodam tylko, że wykorzystuję plik nagłówkowy obsługi ekranu HD44780.h.
Poniżej zamieszczam kod (bez procedur inicjalizacji wyświetlacza)
#ifndef F_CPU
#define F_CPU 1000000UL
#endif
volatile int i=0;
double T_MAX=15;
double CZAS_POD_ON=20;
double CZAS_POD_OFF=20;
double CZAS_CZEK_ON=20;
double CZAS_CZEK_OFF=20;
unsigned char na_tekst(double liczba)
{
char bufor;
dtostrf(liczba, 5,4,bufor);
return bufor;
}
void ekran_menu(int j)
{
switch (j)
{
case 0:
{
LCD_Clear();
LCD_WriteText("Temp. MAX.");
LCD_GoTo(0,1);
LCD_WriteText(na_tekst(T_MAX));
break;
}
case 1:
{
LCD_Clear();
LCD_WriteText("Czas POD ON:");
LCD_GoTo(0,1);
LCD_WriteText(na_tekst(CZAS_POD_ON));
break;
}
case 2:
{
LCD_Clear();
LCD_WriteText("Czas CZEK ON:");
LCD_GoTo(0,1);
LCD_WriteText("Wartosc:3");
break;
}
case 3:
{
LCD_Clear();
LCD_WriteText("Czas POD OFF:");
LCD_GoTo(0,1);
LCD_WriteText("Wartosc:4");
break;
}
case 4:
{
LCD_Clear();
LCD_WriteText("Czas CZEK OFF:");
LCD_GoTo(0,1);
LCD_WriteText("Wartosc:5");
break;
}
}
}
int main(void)
{
DDRC=0x30;
PORTC=0xff;
LCD_Initalize();
ekran_menu(0);
while (1)
{
// PRZYCISK NR 1 ====================================================OBSŁUGA MENU===================
if(bit_is_clear(PINC,0))
{
_delay_ms(10);
if(bit_is_clear(PINC,0))
{
}
}
//=========================================== GORA DOL
// PRZYCISK NR 2
if(bit_is_clear(PINC,1))
{
_delay_ms(10);
if(bit_is_clear(PINC,1))
{
while (bit_is_clear(PINC,1))
{
}
if (i<5)
{
i++;
ekran_menu(i);
}
else
{
i=0;
ekran_menu(i);
}
}
}
// PRZYCISK NR 3
if(bit_is_clear(PINC,2))
{
_delay_ms(10);
if(bit_is_clear(PINC,2))
{
while (bit_is_clear(PINC,2))
{
}
if (i>0)
{
i--;
ekran_menu(i);
}
else
{
i=4;
ekran_menu(i);
}
}
}
//================================================
// PRZYCISK NR 4
if(bit_is_clear(PINC,3))
{
_delay_ms(10);
if(bit_is_clear(PINC,3))
{
}
}
//================================================================KONIEC MENU=======================
}
}
Będę wdzięczny również za inne spostrzeżenia.
Pozdrawiam.
