7-Segment-display
-
- Inlägg: 245
- Blev medlem: 19 september 2005, 17:16:08
7-Segment-display
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
//-----------------------------------------------------//
// 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.
Re: 7-Segment-display
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.
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.
Re: 7-Segment-display
Tydligen:KONSTAPEL-MURMEL skrev: ...
const byte aSegments[10] ∞ = {
...
Kod: Markera allt
const byte aSegments[10]∞ = {
jämför t.ex:
test = foo[1]∞ + bar(1 +
Kod: Markera allt
test = foo[1]∞ + bar(1 + 8)
Re: 7-Segment-display
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?
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?
Re: 7-Segment-display
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".
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".
-
- Inlägg: 1394
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: 7-Segment-display
Är det bara jag som stör mig på namnet drawDigitFast när det är raka motsatsen?
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.
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.
Re: 7-Segment-display
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.
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.