BitShifting ist eine Methode, bei welcher einzelne Bits nacheinander über einen Pin des Arduino “geshiftet” – d.h. herausgeschrieben – werden. Diese Funktion kann genutzt werden um z.B. mehrere LEDs mit nur wenigen Pins anzusteuern. Dies kann Sinn machen, wenn man z.B. eine Segmentanzeige mit vielen Stellen steuern möchte.
...
0000
0101
=
5
...1111
1111
=
255
Durch alle Kombinationen lassen sich so mit jedem Byte 256 Werte (von 0 bis 255) darstellen, je nachdem, welches Bit “aktiv” und welches “nicht aktiv” ist. Im folgenden Tutorial wird genau dies mit dem “Beispiel ShiftOut 01″ visualisiert.
...
byte
test = B00100000;
// Direkte Zuweisung des Bit Wertes
byte
test =
40
;
// Zuweisung über den Wert des Bytes
byte
test = bitWrite(test,
3
, HIGH);
// Zuweisung des Wertes über die Funktion bitWrite()
Wenn wir uns nun vorstellen, dass jedes Bit eine LED darstellt, welche je nach Wert des Bits aus EIN od. AUS gesetzt wird, dann können wir mit Hilfe eines Bytes acht unterschiedliche LEDs ansteuern. Es geht also lediglich darum, wie wir ein Byte versenden und dann wieder so decodieren können um damit eine LED zu schalten. Dafür nutzen wir ein ShiftRegister des Types 75HC595. Dieses erlaubt es uns über einen Daten PIN (DATA_PIN) das gesamte Byte zu senden und je nach dessen Wert bis zu acht Ausgänge zu schalten.
...
1x Arduino
1x Shift Register 74HC595 (Datenblatt)
8x Vorwiderstand
1x Display Kingsbright (Datenblatt)
2x Breadboard Mini
...
1. Stellt alle Ziffern von 0-9 auf dem 7-Segment Display dar
2. Vereinfacht euren Code, so dass ihr nur noch ein Array habt, in welchem die Ziffern und entsprechenden LEDs hinterlegt sind.
3. Ergänzt den Code, dass ihr zusätzlich zu den Ziffern auch Buchstaben anzeigen könnt.
CODE
CODE
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#define LATCH_PIN 8 //Pin zu ST_CP vom 74HC595
#define CLOCK_PIN 12 //Pin zu SH_CP vom 74HC595
#define DATA_PIN 11 //Pin zu DS vom 74HC595
void setup()
{
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
}
void loop()
{
registerWrite(B00000011); //oder 0x03
delay(1000);
registerWrite(B10011111); //oder 0x9f
delay(1000);
registerWrite(B00100101); //oder 0x25
delay(1000);
registerWrite(B00001101); //oder 0x0d
delay(1000);
registerWrite(B10011001); //oder 0x99
delay(1000);
registerWrite(B01001001); //oder 0x45
delay(1000);
registerWrite(B01000001); //oder 0x41
delay(1000);
registerWrite(B00011111); //oder 0x1f
delay(1000);
registerWrite(B00000001); //oder 0x01
delay(1000);
registerWrite(B00011001); //oder 0x19
delay(1000);
}
void registerWrite(byte bitsToSend)
{
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, bitsToSend);
digitalWrite(LATCH_PIN, HIGH);
} |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#define LATCH_PIN 8 //Pin zu ST_CP vom 74HC595
#define CLOCK_PIN 12 //Pin zu SH_CP vom 74HC595
#define DATA_PIN 11 //Pin zu DS vom 74HC595
byte number[] =
{
B00000011, //0
B10011111, //1
B00100101, //2
B00001101, //3
B10011001, //4
B01001001, //5
B01000001, //6
B00011111, //7
B00000001, //8
B00011001, //9
};
unsigned long lastTime = 0;
int delayOfDisplay = 1000;
int index = 0;
void setup()
{
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
}
void loop()
{
if(millis()-lastTime > delayOfDisplay)
{
registerWrite(number[index]);
lastTime = millis();
if(index < 9)
{
index++;
}
else
{
index = 0;
}
}
}
void registerWrite(byte bitsToSend)
{
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, bitsToSend);
digitalWrite(LATCH_PIN, HIGH);
} |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
//Selber herausfinden ;-) |