DIY Apple klockan (3 / 10 steg)
Steg 3: Prototyping fortsatte
ShiftDatas.ino rymmer i princip matrisen som har byte för varje tecken/nummer som kan visas.
Det har också display() funktion vilket egentligen skiftar ut en byte för ett tecken för en siffra, stänger av, skiftar ut en annan byte och stänger av en annan siffra. Detta multiplexing.
byte siffror [21] =
{
0xFC, //0 fallet 0
0x60, //1 fall 1
0xDA, //2 fall 2
0xF2, //3 fall 3
0x66, //4 fall 4
0xB6, //5 fall 5
0xBE, //6 fall 6
0xE0, //7 ärende 7
0xFE, //8 ärende 8
0xE6, //9 fall 9
0xFD, / / 0. ärende 10
0x61, / / 1. fallet 11
0xDB, / / 2. ärende 12
0xF3, / / 3. ärende 13
0x67, / / 4. fallet 14
0xB7, / / 5. fallet 15
0xBF, / / 6. fall 16
0xE1, / / 7. fall 17
0xFF, / / 8. fall 18
0xE7, / / 9. fallet 19
0x00, //BLANK fall 20
};
Detta är mängd tecken. Du kan ringa en viss byte "n" genom att ringa siffror [n].
Som jag sa tidigare, Q0, Q1, Q2, Q3, Q4, Q5, F6 och F7 varje kontroll a, b, c, d, e, f, g och dp respektive.
Om jag ville visa numret "0", jag nöd till vända på segment a, b, c, d, e och f. Detta innebär SKIFT register behov att skifta ut 0b11111100, som är ett hexadecimalt 0xFC.
Det är hur jag gjorde det.
4 argument för 4 skärmar.
Denna del är att multiplex.
void display (int disp1 int disp2, int disp3, int disp4)
{
Första siffran (tiotals timmar)
digitalWrite (latchPin, låg);
shiftOut (dataPin, clockPin, LSBFIRST, digits[disp1]);
digitalWrite (latchPin, hög);
digitalWrite (dig1Pin, låg);
digitalWrite (dig2Pin, hög);
digitalWrite (dig3Pin, hög);
digitalWrite (dig4Pin, hög);
Andra siffran (timmar ettor)
digitalWrite (latchPin, låg);
shiftOut (dataPin, clockPin, LSBFIRST, digits[disp2]);
digitalWrite (latchPin, hög);
digitalWrite (dig1Pin, hög);
digitalWrite (dig2Pin, låg);
digitalWrite (dig3Pin, hög);
digitalWrite (dig4Pin, hög);
Tredje siffran (tiotals minuter)
digitalWrite (latchPin, låg);
shiftOut (dataPin, clockPin, LSBFIRST, digits[disp3]);
digitalWrite (latchPin, hög);
digitalWrite (dig1Pin, hög);
digitalWrite (dig2Pin, hög);
digitalWrite (dig3Pin, låg);
digitalWrite (dig4Pin, hög);
Fjärde siffran (minuter ettor)
digitalWrite (latchPin, låg);
shiftOut (dataPin, clockPin, LSBFIRST, digits[disp4]);
digitalWrite (latchPin, hög);
digitalWrite (dig1Pin, hög);
digitalWrite (dig2Pin, hög);
digitalWrite (dig3Pin, hög);
digitalWrite (dig4Pin, låg);
}
Kom ihåg tidigare hur jag skrev display (dig1, dig2, dig3, dig4) i den WATCHG koden?
Varje argument hanteras i denna funktion.
Kan säga jag ville Visa 04:20. Detta innebär dig1 är 0, dig2 är 4, dig3 är 2 och dig1 är 0.
Om du vill visa alla nummer, gör jag detta:
- flytta ut bitar för 0, slå på dig4
- stänga av dig4, flytta ut bitar för 2, slå på dig3.
- stänga av dig3, flytta ut bitar för 4, slå på dig2.
stänga av dig2, flytta ut bitar för 0, slå på dig1.
Och sedan cykla för evigt. Mikrokontroller gör det så snabbt numren visas att visa på samma gång, men var och en slå på och av riktigt snabb.