Ich habe dann mal ein bisschen gebastelt.
Leider funktioniert meine Tastenabfrage nicht, kann mir jemand kurz erklären wieso nicht? Ich habe die Schonmal getestet, da hat sie funktioniert.
Ich habe die Taster so angeschlossen: PE0,1,2 => Taster =>GND.
CodeBox C
Leider funktioniert meine Tastenabfrage nicht, kann mir jemand kurz erklären wieso nicht? Ich habe die Schonmal getestet, da hat sie funktioniert.
Ich habe die Taster so angeschlossen: PE0,1,2 => Taster =>GND.
CodeBox C
/* Vitrinen-Schaltung
Version: 0.1
Datum: 13.04.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/
/* PE 0-2 = Taster für rauf, runter und Moduswahl
PD 6-7 = Transistoren (BC557)
PC 0-7 = Kathoden der Segmente
PA0 = Rot unten
PA1 = Blau unten
PA2 = Grün unten
PA3 = Rot mitte
PA4 = Blau mitte
PA5 = Grün mitte
PA6 = Rot oben
PA7 = Blau oben
PB0 = Grün oben
*/
//#define F_CPU 16000000UL;
#include <avr/io.h>
//#include <util/delay.h>
int main (void)
{
DDRE = 0b00000000; // Taster auf Eingang (PE0-2)
PORTE = 0b11111111; // Int. Pullups aktivieren
DDRC = 0b11111111; // Segmente der 7-Segment-Anzeige
PORTC = 0b11111111; // Kathoden der Segmente aus (An = 0)
DDRD = 0b11111111; // Ausgang für Transistoren
PORTD = 0b11000000; // Transistoren aus
int aktuelles_programm = 0;
int aktueller_modus = 0;
static unsigned char zustand_taster_hoch;
static unsigned char zustand_taster_runter;
static unsigned char zustand_taster_modus;
int seg_zehner, seg_einer, ziffern_zuweiser;
unsigned char seg[] =
{
0b11100111,//0
0b10000100,//1
0b11010011,//2
0b11010110,//3
0b10110100,//4
0b01110110,//5
0b01110111,//6
0b11000100,//7
0b11110111,//8
0b11110110,//9
};
while(1)
{
// =========================================================
// ===== Moduswahltaster abfragen und verarbeiten =====
// =========================================================
if(zustand_taster_modus == 0 && !(PINE & (1<<PE2))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_modus = 1;
}
else if (zustand_taster_modus == 1 && !(PINE & (1<<PE2))) //Taster wird gehalten
{
zustand_taster_modus = 2;
}
else if (zustand_taster_modus == 2 && (PINE & (1<<PE2))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_modus = 3;
}
else if (zustand_taster_modus == 3 && (PINE & (1<<PE2))) //Taster losgelassen
{
zustand_taster_modus = 0;
}
if(zustand_taster_modus == 1)
{
aktueller_modus++;
}
if(aktueller_modus > 1)
{
aktueller_modus = 0;
}
// =====================================
// ===== MODUS 0 (PROGRAMMWAHL) =====
// =====================================
if(aktueller_modus == 0)
{
// =============================
// ===== TASTER ABFRAGEN =====
// =============================
// Taster zum hochschalten
if(zustand_taster_hoch == 0 && !(PINE & (1<<PE0))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_hoch = 1;
}
else if (zustand_taster_hoch == 1 && !(PINE & (1<<PE0))) //Taster wird gehalten
{
zustand_taster_hoch = 2;
}
else if (zustand_taster_hoch == 2 && (PINE & (1<<PE0))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_hoch = 3;
}
else if (zustand_taster_hoch == 3 && (PINE & (1<<PE0))) //Taster losgelassen
{
zustand_taster_hoch = 0;
}
// Taster zum runterschalten
if(zustand_taster_runter == 0 && !(PINE & (1<<PE1))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_runter = 1;
}
else if (zustand_taster_runter == 1 && !(PINE & (1<<PE1))) //Taster wird gehalten
{
zustand_taster_runter = 2;
}
else if (zustand_taster_runter == 2 && (PINE & (1<<PE1))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_runter = 3;
}
else if (zustand_taster_runter == 3 && (PINE & (1<<PE1))) //Taster losgelassen
{
zustand_taster_runter = 0;
}
// =================================
// ===== TASTER VERARBEITEN =====
// =================================
if(zustand_taster_hoch == 1)
{
aktuelles_programm++;
}
if(zustand_taster_runter == 1)
{
aktuelles_programm--;
}
// =========================
// 7-SEGMENT-ANZEIGEN =====
// =========================
// Anzeige splitten
seg_zehner = aktuelles_programm/10;
seg_einer = aktuelles_programm-(seg_zehner*10);
// Transistoren schalten
if(ziffern_zuweiser > 2)
{
ziffern_zuweiser = 1;
}
if(ziffern_zuweiser == 1)
{
PORTD = 0b10111111;
PORTC =~ seg[seg_zehner];
}
if(ziffern_zuweiser == 2)
{
PORTD = 0b01111111;
PORTC =~ seg[seg_einer];
}
} // END-PROGRAMMWAHL
} // END-WHILE(1)
} // END-MAIN