Stap 5: Rijden de zeven Segment Displays
Een 7-segment display is slechts een verzameling van zeven (of acht als er een decimaalteken) LEDS, die kan worden gebruikt om getallen weergeven wanneer de juiste LEDS verlicht.
Er zijn twee uitdagingen aan met behulp van hen die ik zal bespreken mijn oplossingen voor
- Drijvende 14 LEDS zonder gebruik te maken van al onze pins digitale uitgang
- Bepalen van die LED's aan het licht
Alle 14 LEDS van 3 pins rijden: Shift registreert
Intro
Het zou vereisen ongeveer 14 pinnen van de digitale uitgang naar station de twee 7-segment displays, die is gewoon niet praktisch, in plaats daarvan maken we gebruik van shift registers. De volledige werking van een shift register valt buiten het bestek van dit Instructable, maar hier is een link naar een goede tutorial, in feite ik mijn code uit hun "Sample 2.3" code gebaseerd.
De verbindingen van de Linkit een met de eerste shift register zijn als volgt
latchPin 12 = klink = 12 op ard
verschuiving van reg 11 = klok = 11 op ard
verschuiving van reg 14 = data = 13 op ard
1-7, 15 PINS | Q0 "Q7 | Output pinnen | |
PIN 8 | GND | Grond, Vss | |
PIN 9 | Q7 " | Seriële Out | |
PIN 10 | MIJNHEER | Master Reclear, actieve laag | |
PIN 11 | SH_CP | Shift register klok pin | |
PIN 12 | ST_CP | Opslag registreren klok pin (pin-nummer klink) | |
PIN 13 | OE | Uitvoer inschakelen, actieve laag | |
PIN 14 | DS | Seriële data-ingang | |
PIN 16 | VCC | Positieve voedingsspanning |
Zorg ervoor dat u weet of uw beeldschermen common-anode of common-Kathode. Mijne waren common-Kathode, wat betekende dat ik elke uitgang pins (Q0-Q7) van het shift register op een van de LED's via een weerstand aangesloten en vervolgens verbinding met de common-Kathode op grond.
Bij het kiezen van de weerstanden voor uw beeldscherm, vergeet u niet dat de één LinkIt gebruikt 3.3V IO en niet 5.5V zoals de Arduino. Ik koos 100 ohm weerstanden voor 17mA huidige (3.3 - 1.6V = 1.7V over weerstand), maar waarschijnlijk moet hebben gericht voor de volledige 20mA aangezien ze uiteindelijk erg saai.
Bepalen van die LED's aan het licht
Ik gebruikt deze tabel om te bepalen van de segmenten voor een bepaald teken.
Eerst maakte ik een kolom voor elke uitgang pins van het shift register, vervolgens een overeenkomstige colum, tonen welke pin van het 7-segment display het verbindt met.
Dan ik de technische fiche van het 7-segment display gebruikte om te corresponderen haar pin nummers aan segmenten (de segmenten worden geëtiketteerd a-g)
U kunt zien dat ik een kolom voor elk teken (0-9 maakte) en dan schreef een 1 als het licht moet op en 0 als het moet uit (dit is eigenlijk een waarheidstabel). De 'x' zijn 'niet schelen' omdat deze pin wordt niet gebruikt.
Het lezen van de kolom van beneden naar boven de resultaten in een binair getal (bijvoorbeeld het teken 2 geeft ons X1101101) die we converteren kunt naar hex en gebruik in onze code (char 2 = 01101101 in binair = 0x6D in hex). Ik heb alle de X vervangen door 0, maar het maakt geen verschil.
SHIFT Pin | Seg Pin | Seg naam | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Q0 | 2 | A | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
Q1 | 3 | F | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
Q2 | 5 | E | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
Q3 | 9 | D | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
Q4 | 13 | C | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Q5 | 14 | G | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
Q6 | 15 | B | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
Q7 | NC | NC | X | X | X | X | X | X | X | X | X | X |
Dit is de fundamentele code die ik gebruikt om te testen dat ik had de juiste bytes voor de 10 verschillende personages, het luistert op de seriële poort voor een nummer en het-uitgang van het eerste register, is er geen foutcontrole als u een teken dat geen 0-9 invoeren.
/* Shift Register Example, modified to drive a seven seg display Hardware: * 74HC595 shift register * LEDs attached to each of the outputs of the shift register */ //Pin connected to ST_CP of 74HC595 int latchPin = 12; //Pin connected to SH_CP of 74HC595 int clockPin = 11; ////Pin connected to DS of 74HC595 int dataPin = 13; //holders for infromation you're going to pass to shifting function byte data; byte dataArray[10]; void setup() { //set pins to output because they are addressed in the main loop pinMode(latchPin, OUTPUT); Serial.begin(9600); //Binary notation as comment dataArray[0] = 0x5F; //0b01011111 dataArray[1] = 0x50; //0b01010000 dataArray[2] = 0x6D; //0b01101101 dataArray[3] = 0x79; //0b01111001 dataArray[4] = 0x72; //0b01110010 dataArray[5] = 0x3B; //0b00111011 dataArray[6] = 0x3F; //0b00111111 dataArray[7] = 0x51; //0b01010001 dataArray[8] = 0x7F; //0b01111111 dataArray[9] = 0x73; //0b01110011 } void loop() { byte inByte = 0; if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read() - '0'; inByte = max(inByte, 0); inByte = min(inByte, 9); //load the light sequence you want from array data = dataArray[inByte]; //ground latchPin and hold low for as long as you are transmitting digitalWrite(latchPin, 0); //move 'em out shiftOut(dataPin, clockPin, data); //return the latch pin high to signal chip that it //no longer needs to listen for information digitalWrite(latchPin, 1); } } // the heart of the program void shiftOut(int myDataPin, int myClockPin, byte myDataOut) { // This shifts 8 bits out MSB first, //on the rising edge of the clock, //clock idles low //internal function setup int i = 0; int pinState; pinMode(myClockPin, OUTPUT); pinMode(myDataPin, OUTPUT); //clear everything out just in case to //prepare shift register for bit shifting digitalWrite(myDataPin, 0); digitalWrite(myClockPin, 0); //for each bit in the byte myDataOut� //NOTICE THAT WE ARE COUNTING DOWN in our for loop //This means that %00000001 or "1" will go through such //that it will be pin Q0 that lights. for (i = 7; i >= 0; i--) { digitalWrite(myClockPin, 0); //if the value passed to myDataOut and a bitmask result // true then... so if we are at i=6 and our value is // %11010100 it would the code compares it to %01000000 // and proceeds to set pinState to 1. if ( myDataOut & (1 << i) ) { pinState = 1; } else { pinState = 0; } //Sets the pin to HIGH or LOW depending on pinState digitalWrite(myDataPin, pinState); //register shifts bits on upstroke of clock pin digitalWrite(myClockPin, 1); //zero the data pin after shift to prevent bleed through digitalWrite(myDataPin, 0); } //stop shifting digitalWrite(myClockPin, 0); }