PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tastern steuern



tako1
23.03.2011, 14:37
Hallo,

ich habe ein 20x4 LCD(DOTmatrix) und 3 Taster mit dem Arduino Atmega1280 angeschlossen.

1.Taster soll beim drücken den cursor nach oben verschieben und die Zeile selektieren
2.Taster soll beim drücken den cursor nach unten verschieben und die Zeile selektieren
3. Beim betätigen des 3.Tasters soll den enthaltenen String in der selektierten Zeile als Funktion aufgerufen und ausgeführt werden.
Gibt es geiegnete Funktion dafür oder muss man die neu implementieren?

Im Voraus bedanke ich mich und freue mich schon auf euere Feedback.

Gruß

KR-500
24.03.2011, 15:37
Hi,

so wie es sich anhört möchtest du ein Menü erstellen. Hier: http://www.mikrocontroller.net/topic/11266 wurde ein Menü für ein LCD erstellt. Dabei legt man als erstes einen typedef an z.B. den hier:

typedef struct MENU {
unsigned char *text;
uint8_t previous;
uint8_t next;
uint8_t stage;
void ( *fp )( void );
} MENU_ENTRY;Danach kann man ein Array mit den Menüpunkten erstellen:


MENU_ENTRY menue[] = {

{ "Menue1", 33, 12, 1, fkt1},
{ "Untermenue1", 11, 6, 2, fkt2},
{ "Untermenue2", 5, 4, 2, fkt2},
{ "Untermenue2", 2, 4, 3, fkt2},
{ "Untermenue2", 2, 5, 0, fkt2},
{ "Untermenue2" 4, 2, 5, fkt2},
{ "Untermenue1", 1, 7, 2, fkt2 },
{ "Untermenue1", 6, 8, 2, fkt2 },
{ "Untermenue1", 7, 9, 2, fkt2},
{ "Untermenue1", 8, 10, 2, fkt2},
{ "Untermenue1", 9, 11, 0, fkt2 },
{ "Untermenue1", 10, 1, 11, fkt2},

};Das ist dann die Menüstruktur, die Zahlen stimmen nich ganz aber ansonsten kann das so aussehen. Ich hatte damals ein 2zeiliges LCD und einen Drehencoder, und dann sah das main Programm so aus.



void fkt1 (void){

}

void fkt2 (void){

}

int main (void){

init();

uint8_t menue_counter=0;
uint8_t draw = 0;

while(1){
if(enc_delta>0){
menue_counter=menue[menue_counter].next;
draw=1;
enc_delta=0;
}
else if (enc_delta<0){
menue_counter=menue[menue_counter].previous;
draw=1;
enc_delta=0;
}

if(!(PIND & (1<<PD4))){
_delay_ms(200);
menue[menue_counter].fp();
menue_counter=menue[menue_counter].stage;
draw=1;
}

if(draw){
lcd_string((char *)menue[menue_counter].text);
set_cursor(1,2);
lcd_string((char *) menue[menue[menue_counter].next].text);
set_cursor(1,1);
draw = 0;
}

}



return 0;

}Wenn also der Encoder betätigt wird, dann wird eine neue Zeile geladen und wenn der "Enter-Knopf" gedrückt wird dann wird gegebenen falls ein String aus dem Untermenü geladen und die entsprechende Funktion ausgeführt.

KR-500