// Testprogramm: MAX7219 LED-Treiber.

// 20 MHz
#include <16F871.H>

// Speicherschutz12,13,4,5=aus,Debug1,1=aus,ProgrammFlash9=an,EEpromRead8=an,
// NiedervoltProgr7=aus, NiederVoltReset6=an,EinschaltTimer3=an,
// WachDogTimer2=aus,Oszillator0,1=XC
#pragma config |= 0b.11.111101.11.00.10


#pragma bit SCK @ PORTC.3   //Ausgang Clock
#pragma bit SDO @ PORTC.5   //Ausgang Daten Output
#pragma bit LOAD @ PORTC.4   //Load

#pragma origin 100          // Adresse des Programms


//******************************************************************************
void InitUSART()
{
    BRGH=1;
    SPBRG=129;              // (9600 baud @ 20MHz input clock)
    SPEN = 1;               // Set_Serial_Pins;
    SYNC = 0;               // Set_Async_Mode;
    TX9 = 0;                // Set_8bit_Tx;
    RX9 = 0;                // Set_8bit_Rx;
    CREN = 1;               // Enable_Rx;
    TXEN = 1;               // Enable_Tx;
    RCIE=0;                 // Rx Interrupt aus
}

//*******  Zeitverzögerung-Fnktion  *************************************************

void delay_mks( char mikro)
{
    #asm
    wdh9    nop
    nop
    decfsz  mikro,f
    goto    wdh9
    #endasm
}

void SPI(char out)      // SPI-Softwaremaesig Frequenz etwa 620 kHz
{
    char i;
    for (i=0;i<8;i++)
    {
        nop2();
        SCK=0;              // Abfahlende Flanke des Clocks
        nop();
        SDO=out.7;          // Daten vorbereiten
        nop();
        out=out<<1;
        nop2();
        SCK=1;              // Steigende Flanke des Clocks
        nop();
    }
}
void LED_Befehl (char Adr, char Dat)
{
    LOAD=0;
    SPI(Adr);  
    SPI(Dat);
    LOAD=1;
    delay_mks(1);
}
void LED_Ausgabe (char Zahl)
{
char temp;
temp=Zahl/10;
LED_Befehl (0x02,temp); // 2 Stelle
temp=Zahl-temp*10;
LED_Befehl (0x01,temp); // 1 Stelle
}

void main(void)
{
    TRISC=0b.1100.0011;     // sck rc3-0, sdo rc5-0, CS rc2-0.
    TRISD=0b.1111.1100;
    LOAD=1;
    delay_mks(1);


LED_Befehl (0x0b, 0x01);// Hier wird die Anzahl der Digits angegeben (2 Digits)
LED_Befehl (0x0c, 0x01);// Displays werden auf Normal-Betrieb gesetzt (kein Shutdown)
LED_Befehl (0x09, 0xff);// Displays werden auf Normal-Betrieb gesetzt (kein Displaytest)   
LED_Befehl (0x0a, 0x05);// Die Helligkeit der Digits wird hier eingestellt
 
LED_Ausgabe (12);       // Zahl 12 ausgeben

    while(1);           // Programm Stopt hier

}                           // Ende des Hauptprogramms

