Du gibst sie als BCD-Code aus.
Das erscheint mir am einfachsten. Jede Ziffer belegt dann 4 Bit die man direkt mit den 4 LEDs ausgeben kann:
- Alle Leds einmal an ist Start linker Sensor (15 ist keine BCD-Ziffer!)
- kurze Pause
- nacheinander jeweils die Bitmuster der Einer, Zehner, ...-Stelle anzeigen. (0 als 14?)
- Dazwischen immer kurze Pause zum Notieren der Ziffern ;)
- zweimal mit allen LEDs blinken für Start mittlerer Sensor
- Ziffern nacheinander anzeigen und notieren
- dreimal alle blinken...
So würde ich das angehen. Wie lange man die jeweiligen Ziffern darstellt hängt davon ab, wie schnell man die Bitmuster erkennen und in Ziffern umrechnen kann ;)
Gruß
mic
Ich hab's mal wie oben beschrieben umgesetzt:
Code:
#include <nibobee/iodefs.h>
#include <nibobee/delay.h>
#include <nibobee/led.h>
void ausgabe_BCD(uint8_t startsignal, uint16_t wert)
{
uint8_t ziffer=4;
char ergebnis[5] = {0,0,0,0,0}; // Speicher für 5 Ziffern bereitstellen
while (wert >=10000) { ergebnis[0]++; wert -=10000; }
while (wert >= 1000) { ergebnis[1]++; wert -= 1000; }
while (wert >= 100) { ergebnis[2]++; wert -= 100; }
while (wert >= 10) { ergebnis[3]++; wert -= 10; }
ergebnis[4] +=wert;
// Die LEDs hängen an PB0-PB3 und werden direkt angesteuert. BCD-Bit0 ist LED0:
while(startsignal--) // Blinken als Kennung des Wertes
{
PORTB |= 15; // alle LEDs an bedeutet Start eines neuen Wertes
delay(1000);
PORTB &= ~15; // alle LEDs aus
delay(1000);
}
do // die Ziffern nacheinander anzeigen (Einer zuerst)
{
if(ergebnis[ziffer] == 0) ergebnis[ziffer]=14; // '0' darstellbar machen
PORTB |= ergebnis[ziffer]; // Bitmuster anzeigen
delay(1000);
PORTB &= ~15; // und wieder löschen
delay(1000);
}while(ziffer--);
delay(1000);
}
int main(void)
{
led_init();
while(1)
{
ausgabe_BCD(1, 12345);
ausgabe_BCD(2, 321);
ausgabe_BCD(3, 1357);
ausgabe_BCD(4, 8642);
}
return(0);
}
Lesezeichen