// *** SD-Player Ansteuerung (c) Oliver Mezger 05.03.2011
#include <avr/io.h> // Definitionen laden #include <util/delay.h> // Delay-Bibliothek laden
unsigned char keyOld = 0; // alter Tasten-Zustand unsigned char keyEnter,keyExit; // gedrueckte und losgelassene Tasten
void keyCheck(){ // Tastaturabfrage mit Flankendedektion unsigned char keyTest,tmp; keyEnter = 0, keyExit = 0; keyTest = ~PIND & 0b01111111; // Einlesen und zurechtschieben if (keyOld != keyTest){ // hat sich was getan _delay_ms(10); // Prellen abwarten tmp = ~PIND & 0b01111111; // nochmal Einlesen und zurechtschieben if (tmp == keyTest){ // ist es stabil? keyEnter = (~keyOld) & keyTest; // steigende Flanke !alt und neu keyExit = keyOld & (~keyTest); // fallende Flanke alt und !neu keyOld = keyTest; } } }
unsigned char tasteInStueck(unsigned char n){ // Zuordnung einer Taste zu einem Stueck switch (n){ case 1 : return 0; case 2: return 1; case 4: return 2; case 8: return 3; case 16: return 4; case 32: return 5; default: return 0; } }
#define PLAYIMP 10 // 10ms Abstand zwischen Flankenwechsel void play(unsigned char n){ unsigned char i=0; PORTB &= ~1; // Player aus fuer Reset _delay_ms(100); // warten bis Spannung klein fuer Reset PORTB |= 1; // Player an if (n > 0){ PORTB |= 2; // Taktsignal an _delay_ms(80); // Resetzeit des Players abwarten } while (n > i){ // erzeuge Impuls fuer Stuecke PORTB |= 2; // Taktsignal an _delay_ms(PLAYIMP); PORTB &= ~2; //Taktsignal aus _delay_ms(PLAYIMP); i++; } }
int main(){ // Hauptprogramm PORTB=0b11111100; // alle LED aus DDRB=0xff; // PB als Ausgang while(1){ // Endlosschleife keyCheck(); if (keyEnter >0){ if(keyEnter >32){ PORTB &= ~1; // Player aus } else{ play(tasteInStueck(keyEnter)); } } } return 0; }
|