5x7-Dot-Matrix-Ansteuerung mit dem MAX7219 (für PIC-Mikrocontroller, Elektronik)


zurück zu Elektronik, Homepage


8. Software (in C mit mikroC)

Die hier beschriebenen Unterprogramme orientieren sich sehr stark an Abschnitt 4. Software (in Assembler), werden aber diesmal in der Programmiersprache C für den mikroC-Compiler ausgeführt. Diese Unterprogramme können natürlich auch in Assembler realisiert werden, und sollten auch sehr einfach in andere C-Compiler übergeführt werden können.

Für die Portdefinition und für das Initialisieren des Mikrocontrollers gilt das gleiche wie schon in Abschnitt 4.1. und 4.2. beschrieben, nur die C-Syntax für die Portdefinition unterscheidet sich zu Assembler:

Beim mikroC-Compiler lautet die Portdefinition für einen PIC-Mikrocontroller aus der PIC16Fxx-Familie:

#define MAX7219DIN                PORTB.F4
#define MAX7219LOAD               PORTB.F2
#define MAX7219CLK                PORTB.F5

Bei Verwendung eines PIC-Mikrocontrollers aus der PIC12Fxx-Familie lautet diese Portdefinition wie folgt:

#define MAX7219DIN                GPIO.F4
#define MAX7219LOAD               GPIO.F2
#define MAX7219CLK                GPIO.F5
 

Die Ansteuerung von mehreren (kaskadierten) erfolgt mit den Unterprogrammen MAX7219_INIT2(), MAX7219_KOMMANDO2() und dem Hilfsunterprogramm MAX7219_SENDBYTE(). Die Ziffer 2 bedeutet hier, dass nur zwei MAX7219 kaskadiert sind, werden drei oder mehr MAX7219 hintereinandergeschaltet, so empfiehlt es sich für diese Fälle eigene Unterprogramme zu schreiben, die entsprechend erweitert sind.

In C ist es üblich zusammengehörende Unterprogramme in einer eigenen Datei mit der Endung .C zu schreiben. Die nun folgenden drei Unterprogramme befinden sich daher in einer Datei mit dem Namen MAX7219.C. (siehe 9. Demonstrationsbeispiel 3).

nach oben

8.1. Unterprogramm MAX7219_INIT2()

Aufgabe:
Die beiden kaskadierten MAX7219 initialisieren

Vorgehensweise:
Übergibt nacheinander die Befehle zur Initialisierung an beide MAX7219 (mit Hilfe des Unterprogramms MAX7219_KOMMANDO2)

Übergabeparameter:

Rückgabeparameter:
keiner

Hier das Unterprogramm:

void MAX7219_INIT2(char Scanlimit, char ShutdownFormat, char DecodeMode, char Intensity)
{
    // Scanlimit an beide MAX7219 senden
    MAX7219_KOMMANDO2(0x0b, Scanlimit, 0x0b, Scanlimit);

    // Shutdown-Format an beide MAX7219 senden
    MAX7219_KOMMANDO2(0x0c, ShutdownFormat, 0x0c, ShutdownFormat);

    // Decode-Mode an beide MAX7219 senden
    MAX7219_KOMMANDO2(0x09, DecodeMode, 0x09, DecodeMode);

    // Intensity an beide MAX7219 senden
    MAX7219_KOMMANDO2(0x0a, Intensity, 0x0a, Intensity);
}
nach oben

8.2. Unterprogramm MAX7219_KOMMANDO2()

Aufgabe:
Dieses Programm sendet nacheinander zwei Kommandos an die beiden MAX7219. (Für jeden MAX7219 ein Kommando). Ein Kommando besteht dabei aus acht Adressbits (A7 - A0) und aus acht Datenbits (D7 - D0).

+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
| A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
 MSB                                                                        LSB

Vorgehensweise:

Übergabeparameter:

Rückgabeparameter:
keiner

Hier das Unterprogramm:

void MAX7219_KOMMANDO2(char Adr1, char Data1, char Adr2, char Data2)
{
    // Schritt 1: Steuerleitung LOAD loeschen
    MAX7219LOAD = 0;

    // Schritt 2: Die Adresse des ersten MAX7219 bitweise senden
    MAX7219_SENDBYTE(Adr1);

    // Schritt 3: Die Daten des ersten MAX7219 bitweise senden
    MAX7219_SENDBYTE(Data1);

    // Schritt 4: Die Adresse des zweiten MAX7219 bitweise senden
    MAX7219_SENDBYTE(Adr2);

    // Schritt 5: Die Daten des zweiten MAX7219 bitweise senden
    MAX7219_SENDBYTE(Data2);

    // Schritt 6: Steuerleitung LOAD setzen und ein positive Taktflanke erzeugen
    MAX7219LOAD = 1;
    MAX7219CLK = 1;
}

Anmerkung:
Der 1. MAX7219 ist jener, der vom PIC (Mikrocontroller) am weitesten entfernt ist. Die Adresse und die Daten für den 1. MAX7219 werden also durch den 2. MAX7219 geschoben.

           +----------+     +----------+     +----------+
           |1. MAX7219+-----+2. MAX7219+-----+   PIC    |
           +----------+     +----------+     +----------+
    
nach oben

8.3. Unterprogramm MAX7219_SENDBYTE()

Aufgabe:
Ein Byte seriell (also Bit für Bit) an den MAX7219 senden. Beginnend mit dem MSB (also Bit 7) und dazwischen je einen Takt erzeugen.

              ------- ------- ------- ------- ------- ------- ------- -------
MAX7219DIN   X Bit 7 X Bit 6 X Bit 5 X Bit 4 X Bit 3 X Bit 2 X Bit 1 X Bit 0 X
           -- ------- ------- ------- ------- ------- ------- ------- ------- --

                ---     ---     ---     ---     ---     ---     ---     ---
MAX7219CLK     |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
            ---     ---     ---     ---     ---     ---     ---     ---     ----

Übergabeparameter:
Das zu übertragende Byte (Byte)

Rückgabeparameter:
keiner

Hier das Unterprogramm:

void MAX7219_SENDBYTE(char Byte)
{
    char i;


    for (i=8; i>0; i--)
    {
        // MSB ausgeben
        MAX7219DIN = Byte.F7;

        // Takt erzeugen
        MAX7219CLK = 1;
        MAX7219CLK = 0;

        // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
        Byte = Byte << 1;
    }
}
nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 25. September 2008
Letzte Änderung: