// Ansteuerung von I2C LCD-Anzeige DSM-0822A von Pollin
// Lauftext
// Michael Dworkin
// 03.06.2003
// Compiler CC5x

#include <16F871.H>
// Speihersutz121345=aus,Debug11=aus,ProgrammFlash9=an,EEpromRead8=an,NiendervoltProgr7=aus
// NiederVoltReset6=an,EinschaltTimer3=an,WachDogTimer2=aus,Oszilator01=HC
#pragma config |= 0b.11.111101.11.00.10
#pragma origin 100              // Ab Adresse 100 im Programmspeicher
#pragma bit sda @ PORTB.7       // Datenleitung SDA
#pragma bit scl @ PORTB.6       // Taktleitung SCL
#pragma bit tsda @ TRISB.7      // Datenleitung SDA IN/AUT - Umschalter
#pragma bit tscl @ TRISB.6      // Taktleitung SCL  IN/AUT - Umschalter
#include "I2C.c"                // I2C-Kommunikation
#include "DSM-0822A.c"          // DSM-0822A Treibern
//******************************************************************************
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
}

void Delay1ms( uns16 time)
{
    char next = 0;
    OPTION = 6; // prescaler divide TMR0 rate by 128
    TMR0 = 0;  //
    do
    {
        next += 39; // 4992=128*39 ,4992+15=5007/5=1,0014ms
        clrwdt();  // needed only if watchdog is enabled
        while (TMR0 != next)   // 125 * 8 = 1000 (= 1 ms)
            ;
    }
    while ( -- time != 0);
}


void Lauftext(const char *__putstr)
{
    char __ps,z;
    const char *__Temp;
    uns8 i;
    i=0;
    while (1)
    {
        z=0;
        __Temp=__putstr+i;
        __ps = *__Temp;
        while(z<8)
        {
            __Temp++;
            if (__ps== 0) break;
            Ausgabe(z,__ps);
            __ps = *__Temp;
            z++;
        }
        Delay1ms(400);
        if (__ps== 0) break;
        i++;
    }
}
//*******************************************************
// Hauptprogramm
//*******************************************************
void main()
{
    char i;
    TRISB=0b00111111;       //Alles Ausgänge
    TRISC=0b.1101.0011;     // sck rc3-0, sdo rc5-0, CS rc2-0.

    InitUSART();            // Hardwareschnittstelle des PICs einstellen
    while(!TXIF);           // Prüfen, ob Sender frei ist
    TXREG ='B';             // Bereitzeichen senden

    LCD_Init();
    Lauftext("       MICHAEL DWORKIN MACHT LAUFTEXT");  
    Delay1ms(1000);
    Lauftext("       BESUCHEN SIE MEINE WEBSEITE WWW.CC5X.DE.VU");
    Delay1ms(700);
    LCDString(0,"TSCHUSS!");
    while(1);               // Programm stoppt hier
}