Vierstellige 7-Segment Anzeige mit I2C Ansteuerung (Bsp. AiP650)
Eine 4x7 Segmentanzeige kann auch über eine I2C Verbindung angesteuert werden. Dazu gibt es bereits komplette Module wie das JY-MCU. Kern dieser Module ist neben der Anzeige selbst ein Interface IC wie dem AiP650. Dieser IC übernimmt die I2C Kommunikation und das Multiplexen der Anzeige. Neben der Stromversorgung werden nur zwei Leitungen für die Datenübertragung benötigt (SDA und CLK).
Für die Datenübertragung besitzt der AiP650 fünf Slave bzw. Registeradressen. Die Einstellungen für die ganze Anzeige werden in die Adresse 0x24 geschrieben. Die Anzeigedaten für die 8 Segmente (mit Dezimalpunkt) werden von links nach rechts in die Adressen 0x34, 0x35, 0x36 und 0x37 übertragen. Übertragen wird ein Byte.
Die Register für die Anzeigedaten (0x34,0x35,0x36,0x37)
Jedes Bit der Anzeigedaten steht dabei für die Beleuchtung eines Segmentes (1= Segment an, 0= Segment aus). Die Reihenfolge der Segmente ist vom MSB zum LSB: DP-G-F-E-D-C-B-A. Welches Segment welchem Teil der Anzeige entspricht kann man hier nochmal nachschauen.
Das Register für die Einstellungen (0x24)
Alle Einstellungen sind in einem Byte enthalten. Vom MSB zum LSB können folgende Einstellungen vorgenommen werden:
| MSB 7 | keine Verwendung |
| Bit 6 | Einstellung der Helligkeit in 8 Stufen von 000 - 111 |
| Bit 5 | |
| Bit 4 | |
| Bit 3 | Sleepmodus |
| Bit 2 | Alle 8 DP Punkte anschalten |
| Bit 1 | keine Verwendung |
| LSB 0 | 1= Anzeige ein, 0= Anzeige aus. Die Anzeigedaten bleiben gespeichert. Im Hintergrund können neue Daten übertragen werden. |
Programmcode
#include "Wire.h"
// Adressen um Ziffern zu schreiben
#define DIG0 0x34
#define DIG1 0x35
#define DIG2 0x36
#define DIG3 0x37
#define SET 0x24
byte settings = B00000001;
void setup() {
Wire.begin();
displayOn();
clear();
}
void loop() {
show(DIG3, 7, 1); // Anzeige, Zahl, DP (1=an|0=aus)
while(1);
}
Funktionen
void show (byte dig, byte seg, bool dp) {
// Definition der Zahlen (DP|G|F|E|D|C|B|A)
const byte zahl[] =
{ B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111, // 9
B00000000 }; // clear
Wire.beginTransmission(dig);
if (dp == false) Wire.write(zahl[seg]);
else Wire.write(zahl[seg] | B10000000 );
Wire.endTransmission();
}
void clear() {
show(DIG0, 10, 0);
show(DIG1, 10, 0);
show(DIG2, 10, 0);
show(DIG3, 10, 0);
}
void displayOn() {
Wire.beginTransmission(SET);
Wire.write(settings |= B00000001);
Wire.endTransmission();
}
void displayOff() {
Wire.beginTransmission(SET);
Wire.write(settings &= B11111110);
Wire.endTransmission();
}
void setBrightness(byte b) {
b = constrain(b, 0, 7); // nur Werte zwischen 0-7
settings = settings & B10001111; // Bits an Stelle 4-6 löschen
b = b <<4; // bits in 'b' auf Stelle 4-6 schieben
settings = settings | b; // bits in 'b' in Setting übernehmen
Wire.beginTransmission(SET);
Wire.write(settings);
Wire.endTransmission();
}