PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Algorithmus - Ausgabe in Schieberegister



shedepe
07.06.2010, 20:38
Hallo zusammen,
Ich hab hier grad eine Siebensegmentanzeige rumliegen die ich an ein Schieberegister angeschlossen habe. Funktioniert auch alles soweit.
Jetzt frage ich mich jedoch (zu meinem funktionierenden code)
kann man das auch noch besser machen:
Zur Zeit habe ich eine Methode:


void DisplayNumber(uint8_t Number, uint8_t decimalPoint); //Nummer zwischen 0 und 9 wenn decimalPoint != 0 wird der DezimalPunkt angeschaltet


In der Methode sieht das ganze so aus (Nur mal als Beispiel wenn Number==0)


switch (Number)
{
case 0: //Ziffer Null
for(int i = 0; i < 8; i++) //Alle 8 bits durchgehen
{
if(i == 4 || i == 2) //Wenn entsprechendes Segment aus sein soll SERan (PORTC |= (1<<PC7);)
{
if(decimal ==AN) //Wenn der Decimalpunkt An sein soll SERaus (PC7 auf low)
{
if(i==2)
{
SERaus
}
else
{

SERan
}
}
else
{
SERan //Für den Fall dass der Dezimalpunkt nicht an sein soll PC7 auf high --> Segment aus

}

}
else
{
SERaus //Für alle anderen Segmente PC7 auf Low --> Segment an
}
Impuls(); //Schiebe"impuls"

}
break;

//Behandlung der anderen Ziffern


Meine Frage: Ist das Vorgehen so sinnvoll oder sollte ich es komplett anders machen bzw. was könnte ich daran noch optimieren ?

mfg shedepe

sternst
07.06.2010, 22:24
Meine Frage: Ist das Vorgehen so sinnvoll oder sollte ich es komplett anders machen bzw. was könnte ich daran noch optimieren ?
Ja, ich würde das definitiv deutlich anders machen:


#include <avr/pgmspace.h>


#define DECIMAL_POINT_BIT 2

static uint8_t SegmentPattern[] PROGMEM = {

0b11101011, // 0
0b00000000, // 1
0b00000000, // 2
0b00000000, // 3
0b00000000, // 4
0b00000000, // 5
0b00000000, // 6
0b00000000, // 7
0b00000000, // 8
0b00000000 // 9
};


void DisplayNumber (uint8_t Number, uint8_t decimalPoint) {

uint8_t data = pgm_read_byte(&SegmentPattern[Number]);

if (decimalPoint)
data |= (1<<DECIMAL_POINT_BIT);

for (uint8_t mask = 1; mask; mask <<= 1) {
if (data & mask)
SERaus
else
SERan
Impuls();
}
}

Die Daten in SegmentPattern passen so natürlich nicht und müssen angepasst werden (1 = an, 0 = aus). Ich kenne ja schließlich deine Bit/Segment-Zuordnung nicht.

PS: Ich empfinde die SERan und SERaus ohne Semikolon dahinter als ziemlich unschön (und ich bin da sicher nicht der einzige). Nimm die Semikolons aus den Makros raus und platziere sie lieber an "Ort und Stelle".

shedepe
08.06.2010, 20:39
Vielen Dank funktioniert hervorragend, so etwas hatte ich davor auch im Sinn, da ich jedoch nicht wusste wie man in einer Schleife die Bits durchgehen kann hatte ich den anderen Weg gewählt.

Nachdem ich deine for schleife gesehn hab war mir das sofort klar

s.frings
08.06.2010, 20:59
Also den Ausdruck (mask<<=1) finde ich sehr interessant. Auf eine derart einfache Idee wäre ich wohl nicht so schnell gekommen.