hier mal ein kleines Beispiel in C:
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--;
}
}
Es fragt lediglich die Tasten ab und gibt deren Zustand mit den LEDs aus...
MfG Kjion
Lesezeichen