Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] AVR, program z przyciskami

07 Lis 2019 17:57 171 5
  • Poziom 2  
    Witam, jestem początkującym użytkownikiem avr-ów, dodałem do mojego kodu instrukcje do obsługi przycisku. Przycisk działa jak należy, ale lcd wyświetla tekst w sposób jak poniżej na zdjęciu. Dodam, że przy samym wyświetlaniu bez obsługi przycisku wyświetla normalnie.
    AVR, program z przyciskami


    Czyli będzie to wina poniższego kodu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jakieś pomysły jak to rozwiązać?
  • Pomocny post
    Moderator Samochody
    Po pierwsze - bez potrzeby nie czyścić ekranu (LCD_Clear()) kiedy nic się nie dzieje...

    Po co definiujesz (#define) aliasy, skoro ich nie używasz?

    Twój program działa tak:

    pętla:
    - wyczyść LCD,
    - ustaw kursor na dolny wiersz,
    - napisz "Jestem Artur"
    - Jeśli na PB2 jest stan wysoki (jak mniemam przycisk NIE jest wciśnięty):
    -- wyczyść LCD,
    -- ustaw kursor na dolny wiersz,
    -- napisz "Jestem Artur"
    - ...w przeciwnym razie (przycisk jest wciśnięty):
    -- wyczyść LCD,
    -- ustaw kursor na górny wiersz,
    -- napisz "LED włączony"
    :wróć na początek pętli
  • Poziom 2  
    to jest tekst po kilku obróbkach, tam potem jest włączanie tego leda oraz zamiast zapisów binarnych są np (1<<LED1)
  • Pomocny post
    Poziom 31  
    Ja bym twój program uprościł do tego:
    :początek
    -wyczyść ekran
    -jeśli przycisk wyczyść ekran i idź na początek
    -wyczyść ekran i idź na początku

    I ty się dziwisz że ekran głupieje ? Po wypisywaniu od razu czyścisz ekran - im litera dłużej jest wyświetlona tym ją bardziej widać.
    Powinieneś robić 1 przebieg co x czasu. Pomijając już sam fakt tego, że instrukcja "wyczyść ekran" jest ciężka.
  • Pomocny post
    Poziom 17  
    Zbyt często czyścisz ekran i wysyłasz na niego tekst. Zamiast tego całego warunku if else, spróbuj zapisać tylko w petli while:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie jestem pewny czy dobrze zadziała. Po wciśnięciu przycisku wchodzi do pierwszej pętli while, gdzie jest czyszczony ekran i wyświetlany napis: led..., następnie wchodzi do drugiej pętli i jest w niej tak długo jak wciśnięty jest przycisk. Po jego zwolnieniu wykonuje sie dalsza część pierwszej pętli.
  • Poziom 2  
    Trochę więcej grzebania i się udało, dziękuje za podpowiedzi, wysyłam kod wynikowy.
    Ps. zmieniłem położenie ledów do portów C.

    Code:

    [syntax=c]
    #define SWITCH PB1
    #define SWITCH1 PB2
    #define LED PC0
    #define LED1 PC1

    void set(uint8_t led, uint8_t pos, char* text);
    void reset(void);
    int main(void) {
       LCD_Initalize();
       
       LCD_WriteCommand(0x40); // set CGRAM to zero position.
       for (uint8_t i=0; i!=8; i++) LCD_WriteData(_scharfes_S[i]); // Transfer bytes to LCD.
       for (uint8_t i=0; i!=8; i++) LCD_WriteData(_p[i]);
       for (uint8_t i=0; i!=8; i++) LCD_WriteData(_i[i]);
       LCD_WriteCommand(0x80);
       
       DDRC |= (1<<LED) | (1<<LED1);
         
       PORTB |= (1<<SWITCH); //PULL UP
       PORTB |= (1<<SWITCH1);
       PORTC = 0;
       while (1) {
          if(!(PINB & 2)) { //przycisk jest wcisniety
             set(LED, 0, "Ich hei\x8\x65 Artur");
          }
          else if(!(PINB & 4)) {
             set(LED1, 1, "\x1P\x2WET");
          }
          else {
             reset();
          }
       }
    }

    void set(uint8_t led, uint8_t pos, char* text) {
       PORTC |= (1<<led);
       LCD_GoTo(0,pos);
       LCD_WriteText(text);
    }

    void reset(void) {
       PORTC = 0;
       LCD_Clear();
    }
    [/syntax]