meny för enkel LCD med uppslagstabell

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

meny för enkel LCD med uppslagstabell

Inlägg av dude »

Hej,

Jag hade tänkt göra en meny för en enkel LCD display.
Men jag har lite funderingar kring hur jag gör detta enklast.

Jag funderar på om man kunde göra någon sorts uppslagstabell med någon struct som grund eller något liknande... (if och case statements blir nog lite röriga om menyn bli för stor)
Är det någon som har gjort något liknande någon gång? (jag har aldrig gjort det)
Någon som har något enkelt exempel på hur det kan se ut när man gör en sådan?

Jag tänker programera i C kod
//Martin
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: meny för enkel LCD med uppslagstabell

Inlägg av Shimonu »

Man kan ha en array av struct-typen och sen är det enklast att använda en passande enum med bra namn för att komma åt index, det blir enkelt att loopa över arrayen då också om man vill göra något generellt.

Sen finns det smidig syntax om det är en konstant tabell man sätter upp

Kod: Markera allt

static const MyStruct MyStructArray[ENUM_LAST] = {
  [ ENUM_X ] = { .Age = 54, .Name = "Kalle" },
  .
  .
  .
};
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: meny för enkel LCD med uppslagstabell

Inlägg av Icecap »

Utan att veta mer om hur meny-systemet ska se ut är det svårt.
* Ska det vara texter med värden "inuti" eller ska det vara texter med värden efter - eller ska det bara vara texter?
* Hur många nivåer ska du ha i menystrukturen? Bara 1 eller fler?
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

Re: meny för enkel LCD med uppslagstabell

Inlägg av dude »

Det ska vara en menu med en huvudmeny (nivå1)och sedan undermenyer till dessa (nivå2) och sedan kanske en nivå till med undermenyer till nivå 2 (nivå 3) där man ställer in värden (eller denna kanske inte behövs? exempel här nedan med en lampa som aktiveras och avaktiveras på olika sätt.
Så ja, jag antar att detta är det du kallar värden "inuti".

så tex:

(nivå 1)
LAMP settings
other menu text
other menu text
other menu text

(nivå 2)
TURN ON LAMP (ON/OFF)
TURN ON LAMP WITH DELAY (1-30 sec)
TURN ON LAMP AUTOMATIC/MANUEL WHEN SENSOR ON (ON/OFF)

(nivå 3) ((behövs denna i detta exempel?? fär att genomföra de saker som nämns i nivå 2
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: meny för enkel LCD med uppslagstabell

Inlägg av Shimonu »

Du skulle nog kunna sätta upp det med funktionspekare också. Men har inte tagit mer än kanske 30 sekunder att tänka igenom det nu.

Det beror lite på hur mycket det kommer skilja mellan valen. Men lägger man lite tid på att planera det kan det nog göras väldigt snyggt med funktionspekare och structar.
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

Re: meny för enkel LCD med uppslagstabell

Inlägg av dude »

Ok, ni råkar inte ha nån referenskod eller så? :)
Kan lite c programering, men är inte världsbäst. så hade hjälpt mycket om någon något man kunde kika på som referens.. :D
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: meny för enkel LCD med uppslagstabell

Inlägg av Icecap »

Hur har du tänkt dig att ta in input?
Om du ska ställa värden behöver det ju någon "Stega Upp" och "Stega Ner"-funktion. Det behövs även en "Ångra/ESC"-funktion samt en "OK"-funktion. Du ska också ha något sätt att stega i menyn på, jag brukar ha en "Meny"-knapp eller använda en rotary encoder med mittknapp.

Jag gjorde ett menysystem som dels hade texterna (i flera språk) i ett menysystem - men jag hade tagit en liten genväg: textsträngen kunde vara typ "bla bla bla: %3u%%". Denna blev senare använd som printf(Texts[Language][Menuindex], <någon_variabel>) för att på det vis kunde skriva ut direkt.

Detta dikterar även att man bara kan ta in 1 variabel åt gången för att justera den.

Men ja, det är ganska enkelt i grunden. Man deklarerar en struct med de olika texter:

Kod: Markera allt

const char* Menu0[] = {"LAMP Settings", "Some other setting", "Another setting"};
const char* Menu1[] = {"TURN ON LAMP (ON/OFF)", "TURN ON LAMP WITH DELAY (1-30 sec)", "TURN ON LAMP AUTOMATIC/MANUEL WHEN SENSOR ON (ON/OFF)"};
En viktig grej är att ha en variabel som indikerar att det är ändrat något och att displayen ska uppdateras. När den aktiveras för att ett värde är ändrat uppdateras displayen och variabeln nollställs. Då släpper man flimmer o skit.
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

Re: meny för enkel LCD med uppslagstabell

Inlägg av dude »

input kommer jag ha ha fyra knappar: upp/ned/escape/enter.

Jag hittade denna guide på youtube om ett menysystem. vad tror du om det? Såg stabilt ut iallafall med att ha fördefinerade listor. (vidoekvaliten är lite crap, men pausar du så ser du koden iallafall. i tidigare video föklarar han hur den funkar också)

Jag fick det dock inte att fungera för mig (än iallafall).
Vet du vad sådana här lösningar kallas?
(såna fall kanske jag kan hitta någon liknande exempelkod som jag kanske kan få att funka)



det du snackade om lät intressant och typ något sånt jag letar efter. Den lösningen lät gansa likt de som de visar i Youtube video (eller har jag föstått dig rätt?)
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: meny för enkel LCD med uppslagstabell

Inlägg av adent »

Tänkte du till en vanlig 16x2-LCD?

Till min pumpstyrning fick jag till ett imho ganska vackert och generellt menysystem där man definierar upp
alla menyer först och där man även kan få inmatning av värden direkt. Man kan också lämna över till sin egen kod och sedan återgå till menysystemet. Det är inte perfekt men funkar.

Dock kräver det kanske att man har hyfsat bra koll på C och funktionspekare med mera.

Vad kör du för MCU?

MVH: Mikael
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

Re: meny för enkel LCD med uppslagstabell

Inlägg av dude »

Hej,

nej, jag använder en grafisk display med upplösning 128 *64.
drivare är SSD1305.
men hur man styr utskrift av tecken och vart den ska skriva ut på skärmen har jag fått igång.

så det är mer hur man man man får till över överskådlig och stabilt menysystem som jag skulle vilja ha hjälp med något exempel att kolla på.
Att få till att det fungerar kan jag nog fixa. men jag är orolig att jag får till en onödigt komplex och rörig lösning. Känns som finns säkert någon snygg lösning där ute.
Jag försöker att inte uppfinna hjulet igen så att säga.. :)

Jag använder en ATmega4809
Skriv svar