
Jag har en µC med en 4x20 alfanumerisk display, där visar jag en bild som ser ut så här:
Kod: Markera allt
"rubrik"
Inställn tid & datum
>2012-01-01 12:00:00
Format ÅÅÅÅ-MM-DD
Datum och tid finns i en struct med 6 st uint8_t : yy,mo,dd,hh,mm,ss
Datumet lagras i BCD-format, så skriver man ut det i hexformat går det att läsa.
Hade det bara funnits ett datumformat hade det väl varit OK, men nu ska den kunna hantera tre format:
Det finns en format-variabel som kan anta värdena 0,1 och 2:
0 = 20YY-MO-DD
1 = DD/MO/20YY
2 = MO/DD/20YY
Jag har redan en "printDateTime() - rutin som skriver ut både datum och tid på displayen beroende på datumformat.
Den använder sig av positionspekare för YY, MO och DD, så att t.ex. för format 2 så har pekYY = position 8, pekDD = position3, pekMO = position 0, samt pek20 = position6 (var "20" ska skrivas").
Datumet skrivs unt i en RAM-buffert som sedan skickas ut till LDC.
Jag hade tänkt använda mig av RAM-bufferten även då jag ändrar i siffrorna och sedan spara från den till timeDate-variabeln när jag trycker OK.
Förutom att jag ska kunna ändra på alla siffror utom på skiljetecknen ( : . / - ) så ska jag hålla reda på gränserna för talen, t.ex. att månad bara kan anta värden mellan 01 och 12. Så jag måste hålla reda på en massa saker - framför allt vilken variabel jag håller på med för tillfället.
Ja... så nu sitter jag här och funderar.... hur görs detta på smidigast sätt?
(smidigast i det här fallet är likvärdig med "enklast att programmera", jag skiter i vad det tar i form av processorkraft eller programminne. Däremot vill jag inte använda ytterligare utrymme i RAM-minnet, om det går att undvika.)
Jag kan tillägga att menysystemet är uppbyggt på det sättet att först så ritas hela bilden upp (med rätt datum och tid etc.), sedan anropas en speciell funktion varje gång en knapp trycks ner; menyMode1_navigateMenu(). I den funktionen avgör jag vad som ska göras beroende på vilken knapp det var. Om jag trycker "OK" när jag befinner mig på rad 3, så kommer jag till "meny mode 6" som innebär att en speciell funktion för knapptryckning anropas: menuMode6_datumTid() där jag alltså ska hantera detta. När jag nästa gång trycker OK går jag tillbaks till "meny mode 1" efter att ha sparat det nya datumet + tiden. (meny mode 1 = att navigera i menyn).