// Ereigniszähler mit Gabellichtschranke auf der Basis des "Pollin Spiel 1"
# include <stdlib.h>
# include <avr/interrupt.h> // Das ist vor allem für den Ton
# include "display.h"
# include "util/delay.h"
# include "auslagerung.c"
// Diese Werte werden von der Funktion ZahlZuString() benötigt:
#define BASE_DEZ 10 // Dezimalzahlen verwenden
#define STRING_LAENGE_utoa 6
// Taster-Pins
// Taster1: Hängt an Pin 0 vom Port D
// Taster2: an Pin 1 vom Port D
# define DELAY 20 // Millisekunden
#define GABELLICHTSCHRANKE 5 // Hängt an Pin 5 von Port B
// Zum Zahlen umwandeln und ausgeben:
char* ZahlZuString(uint16_t Val, char* String)
{
uint8_t p;
uint8_t i = STRING_LAENGE_utoa;
String[i] = \'\\0\';
while(i>0)
{
i--;
String[i] = \'0\' + Val % BASE_DEZ;
Val /= BASE_DEZ;
if(String[i]==\'0\' && Val==0)
{
p=i;
while(p<=STRING_LAENGE_utoa)
{
String[p]=String[p+1];
p++;
}
}
}
return String;
}
int main(void)
{
AVRInit();
InitDisplay();
DDRB &= ~((1<<GABELLICHTSCHRANKE)); // definiert Port-Pin als Eingang
char OutputString[8]; // Wird für Umwanbdlung der Zahlen in Zeichen benötigt
int Zaehlwert = 0;
uint8_t LichtschrankeAlt=0;
uint8_t LichtschrankeNeu=0;
// Es wird auf Zeile 1 ausgegeben "Zaehler:"
// Es wird auf Zeile 2 ausgegeben "0"
ClearDisplay();
SetDisplayCursor(1,0);
WriteDisplayString("Zaehler:");
SetDisplayCursor(2,0);
WriteDisplayString("0");
while(1)
{
// Der neue, aktuelle Zustand des Taster1 (links) wird abgefragt
LichtschrankeNeu=(PINB & (1<<GABELLICHTSCHRANKE));
// Bei steigender Schaltflanke wird gezählt (Taster gedrückt)
if((LichtschrankeNeu)& ~(LichtschrankeAlt))
{
Zaehlwert++;
SetDisplayCursor(2,0);
ZahlZuString(Zaehlwert, OutputString);
WriteDisplayString(OutputString);
_delay_ms(DELAY); // Warten bis Tastenprellen zu Ende
}
// Bei fallender Schaltflanke wird nur das Prellen kompensiert
if(~(LichtschrankeNeu)& (LichtschrankeAlt))
{
_delay_ms(DELAY); // Warten, bis Tastenprellen zu Ende
}
// Taster2 (rechts) setzt den Zähler auf 0 zurück
if(PIND & (1<<TASTER2))
{
Zaehlwert=0;
ClearDisplay();
SetDisplayCursor(1,0);
WriteDisplayString("Zaehler:");
SetDisplayCursor(2,0);
WriteDisplayString("0");
}
LichtschrankeAlt=LichtschrankeNeu;
}
}