Mit Timern arbeiten ist immer gut, damit kannst du die Taste auch gleich entprellen. Ich hätte das einfach ungefähr so gemacht:
while(1)
{
if(Taste1)
var++;
else if(Taste2)
var--;
_delay_ms(150);
WertAnzeigen();
}
Hallo,
zugegeben... Ich weiß nicht welchen Titel ich wählen soll
Ich habe hier eine Aufgabe aus unserem Kurs bei der ich nicht so recht weiterkomme:
Was ich machen soll ist mir (glaube ich ) klar.Der Wert einer Variablen vom Typo unsigned int soll auf einem Display angezeigt werden. Mit 2 Tasten soll dieser Wert erhöht bzw. erniedrigt werden können.
Kurzes drücken: +1 bzw. -1.
Wird eine Taste etwas länger gedrückt soll sich der Wert mit einer gegebenen Frequenz in einerschritten verändern bis die Taste losgelassen wird
Ich verstehe jedoch nicht was mit dem fett-markierten Satz genau gemeint ist.
Frequenz....
Soll ich hier mit irgendeinem Timer arbeiten? - oder wie stellen sich die Herren das vor
Mein Ansatz ist der folgende:
Danke im VorausCode:// includes etc. int main() { DDRC = 0xFF; lcd_init(); unsigned int val = 0; while(1){ lcd_setcursor(0, 0); lcd_putdez_uint(val); _delay_ms(100); while ((PINA) == 0xff); if (PINA & _BV(7)){ val+=1000; } if (PINA & _BV(6)){ val-=1000; } return 0; } }
kesandal
Mit Timern arbeiten ist immer gut, damit kannst du die Taste auch gleich entprellen. Ich hätte das einfach ungefähr so gemacht:
while(1)
{
if(Taste1)
var++;
else if(Taste2)
var--;
_delay_ms(150);
WertAnzeigen();
}
1:Wenn Taste gedrückt dann Wert = Wert +/- 1
2: Wait xyz s, = Zählfrequenz
3: Taste immer noch gedrückt dann bei 1 Weitermachen
4: .......................
Das wäre die einfachste Form, man kann das natürlich auch mittels Timer IRQ machen und dort die Taste abfragen. Man sollte aber darauf achten genügend Zeit für "einen" Tastendruck zu lassen, sonst zählt das immer gleich mehrmals . Vorteil des IRQ, der Prozessor kann nebenbei noch andere Aufgaben erledigen.
Gruß Richard
ich hab das gerade bei einem Projekt so gemacht:
Tastenabfrag im Timer Int, der alle 10ms kommt.
Wenn Taste gedrückt, dann werden beide Variablen hochgezählt, die erste bis 4, dann wird die Taste als gedrückt erkannt und der Tastenwert
wird in eine globale Variable geschrieben. Die zweite Variable kann hoch bis 200 zählen, das sind dann 2 Sekunden, sprich die Taste lange gedrückt und es wird ebenfalls ein globales Flag gesetzt.
Wird zwischendurch keine Taste als gedrückt gelesen werden beide Zählariablen auf 0 gesetzt, Das FLag gelöscht, der Tastenwert auf 0 und die
Aufwärtszählerei beginnt beim nächsten Tastendruck von vorne.
Dann habe ich in der Mainloop nur noch die Abfrage ob ein Tastenwert >0 da ist, wenn Tastenwert gesetzt, dann erhöhe / erniedrige um 1, wenn Langzeitflag gesetzt dann eben nochmal 3 dazu oder herunter.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Eine Version für die bee:
Code:#include <avr/io.h> #include <util/delay.h> #include "lcd_lib.c" #define taster_auf (lcd_getkeys()&1) // true wenn Taster gedrückt #define taster_ab (lcd_getkeys()&2) uint16_t val = 0; // globale Variable für den Wert void lcd_put_val(void) // val auf LCD ausgeben { // lcd_setcursor(0, 0); // lcd_putdez_uint(val); lcd_locate(0, 0); lcd_writeInteger(val, 10); lcd_writeString(" "); } int main(void) { lcd_init(); lcd_writeString("Hello"); while(!taster_auf && !taster_ab); lcd_cls(); while(taster_auf || taster_ab); lcd_put_val(); while(1) { if(taster_auf && !taster_ab && (val<999)) { val++; lcd_put_val(); _delay_ms(300); // Startdelay while(taster_auf && !taster_ab && (val<995)) { val+=5; lcd_put_val(); _delay_ms(200); // Wiederholung } } if(!taster_auf && taster_ab && (val>0)) { val--; lcd_put_val(); _delay_ms(300); while(!taster_auf && taster_ab && (val>5)) { val-=5; lcd_put_val(); _delay_ms(200); } } } return 0; }
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen