hier mal ein kleines Beispiel in C:
Es fragt lediglich die Tasten ab und gibt deren Zustand mit den LEDs aus...Code:#include <avr/io.h> #define SYSCLK 14756000 void init(void); unsigned char get_key(void); void delay(unsigned int ms); /* * Hauptprogramm */ int main(void) { unsigned char i; init(); while(1) { /* Ergebnis auslesen und anzeigen */ i = get_key(); if (i != 0xff) PORTC = ~(1<<i) & 0x7f; else PORTC = 0x7f; } return 0; } /* * Initialisierung des µC */ void init(void) { DDRA = 0x00; /* Port als Eingang deklarieren ( A/D-Wandler Eingänge ) */ PORTA = 0x80; DDRB = 0xff; /* Port als Ausgang deklarieren */ PORTB = 0x00; DDRC = 0xff; /* Port als Ausgang deklarieren */ PORTC = 0x00; DDRD = 0xff; /* Port als Ausgang deklarieren */ PORTD = 0x00; /* Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis ) */ ADMUX = (1<<REFS0)|(1<<ADLAR); SFIOR &= ~(1<<ADHSM); ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); } /** * Fragt die Tasten an AD-Port 7 ab, kann nicht erkennen ob zwei Tasten gleichzeitig gedrückt werden * * 255 keine Taste gedrückt 0 Taste 1 gedrückt 1 Taste 2 gedrückt 2 Taste 3 gedrückt 3 Taste 4 gedrückt 4 Taste 5 gedrückt */ unsigned char get_key(void) { unsigned char i, taste = 0xff; /* ADC7 mit Vcc als Referenzspannung */ ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07; /* AD Wandler starten */ ADCSRA |= (1<<ADSC); /* Warten bis das Ergebniss zur Verfügung steht */ while(!(ADCSRA & (1<<ADIF))); /* Ergebnis auslesen und anzeigen */ i = ADCH; if (i < 36) taste = 4; else if (i < 57) taste = 3; else if (i < 76) taste = 2; else if (i < 94) taste = 1; else if (i < 150) taste = 0; return taste; } /** * Eine kleine Warteschleife * * ms ist die Anzahl der Millisekunden die "gewartet" werden soll */ void delay(unsigned int ms) { unsigned int zaehler; while (ms) { zaehler = SYSCLK / 5000; while (zaehler) { asm volatile ("nop"); zaehler--; } ms--; } }
MfG Kjion







Zitieren

Lesezeichen