'Besser' ist ja sehr relativ. Besserer Code was Laufzeit und/oder Codebreite angeht ist nicht unbedingt besser Code im Bezug auf Lesbarkeut oder Portierbarkeit. Die Pole stehen idR leider im krassen Gegensatz.
So mies ist die Lösung nun auch wieder nicht, aber man hat nun mal den Overhead von Funktionsaufruf, rumgeshifte und indirektem Portzugriff.
Alternativ könnte man so was machen, um 4 Bits auszugeben:
Code:
// Verwende PortB.1, PortB.3, PortC.3, PortD.2
#define PORT_0 PORTB
#define PBIT_0 1
#define PORT_1 PORTB
#define PBIT_1 3
#define PORT_2 PORTC
#define PBIT_2 3
#define PORT_3 PORTD
#define PBIT_3 2
void out_nibble (uint8_t nibble)
{
if (nibble & _BV(0)) PORT_0 |= _BV (PBIT_0); else PORT_0 &= ~_BV (PBIT_0);
if (nibble & _BV(1)) PORT_1 |= _BV (PBIT_1); else PORT_1 &= ~_BV (PBIT_1);
...
}
// Oder über ein Makro
// OUT_BIT (nibble,2); etc
#define OUT_BIT(var,bit) \
if ((var) & _BV(bit)) \
PORT_ ## bit |= _BV(PBIT_ ## bit); \
else \
PORT_ ## bit &= ~_BV(PBIT_ ## bit)
Ist jedenfalls fixer als über indirekte Portzugriffe, da musst da ja auch noch die Abbilding von Zufallszahl auf Port/Pin machen.
Was ähnliches hatte ioh auch mal vor, und zwar ein Nachbau von TIX LED Clock. Bisher ist es daran gescheitert, passende Flächen-LEDs zu beschaffen. Ich müsste mir welche besorgen (nicht ganz billig die Teile), und für Farben wie grün oder blau aufbohren und mit beschliffenen 3mm LEDs neu bestücken. Pro selbstbestückter Flächen-LED ist man mit knapp 10€ dabei.
Blaue FLEDs hab ich noch nirgendwo gefunden. Rot, gelb und grün mit weiß-diffusem Gehäuse gibt's zB von Lumex und Kingbright. Distributor hab ich nur rs-Components ausmachen können. Reichelt hat ganau diese leider nicht 
Das normale LED-Grün (GaP) ist zudem recht fade, erinnert irgendwie an blassen Kopfsalat. Wenn man sattes Grün will (GaInN) muss man die grünen auch nachbestücken.
Lesezeichen