Doc Browns säkerhet portfölj (5 / 7 steg)
Steg 5: Kör sju segmenterar skärmar
En sju-segment display är bara en samling av sju (eller åtta om den har ett decimalkomma) lysdioder, som kan användas för att visa tal när rätt LED-LAMPORNA lyser.
Det finns två utmaningar att använda dem som jag kommer att diskutera min lösningar på
- Driva 14 lysdioder utan att använda upp alla våra digitala utgångsstift
- Bestämma vilket lysdioder att tända
Kör alla 14 lysdioder från 3 pins: SKIFT register
Intro
Det skulle kräva ca 14 digital utgång stiften för att driva två sju segmenterar skärmar, som bara inte är praktiskt, i stället vi göra använda av SKIFT register. Full drift av ett skiftregister är utanför omfånget för detta Instructable, men här är en länk till en bra tutorial, jag bygger min kod bort deras "Sample 2.3" koden.
Anslutningar från Linkit en till den första skiftregister är följande
latchPin 12 = latch = 12 på ard
skifta reg 11 = klocka = 11 på ard
skifta reg 14 = data = 13 på ard
STIFT 1-7, 15 | Q0 "Q7 | Utgångsstift | |
STIFT 8 | GND | Marken, Vss | |
PIN 9 | Q7 " | Följetong ut | |
STIFT 10 | HERR | Master Reclear, aktiv låg | |
STIFT 11 | SH_CP | Shift registrera klocka pin | |
STIFT 12 | ST_CP | Lagring registrera klocka pin (spärren stift) | |
STIFT 13 | OE | Utgången aktiveras, aktiv låg | |
STIFT 14 | DS | Seriella data ingång | |
PIN 16 | VCC | Positiv spänning |
Se till att du vet om din visar är common-anoden eller common-katod. Mine var common-katoden vilket innebar att jag ansluten varje utgångsstiftet (Q0-Q7) skift register till en av LAMPORNA via ett motstånd och kopplas sedan common-katoden till marken.
När du väljer motstånden för bildskärmen, kom ihåg att en LinkIt använder 3.3V IO och inte 5.5V som Arduino. Jag valde 100 ohms motstånd för 17mA nuvarande (3.3 - 1.6V = 1.7V över resistor), men förmodligen har siktat för full 20mA eftersom de hamnade väldigt tråkig.
Bestämma vilka lysdioder att tända
Jag använde denna tabell för att bestämma segment för ett visst tecken.
Först gjorde jag en kolumn för varje utgångsstiftet SKIFT register, sedan en motsvarande colum, visar vilken pin 7-segment display den ansluter till.
Då jag brukade databladet 7-segment display motsvarar det är pin-koder till segment (segmenten är märkta a-g)
Du kan se att jag gjort en kolumn för varje tecken (0-9) och sedan skrev en 1 om ljuset måste vara på och 0 om det måste vara av (detta är faktiskt en sanning bordlägger). "x" är "bryr mig inte" eftersom det klämmer fast inte används.
Läst kolumnen nedifrån och upp resultaten i ett binärt tal (till exempel tecknet 2 ger oss X1101101) som vi kan konvertera hex och använda i vår kod (char 2 = 01101101 i binär = 0x6D i hex). Jag ersatte alla X med 0, men det spelar ingen roll.
Shift Pin | Seg Pin | Seg namn | 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 |
Detta är den grundläggande kod som jag använde för att testa att jag hade rätt byte för de 10 olika karaktärerna, lyssnar på den seriella porten för flera och utgångar det till första registret, det finns ingen felkontroll om du matar in ett tecken som inte är 0-9.
/*
Skifta registrera exempelvis ändras för att köra en sju seg display
Hårdvara:
* 74HC595 SKIFT register
* Lysdioder kopplat till var och en av utgångarna av skiftregister
*/
PIN ansluten till ST_CP av 74HC595
int latchPin = 12;
PIN ansluten till SH_CP av 74HC595
int clockPin = 11;
PIN ansluten till DS för 74HC595
int dataPin = 13.
hållare för infromation du kommer att passera till skiftande funktion
byte data.
byte dataArray [10].
void setup() {
ställa in stift att produktionen eftersom de behandlas i de viktigaste loopen
pinMode (latchPin, produktionen);
Serial.BEGIN(9600);
Binära notation som kommentar
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;
om (Serial.available() > 0) {
få inkommande byte:
inByte = Serial.read() - '0';
inByte = max (inByte, 0);
inByte = min (inByte, 9);
Ladda rätt ljus ordning från array
data = dataArray [inByte];
marken latchPin och hålla låg för så länge du överföring
digitalWrite (latchPin, 0);
flytta dem ut
shiftOut (dataPin, clockPin, data);
spärr stiftet hög retur till signal chip att det
inte längre behöver lyssna information
digitalWrite (latchPin, 1);
}
}
hjärtat av programmet
void shiftOut (int myDataPin, int myClockPin, byte myDataOut) {
Detta skiftar 8 bitar ut MSB först,
på stigande kanten av klockan,
klockan går på tomgång låg
inställningar för inre funktion
int jag = 0;
int pinState;
pinMode (myClockPin, produktionen);
pinMode (myDataPin, produktionen);
rensa allt ut i fall att
utarbeta skiftregister för lite skiftande
digitalWrite (myDataPin, 0);
digitalWrite (myClockPin, 0);
för varje bit i byte myDataOut
MÄRKA att vi är räknar ner i våra for-loop
Detta innebär att % 00000001 eller "1" kommer att gå igenom sådana
att det blir pin Q0 som lyser.
för (jag = 7; jag > = 0; i--) {
digitalWrite (myClockPin, 0);
om värdet som skickas till myDataOut och en bitmask resultatet
sant då... så om vi är på jag = 6 och vårt värde är
% 11010100 det skulle koden jämför det till % 01000000
och intäkterna till sätta pinState till 1.
om (myDataOut & (1 << jag)) {
pinState = 1;
}
annat {
pinState = 0;
}
Anger PIN-koden till högt eller lågt beroende på pinState
digitalWrite (myDataPin, pinState);
registret skiftar bitarna på upstroken av klocka pin
digitalWrite (myClockPin, 1);
noll data stift efter skift för att förhindra att blöda genom
digitalWrite (myDataPin, 0);
}
stoppa skiftande
digitalWrite (myClockPin, 0);
}