Wenn Taster 1 gedrückt wird, geht LED1 an, wenn Taster 2 gedrückt wird, geht LED2 an.
#include <avr/io.h>
#ifndef F_CPU
/*
* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
* (z.B. durch Übergabe als Parameter zum Compiler innerhalb
* des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
* „nachträgliche” Definition hinweist
*/
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
#define F_CPU 800UL /* Quarz mit 8.00 Mhz */
#endif
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */
/*
lange, variable Verzögerungszeit, Einheit in Millisekunden
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf
262.14 ms / F_CPU in MHz (im Beispiel:
262.1 / 3.6864 = max. 71 ms)
Daher wird die kleine Warteschleife mehrfach aufgerufen,
um auf eine längere Wartezeit zu kommen. Die zusätzliche
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig
ungenau werden (macht hier vielleicht 2-3ms aus).
*/
void long_delay(uint16_t ms) {
while(ms) {
_delay_ms(1);
ms--;
}
}
int main(void) {
DDRD = (1 << PD5) | (1 << PD6); // Ports als Ausgang setzen
while(1) {
if((PIND & 0x04) || (PIND & 0x08)) {
if(PIND & 0x04) {
PORTD ^= 0x20; // Toggle PD5 (LED1)
}
if(PIND & 0x08) {
PORTD ^= 0x40; // Toggle PD6 (LED2)
}
long_delay(300); // Warte 300 Millisekunden
/* Wenn man hier eine kleinere Zahl einsetzt, wird es ein Blinker, der nur läuft, solange man den bzw. die Taster gedrückt hält */
}
}
}