Hallo Forum,
nachblutigem rumprogrammieren bin ich mit meiner Geduld am Ende und ersuche hier erneut Rat. Kurz und Knapp:
- Mittels den Bibliotheken von P. Fleury steuere ich erfolgreich ein LCD an
- Durch einen Timer habe ich eine kleine Laufschrift realisiert.
- Mit einem anderen Timer frage ich 4 Tasten ab.
- Ich möchte, dass bei jedem Tastendruck ein anderer Text als Laufschrift auftaucht. Das klappt "eigentlich", nur nicht so wie ich will. Ich möchte dass bei dem Tastendruck die Laufschrift von Vorne startet, bisher ist es aber so, dass sich immer an's Ende des zuvorgehenden anhängt. Hier erstmal etwas Code:
Hier wird die eigentliche Laufschrift gebildet.Ich muss immer die Länge des Strings ermitteln lassen. Wenn ich ihn einmal ermittle und in einer Variablen zwischenspeicher, dann läuft der Text sozusagen aus.
Code:
ISR(TIMER2_OVF_vect)
{
if (LCD_hold==0){
if (T2Counter == 0) {
lcd_gotoxy(0,LCD_SCROLLING_ROW);
for (uint8_t i=0; i<=LCD_ROW_LENGTH; i++) {
lcd_putc(LCD_lauftext[i]);
}
LCD_temp=LCD_lauftext[0];
for (uint8_t i=0; i<=strlength((const char *)LCD_lauftext); i++) {
LCD_lauftext[i]=LCD_lauftext[i+1];
}
LCD_lauftext[strlength((const char *)LCD_lauftext)]=LCD_temp;
T2Counter = T2Counter_backup;
} else T2Counter--;
}
T2Of=1;
TCNT2=T2Preloader;
}
Die Funktionen, die mir den Timer initialisieren:
Code:
void lcd_clr_scrollbar() {
TCCR2 &= ~(1<<CS22); //timer abstellen
TCCR2 &= ~(1<<CS21);
TCCR2 &= ~(1<<CS20);
lcd_gotoxy(0,LCD_SCROLLING_ROW);
lcd_puts(" "); //löscht Zeile
}
void lcd_scroll_text(char* text, uint16_t Hz, uint8_t delay_factor){
/* Hier haebe ich schon verschiedenes getestet: direkte Zuweisung wie unten gezeigt, oder über eine for Schleife die einzelnen chars neu beschrieben, funktionierte alles nicht so wie ich wollte. Bei der For Schleife z.B. wurde einfac garnichts in den String LCD_lauftext aufgenommen. LCD_lauftext ist übrigens eine globale volatile char* variable*/
LCD_lauftext=text;
T2Counter=delay_factor;
T2Counter_backup=delay_factor;
TCCR2|=(1<<CS22)|(1<<CS21)|(1<<CS20); //Prescaler=1024
T2Preloader=256-F_CPU/LCD_PRESCALER/Hz;
TCNT2=T2Preloader;
TIMSK |= (1<<TOIE2);
T2Of=0;
LCD_hold=0;
}
In der Hauptschleife dann die Abfrage der Taste und Reaktion auf dem Display anzeigen:
Code:
keypad_open(KEYPAD_SCANNING_FREQUENCY,KEYPAD_DEBOUNCE_SLOW);
for (;;) {
uint8_t key = keypad_check();
if (key==KEYPAD_KEYOK) { lcd_clr_scrollbar(); lcd_scroll_text("Es wurde die Taste [OK] betaetigt +++ ",LCD_SCANNING_FREQUENCY,LCD_DELAY_FACTOR); keypad_open(KEYPAD_SCANNING_FREQUENCY,KEYPAD_DEBOUNCE_SLOW); } else
if (key==KEYPAD_KEYESC) { lcd_clr_scrollbar(); lcd_scroll_text("Die Taste [ESC] gedrueckt +++ ",LCD_SCANNING_FREQUENCY,LCD_DELAY_FACTOR); keypad_open(KEYPAD_SCANNING_FREQUENCY,KEYPAD_DEBOUNCE_SLOW); } else
if (key==KEYPAD_KEYINC) { lcd_clr_scrollbar(); lcd_scroll_text("[+] wurde betaetigt +++ ",LCD_SCANNING_FREQUENCY,LCD_DELAY_FACTOR); keypad_open(KEYPAD_SCANNING_FREQUENCY,KEYPAD_DEBOUNCE_SLOW); } else
if (key==KEYPAD_KEYDEC) { lcd_clr_scrollbar(); keypad_open(KEYPAD_SCANNING_FREQUENCY,KEYPAD_DEBOUNCE_SLOW); }
}
}
So das war's eigentlich, wenn noch Fragen sind, bitte posten.
System:
ATMega 32, JTAGEN disabled, Crystal = 8MHz. Das Keypad verwendet Timer0, das LCD Timer2 (salopp formuliert)
Freue mich auf Antworten,
viele Grüße,
Simon
Lesezeichen