Enkelt sett är ett shiftregister Seriell data in paralell data ut.
I bilden ovan är det 8 bitar ut,
det går att koppla många shiftregister efter var andra.
100st blir 800 bitar ut.
Klicka på bilden för att se bättre.
Inkoppling till Uno-kortet.
Dubbla rader med hylslist gör att det inte behövs ett
kopplingsdäck för att få plats med alla kablar.
Se hur benen på hylslisten är vikt mot nästa löd-ö,
för att bygla. kommer att användas flitigt framöver.
Hylslist lödad
IC-hållare lödad och vissa motstånd.
Hylslisten är kapad med avbitare och putsad med kniv.
Lättare att löda om hylslisten hålls fast av displayen.
Framsidan när allt är lödat. Dax montera displayen.
Och baksidan när allt är klart.
Alla stift använd inte i detta exempel, kommer mer framtiden.
Kanske en termometer med två displayer.
/*
Experiment med Arduino Uno R3
7 segments display och shift register som drivare.
Detta program är skapat av Per-Anders Hult.
Denna skript ar publicerad för det kit och komponenter som vi
säljer på Tradera under namnet pc_h
Denna skript får av andra personer endast användas i privat bruk.
Om all text i denna anmärkning bibehålls, får denna skript ändras och förbättras och publiceras igen.
Om den översätts till annat språk måste även denna text översättas.
Om du publicerar denna skript igen, så skriv ditt namn eller alias här.
Denna skript är ändrad av: (skriv ditt namn här)
*/
int latchPin = 8; //Latch clock(IC. ben 12)
int clockPin = 12; //Shift clock(IC. ben 11)
int dataPin = 11; //Seriel data input(IC. ben 14)
//Glöm inte att koppla Reset till Vcc
byte dataSegments[42];
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
dataSegments[0] = B00111111; //
dataSegments[1] = B00000110; //
dataSegments[2] = B01011011; //
dataSegments[3] = B01001111; //
dataSegments[4] = B01100110; //
dataSegments[5] = B01101101; //
dataSegments[6] = B01111101; //Alternativ B01111100
dataSegments[7] = B00000111; //Alternativ B00100111
dataSegments[8] = B01111111; //
dataSegments[9] = B01101111; //Alternativ B01100111
dataSegments[10] = B01110111; //A
dataSegments[11] = B01111100; //B
dataSegments[12] = B00111001; //C
dataSegments[13] = B01011110; //D
dataSegments[14] = B01111001; //E
dataSegments[15] = B01110001; //F
dataSegments[16] = B11010011; //?
dataSegments[17] = B00000001; //
dataSegments[18] = B00000010; //
dataSegments[19] = B00000100; //
dataSegments[20] = B00001000; //
dataSegments[21] = B00010000; //
dataSegments[22] = B00100000; //
dataSegments[23] = B00000001; //
dataSegments[24] = B00100010; //
dataSegments[25] = B00010100; //
dataSegments[26] = B00001000; //
dataSegments[27] = B00000000; //
dataSegments[28] = B00000001; //
dataSegments[29] = B01000000; //
dataSegments[30] = B00001000; //
dataSegments[31] = B01000000; //
dataSegments[32] = B00000001; //
dataSegments[33] = B00000000; //
dataSegments[34] = B00000001; //
dataSegments[35] = B00000010; //
dataSegments[36] = B01000000; //
dataSegments[37] = B00010000; //
dataSegments[38] = B00001000; //
dataSegments[39] = B00000100; //
dataSegments[40] = B01000000; //
dataSegments[41] = B00100000; //
}
void loop() {
for (int i=0; i<=16; i++) {
digitalWrite(latchPin, 0);
SkrivEnNibble(i);
digitalWrite(latchPin, 1);
delay(500);
}
//Rotera runt
for (int j=1; j<=10; j++) { //gör det tio gånger
for (int i=17; i<=22; i++) { //Datasegment 17 till 22
digitalWrite(latchPin, 0);
byte dataOut = dataSegments[i];
SkrivData(dataOut);
digitalWrite(latchPin, 1);
delay(50);
}
}
//Faller
for (int j=1; j<=10; j++) { //gör det tio gånger
for (int i=23; i<=27; i++) { //Datasegment 23 till 27
digitalWrite(latchPin, 0);
byte dataOut = dataSegments[i];
SkrivData(dataOut);
digitalWrite(latchPin, 1);
delay(100);
}
}
//Nivå
for (int j=1; j<=10; j++) { //gör det tio gånger
for (int i=28; i<=33; i++) { //Datasegment 28 till 33
digitalWrite(latchPin, 0);
byte dataOut = dataSegments[i];
SkrivData(dataOut);
digitalWrite(latchPin, 1);
delay(100);
}
}
//Kör i en åtta
for (int j=1; j<=10; j++) { //gör det tio gånger
for (int i=34; i<=41; i++) { //Datasegment 34 till 41
digitalWrite(latchPin, 0);
byte dataOut = dataSegments[i];
SkrivData(dataOut);
digitalWrite(latchPin, 1);
delay(200);
}
}
}
//Skriver ett halvt hexadecimalt(0-F) tecken, Det heter Nibble(Nybble)
//Om för högt tal eller för lågt tal skriver displayen ett ganska fult frågetecken.
void SkrivEnNibble(int nibble){
if( nibble >= 0 & nibble < 16 ){
byte dataOut = dataSegments[nibble];
SkrivData(dataOut);
}else{
byte dataOut = dataSegments[16];
SkrivData(dataOut);
}
}
//Skriver ett decimalt tecken(0-9).
//Om för högt tal eller för lågt tal skriver displayen ett ganska fult frågetecken.
void SkrivEnSiffra(int Siffra){
if( Siffra >= 0 & Siffra < 10 ){
byte dataOut = dataSegments[Siffra];
SkrivData(dataOut);
}else{
byte dataOut = dataSegments[16];
SkrivData(dataOut);
}
}
//Skriver rå data till displayen
//OBS. Skriver seriedata i full hastighet till IC:en, inga 'delay()'
//Det är full hastighet som UNO-kortet klarar, ändå inga skriv-fel.
void SkrivData(byte data){
int i;
digitalWrite(dataPin, 0);
digitalWrite(clockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(clockPin, 0);
if ( data & (1<<i) ) {
digitalWrite(dataPin, 1);
}
else {
digitalWrite(dataPin, 0);
}
digitalWrite(clockPin, 1);
}
digitalWrite(clockPin, 0);
}