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).
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);
}
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 |
+----------+ +----------+ +----------+
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;
}
}