Sida 1 av 1

7-Segment-display

Postat: 6 december 2016, 09:03:50
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

Re: 7-Segment-display

Postat: 6 december 2016, 09:22:50
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.

Re: 7-Segment-display

Postat: 6 december 2016, 11:05:30
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)

Re: 7-Segment-display

Postat: 6 december 2016, 11:31:56
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?

Re: 7-Segment-display

Postat: 6 december 2016, 11:44:26
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".

Re: 7-Segment-display

Postat: 6 december 2016, 23:13:44
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.

Re: 7-Segment-display

Postat: 20 december 2016, 09:26:35
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.