7-Segment-display

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
KONSTAPEL-MURMEL
Inlägg: 245
Blev medlem: 19 september 2005, 17:16:08

7-Segment-display

Inlägg av KONSTAPEL-MURMEL »

Kan någon förklara denna koden för mig?


//-----------------------------------------------------//
// Draw digit on 7-Segment LED Display (fast) //
//-----------------------------------------------------//
void drawDigitFast(int n)
{
const byte aPins[8] = {
segA, segB, segC, segD, segE, segF, segG, segH
};
const byte aSegments[10] ∞ = {
// A B C D E F G H
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW }, // 0
{ LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW }, // 1
{ HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, LOW }, // 2
{ HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, LOW }, // 3
{ LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW }, // 4
{ HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW }, // 5
{ HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW }, // 6
{ HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW }, // 7
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW }, // 8
{ HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW }, // 9
};
for( int i = 0; i < 8; i++ )
{
digitalWrite( aPins, aSegments[n] );
}
}

Tack på förhand
Senast redigerad av KONSTAPEL-MURMEL 6 december 2016, 10:23:21, redigerad totalt 1 gång.
X-IL
EF Sponsor
Inlägg: 8261
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: 7-Segment-display

Inlägg av X-IL »

För den siffra du matar in (n) loopar den åtta gånger och skriver 0(LOW) eller 1(HIGH)(beroende på vad som är definierat för det siffran n och aktuellt segment(i) i arrayen), till pinnen som ligger på plats i i arrayen över pinnar (segA,segB osv).

Den skriver alltså hög eller låg signal på en pinne som motsvarar ett segment i displayen, och upprepar tills den skrivit till alla 8 segmenten i en sjusegmentare :)

EDIT: SegA,SegB osv är definierade nån annanstans i koden som integers som motsvarar de pinnar varje segment är kopplat mot.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 7-Segment-display

Inlägg av rvl »

KONSTAPEL-MURMEL skrev: ...
const byte aSegments[10] ∞ = {
...
Tydligen:

Kod: Markera allt

    const byte aSegments[10]∞ = {
Använd [ Code ]-taggar runt koden så blir det både mer lättläst och fritt från automatiska forumkonverteringar.
jämför t.ex:
test = foo[1]∞ + bar(1 + 8)

Kod: Markera allt

test = foo[1]∞ + bar(1 + 8)
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: 7-Segment-display

Inlägg av adent »

Koden är iofs läsbar, men lite utrymmesineffektiv.

Nu är jag ju den förste att föredra läsbarhet... Men.

Plockar du fram ett datablad på en sju-segmentsdisplay ser du att de sju
segmenten (8 med punkt) är "numrerade" A-H.

Men det känns som det fattas kod?
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 7-Segment-display

Inlägg av rvl »

Ett liknande mer fullständigt exempel:
https://github.com/makbit/LED7Segments/ ... gments.ino
(googlade på någon välvald del av koden)
Multiplexandet är väl främsta orsaken till att man vill att det ska gå "fast".
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: 7-Segment-display

Inlägg av Mr Andersson »

Är det bara jag som stör mig på namnet drawDigitFast när det är raka motsatsen? :doubt:
Dels skrivs pinnarna en och en istället för alla 8 på en gång, och sen används digitalWrite() som är mer än 10 gånger långsammare än att skriva direkt till porten.
Och med dubbla array-derefs för varje iteration är det förmodligen snabbare med en switch och 8x digitalWrite() i varje case.
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: 7-Segment-display

Inlägg av Wedge »

Initieringen av de två lokala arrayerna görs varje gång funktionen körs, och är icke-Fast så det skriker om det. Varför, varför, varför...!?

I övrigt kan man väl se hanteringen pinne för pinne som en fördel också, man är fri att använda vilka pinnar man vill, och i vilken ordning som helst.
Skriv svar