logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 - Proste menu na LCD 2x16 HD44780 z 4 przyciskami (up, down, ok, back)

Rigardo5033 17 Maj 2016 20:28 4200 25
REKLAMA
  • #1 15681155
    Rigardo5033
    Poziom 6  
    Witam. Potrzebuje zrobić proste naprawdę proste menu na wyświetlaczu LCD 2x16 hd44780. Na różnych stronach znalazłem przykłady, ale niestety bardzo skomplikowane i rozbudowane.

    Moje menu ma wyglądać następująco
    Wyświetl->Wyświetla parametry z czujników
    Ustaw -> parametr do zmiany
    -> parametr do zmiany

    I to jest wszystko. Chciał bym to zrobić na 4 guzikach up, down, ok, back.
    Próbuje coś na ifach ale nie wychodzi mi to wgl.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety to na ifach to zapetla mi się dziwnie. Wiem czemu, wiem dlaczego ale nie miałem innego pomysłu. Jestem początkujący w programowaniu mikrokontrolerów.

    Proszę o pomoc
  • REKLAMA
  • #2 15681230
    lukas_gab
    Poziom 15  
    Zrób sobie enuma ze stanami w jakimi możesz być ( wyswietl, ustaw, etc...). W zależności od stanu w jakim jestes zmieniaj go na inny w reakcji na przycisk. W zasadzie takie menu to klasyczna maszyna stanów z przejściamy które następują w reakcji na przycisnięcie przycisku. Rozrysuj sobie graf stanów i przejść i potem będzie ci łatwiej przenieść to na kod. W zasadzie to potem 1:1 ify są.
  • REKLAMA
  • #4 15682065
    Rigardo5033
    Poziom 6  
    To tinymenu jest na jakiś jostikach. I słabo to rozumiem. Naprawdę potrzebuje coś prostego bo chyba moje "drzewo" nie jest jakieś skomplikowane
  • REKLAMA
  • #5 15682090
    el2010tmp
    Poziom 25  
    Rigardo5033 napisał:
    Niestety to na ifach to zapetla mi się dziwnie.


    Jak program ma wyjść z tej pętli?
    Rigardo5033 napisał:
    while(flaga == 0)
    {
      lcd_clrscr();
      lcd_goto(0x0);
      lcd_puts("> Wyswietl");
      lcd_goto(0x40);
      lcd_puts("Ustaw temp");
      if(ff == 1)
        {
        lcd_clrscr();
        lcd_goto(0x0);
        lcd_puts("Wyswietla");
        _delay_ms(200);
        }

    }
  • #6 15682184
    grko
    Poziom 33  
    Rigardo5033 napisał:
    To tinymenu jest na jakiś jostikach. I słabo to rozumiem. Naprawdę potrzebuje coś prostego bo chyba moje "drzewo" nie jest jakieś skomplikowane


    Ten przykład jest akurat na joysticku. Bez problemu można to przerobić na przyciski. Z tych źródeł potrzebujesz tylko 3 plików:
    * tinymenu.c, tinymenu.h, tinymenu_hw.h

    Zapewniam Cię, że to co zrobisz na tinymenu będzie dużo prostsze niż to co masz teraz.
  • #7 15682808
    Rigardo5033
    Poziom 6  
    GrzegorzKostka napisał:
    Rigardo5033 napisał:
    To tinymenu jest na jakiś jostikach. I słabo to rozumiem. Naprawdę potrzebuje coś prostego bo chyba moje "drzewo" nie jest jakieś skomplikowane


    Ten przykład jest akurat na joysticku. Bez problemu można to przerobić na przyciski. Z tych źródeł potrzebujesz tylko 3 plików:
    * tinymenu.c, tinymenu.h, tinymenu_hw.h

    Zapewniam Cię, że to co zrobisz na tinymenu będzie dużo prostsze niż to co masz teraz.


    Zacząłem bawić się i coś już rozumiem :) Wielkie dzięki za pomoc.
    Teraz moje pytanie. W tym tiny menu występuje funkcja która odczytuje ruch josticku. Nie wiem jak zrobić funkcje która bedzie odczytywała który klawisz wcisnołem


    Tu jest warunek ze jeżeli klawisz wcisniety to rob to co w klamrach
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A ja chce zrobić aby funkcja zwracała mi który klawisz wcisnołem: down, up , ok , back.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A następnie :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I jeszcze jeden problem. W bibliotece tinymanu_hw.h znajduje sie taka definicja.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety moje biblioteki wyswietlacza nie mają funkcji lcd_setpos(x,y)

    Tylko :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie wiem jak to rozwiązac
  • Pomocny post
    #8 15682877
    grko
    Poziom 33  
    Twoja funkcja do odczytu stanu przycisków powinna wyglądać mniej więcej tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Odrazu zaznaczam, że nie jest to prawidłowa obsługa przycisków bo nie uwzględnia eliminacji drgań styków.

    Jeśli chodzi o funkcję lcd_goto to pokaż jak ona wygląda. Ogólnie makro: menu_set_xy powinno ustawić kursor w odpowiedniej pozycji gdzie x jest z zakresu to 0 ...15 a y 0 ...1.
  • #9 15682897
    Rigardo5033
    Poziom 6  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Troche skomplikowane

    I jeżeli chodzi o tą funkcje :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To nie moge zwracać takiego czegoś. Nie mam pomysłu jak to zrobic.
  • #10 15683024
    grko
    Poziom 33  
    Spróbuj tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Cytat:

    To nie moge zwracać takiego czegoś. Nie mam pomysłu jak to zrobic.


    Nie możesz czy nie chcesz? I dlaczego?
  • #11 15683098
    Rigardo5033
    Poziom 6  
    Poniważ mam błędy

    Description	Resource	Path	Location	Type
    'BACK' undeclared (first use in this function)	main.c	/Menu	line 117	C/C++ Problem
    



    Description	Resource	Path	Location	Type
    Symbol 'BACK' could not be resolved	main.c	/Menu	line 117	Semantic Error
  • Pomocny post
    #12 15683112
    grko
    Poziom 33  
    No to zdefiniuj te symbole. Przykładowo tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 15683124
    grko
    Poziom 33  
    Oczekujesz, że ktoś odgadnie gdzie masz błąd nie widząc programu?
  • #15 15683156
    Rigardo5033
    Poziom 6  
    Przepraszam bardzo. Juz podaje kod

    Program główny

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    tinymenu.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    tinymenu_hw.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    tinymenu.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #16 15683202
    grko
    Poziom 33  
    Niestety jest błąd w tym przykładzie na którym się wzorujesz. Struktura main menu powinna wyglądać tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W polach .value powinna mieć referencje do podmenu. Oraz wejście do menu głównego powinno wyglądać tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 15683247
    Rigardo5033
    Poziom 6  
    Działa :) Wyświetla się :) Tylko jest problem ze chce wyświetlić to w jednej lini. I widzę :
    "*Submenu1 s " zamiast wyświetlać pod spodem kolejny element.
    Wina leży w tym ze używam innej biblioteki.

    Dodano po 2 [godziny] 11 [minuty]:

    Mam nadal problem z tym.

    W pliku tinymenu.c jest użyta funkcja

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    definicja funkcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Orginał:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I jeżeli ta funkcje za komentuje to to menu chodzi tak jakby w prawo i widzę :
    "*submenu 1 s" i jak klikam "down" to zmienia się na "submenu1 *s" wiec po prostu się nie mieści w tych 16 znakach.
    Screeny:
    Link
    Link

    Gdy zostawię funkcje tak jak jest to już chodzi całkowicie dziwnie.
    Screeny:
    Link
    Link

    Tej funkcji oryginalnej wgl nie rozumiem. Dlaczego mnożone przez 6?
  • #18 15710190
    Rigardo5033
    Poziom 6  
    Mógł by ktoś pomoc z tym munu_set_xy?
  • #19 15710222
    grko
    Poziom 33  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z tego co widzę to Twój wyświetlacz ma szerokość 16 a nie 14.
  • #20 15710228
    Rigardo5033
    Poziom 6  
    Rzeczywiście tutaj błąd był i dlatego kolejne "submenu" wyświetlało w jednej lini. Lecz nadal nie ma submenu2 pod submenu1.
  • REKLAMA
  • #21 15710247
    grko
    Poziom 33  
    Błąd jest chyba w makrze:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powinno być:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #22 15710258
    Rigardo5033
    Poziom 6  
    Dziękuję bardzo!!! Naprawdę głupi błąd... Dzięki wielkie za pomoc :)

    Dodano po 11 [minuty]:

    Ale jeszcze do końca nie działa tak jak ma działać. Gdyż jak jest więcej elementów np submenu3 to nie przechodzi do tego tylko pusty ekran. Jakiś pomysł gdzie jest błąd?

    Dodano po 14 [minuty]:

    I jak zrobić tak że jak dam OK na submenu1 to wykonuje sie funkcja jakaś? Np wyświetlająca jakieś parametry.
  • #23 15712102
    Rigardo5033
    Poziom 6  
    Ktoś coś wie? Jak wywołać w tym menu funkcje? 3 dzień próbuje i nie wiem...
  • #24 15962183
    trynitor
    Poziom 7  
    Rigardo5033 napisał:
    Ktoś coś wie? Jak wywołać w tym menu funkcje? 3 dzień próbuje i nie wiem...


    Funkcje możesz wywołać w następujacy sposób:

    Rozważmy zmienną 'sub1_menu'.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz jeśli naciśniesz przycisk "OK" będąc ustawionym na pozycji "START" wykona się funkcja przypisana do pola '.select'. Dla przycisku "START" jest to funkcja 'diodaON'. Może ona wyglądać na przykład tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeśli podłączysz diodę do pinu PD7 powinna się zapalić.
    Wciskając przycisk "OK" będąc ustawionym na pozycji "STOP" analogicznie uruchomie się funkcja 'diodaOff', która może wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak, więc w pole '.select' struktury 'sub1_menu' (lub każdej innej jaką stworzysz) wprowadzasz nazwę (adres) dowolnej napisanej przez Ciebie funkcji.
  • #25 15984270
    Rigardo5033
    Poziom 6  
    Witam. Odświeżam temat ponieważ nadal mam problem.

    Wszystko w porządku z tym menu i wstawieniu funkcji lecz nadal jest problem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I gdy daje OK na funkcje wyświetl uruchamia się funkcja o nazwie "wys" , lecz ona trwa tylko tyle ile ma delaya a chciał bym zrobić aby trwała cały czas puki nie kliknę guzika back. Próbowałem na milion sposobów i nadal nie mam pojecia jak to zrobić. Proszę o pomoc
  • #26 15985950
    Rigardo5033
    Poziom 6  
    Proszę kogoś o pomoc kto miał już styczność z tinymenu i może wie jak to zrobić
REKLAMA