Arduino Mikrocontroller Tutorials - Module

Vierstellige 7-Segment Anzeige mit I2C Ansteuerung (Bsp. AiP650)

Vierstellige 7 Segmentanzeige
Vierstellige 7 Segmentanzeige

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(); }