/**********************************************************************************************/ // Include Dateien /**********************************************************************************************/ #include // Headerdatei für den PIC #include "delays.h" // Headerdatei für die Warteschleife /**********************************************************************************************/ // Konfiguration /**********************************************************************************************/ #pragma config FOSC = HS // Taktbereich auswählen #pragma config PWRT = ON // Power On Timer an #pragma config WDT = OFF // Watch dog Timer aus #pragma config BOR = OFF // Brown Out Reset aus #pragma config LVP = OFF // Low Voltage Programming Disable #pragma config PBADEN = OFF // #pragma config VREGEN = OFF // #pragma config MCLRE = ON // Master Clear Reset an /**********************************************************************************************/ // Bezeichner definieren /**********************************************************************************************/ #pragma code #define I_Temp LATAbits.LATA0 #define U_Bat LATAbits.LATA1 #define DCF_LED LATAbits.LATA2 #define DCF_Data LATAbits.LATA3 #define Piezo LATAbits.LATA4 #define DCF_PON LATAbits.LATA5 #define GLCD_RES LATBbits.LATB0 #define GLCD_RS LATCbits.LATC2 #define GLCD_RW LATCbits.LATC7 #define GLCD_E LATCbits.LATC6 #define GLCD_Data LATD #define Backlight LATEbits.LATE1 #define O_Temp LATEbits.LATE2 #define Oben LATEbits.LATE0 //(y+) #define Unten LATBbits.LATB3 //(y-) #define Rechts LATBbits.LATB4 //(x-) #define Links LATBbits.LATB5 //(x+) /**********************************************************************************************/ // Font /**********************************************************************************************/ #define _a GLCD_writebyte(0x61) #define _b GLCD_writebyte(0x62) #define _c GLCD_writebyte(0x63) #define _d GLCD_writebyte(0x64) #define _e GLCD_writebyte(0x65) #define _f GLCD_writebyte(0x66) #define _g GLCD_writebyte(0x67) #define _h GLCD_writebyte(0x68) #define _i GLCD_writebyte(0x69) #define _j GLCD_writebyte(0x6A) #define _k GLCD_writebyte(0x6B) #define _l GLCD_writebyte(0x6C) #define _m GLCD_writebyte(0x6D) #define _n GLCD_writebyte(0x6E) #define _o GLCD_writebyte(0x6F) #define _p GLCD_writebyte(0x70) #define _q GLCD_writebyte(0x71) #define _r GLCD_writebyte(0x72) #define _s GLCD_writebyte(0x73) #define _t GLCD_writebyte(0x74) #define _u GLCD_writebyte(0x75) #define _v GLCD_writebyte(0x76) #define _w GLCD_writebyte(0x77) #define _x GLCD_writebyte(0x78) #define _y GLCD_writebyte(0x79) #define _z GLCD_writebyte(0x7A) #define _A GLCD_writebyte(0x41) #define _B GLCD_writebyte(0x42) #define _C GLCD_writebyte(0x43) #define _D GLCD_writebyte(0x44) #define _E GLCD_writebyte(0x45) #define _F GLCD_writebyte(0x46) #define _G GLCD_writebyte(0x47) #define _H GLCD_writebyte(0x48) #define _I GLCD_writebyte(0x49) #define _J GLCD_writebyte(0x4A) #define _K GLCD_writebyte(0x4B) #define _L GLCD_writebyte(0x4C) #define _M GLCD_writebyte(0x4D) #define _N GLCD_writebyte(0x4E) #define _O GLCD_writebyte(0x4F) #define _P GLCD_writebyte(0x50) #define _Q GLCD_writebyte(0x51) #define _R GLCD_writebyte(0x52) #define _S GLCD_writebyte(0x53) #define _T GLCD_writebyte(0x54) #define _U GLCD_writebyte(0x55) #define _V GLCD_writebyte(0x56) #define _W GLCD_writebyte(0x57) #define _X GLCD_writebyte(0x58) #define _Y GLCD_writebyte(0x59) #define _Z GLCD_writebyte(0x5A) /**********************************************************************************************/ // Globale Variablen deklarieren /**********************************************************************************************/ unsigned char DCF_High; unsigned char Tausender; unsigned char Hunderter; unsigned char Zehner; unsigned char Einer; unsigned char BL; unsigned char DCFon; unsigned char Erg; unsigned int x_pos; unsigned int y_pos; unsigned int Cycle; unsigned int ADWERT; unsigned int ADCe; unsigned char info; unsigned int BAT; unsigned char Volt; unsigned char mVolt; unsigned char Sekunde; unsigned char Minute; unsigned char Stunde; /**********************************************************************************************/ // Programme /**********************************************************************************************/ void DCF77(void); void Setup_ADC(); void BCD_Einer(void); void BCD_Zehner(void); void CheckTime(void); void DCF_Bits(void); void low_isr( void ); void Position(void); void high_isr( void ); void GLCD_Busy(void); void GLCD_Clear(void); void GLCD_Enable(void); void CheckBattery(void); void Alarm(unsigned char cycle); void GLCD_write(unsigned char info); void Read_ADC(unsigned char Channel); void GLCD_writecom(unsigned char info); void GLCD_writebyte(unsigned char info); void GLCD_writedata(unsigned char info); void GLCD_Setpixel(unsigned char x, unsigned char y); void GLCD_SetAdress(unsigned char x, unsigned char y); void GLCD_Line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2); /**********************************************************************************************/ // Interruptroutinen /**********************************************************************************************/ /**********************************************************************************************/ // Low Prio Interrupt /**********************************************************************************************/ #pragma code _LOW_INTERRUPT_VECTOR=0x18 void interrupt_at_low_vector( void ) { _asm GOTO high_isr _endasm } #pragma code #pragma interruptlow low_isr void low_isr( void ) { } /**********************************************************************************************/ // High Prio Interrupt /**********************************************************************************************/ #pragma code _HIGH_INTERRUPT_VECTOR=0x08 void interrupt_at_high_vector( void ) { _asm GOTO high_isr _endasm } #pragma code #pragma interruptlow high_isr void high_isr( void ) { TMR1H=0x80; // Den Timer1 mit 32768 vorladen PIR1bits.TMR1IF=0; // Timer 1 Flag wieder löschen Sekunde++; // 1 Sekunde hoch zählen } /**********************************************************************************************/ // Unterprogramme /**********************************************************************************************/ #pragma code /**********************************************************************************************/ // Erkennt ob ein Touch durchgefüührt wurde /**********************************************************************************************/ void Touch_Erkennung(void) { TRISB=0x08; // Links, Rechts = Ausgänge Unten = Eingänge TRISE=0x01; // Oben = Eingang Links=Rechts=0; // Links, Rechts = GND (0V) INTCON2bits.RBPU=0; // Pullup Widerstände an PORTB aktivieren Erg=PORTB&0x08; // PORTB3 maskieren if(Erg==0) // Wurde getoucht? { // Touch erkannt Erg=PORTE&0x02; if(Erg==0){Backlight=1;} else{Backlight=0;} Delay10KTCYx(200); // Zeitschleife zwecks entprellen } } /**********************************************************************************************/ // Liest die Analogspannung des Touchpanels aus /**********************************************************************************************/ void Position(void) { // Auswerten der X Achsen Position (-) // Die Vier Leitungen des Touchpanels werden wie folgt beschaltet: // Rechts ist als Ausgang definiert und auf High gesetzt (5V(4,7V)) // Links ist ebenfalls als Ausgang definiert und liegt auf Low (GND) // Oben ist als Eingang definiert und ist somit hochohmig, während // Unten ebenfalls als Eingang definiert ist allerdings als ADC. // Durch ein drücken auf das Display entsteht ein Spannungsteiler // jenachdem wie weit man Links drückt geht das Signal gegen GND oder // weiter Rechts gegen Vdd! Somit lässt sich die X-Position bestimmen. TRISE=0x01; // Oben = Eingang TRISB=0x08; // Links, Rechts = Ausgang Unten = Eingang Setup_ADC(); // Analog Digital Wandler einstellen ADCON1=0x05; // AN0-AN9 als Analog Eingänge einstellen Links=0; // Links = GND Rechts=1; // Rechts = 5V Read_ADC(9); // AN9 auslesen x_pos=ADWERT; // Ergebnis in "x_pos" speichern // Auswerten der Y Achsen Position (|) // Die Vier Leitungen des Touchpanels werden wie folgt beschaltet: // Oben wird als Ausgang definiert und auf High (Vdd) gesetzt. // Unten ist ebenfalls als Ausgang definiert liegt aber auf Low (GND). // Links wird als Eingang definiert und ist somit hochohmig. // Rechts ist ebenfalls als Eingang definiert aber als ADC. // Wird nun auf das Display gedrückt geht die Spannung am ADC Eingang // nach GND je weiter unten gedrückt wird und gegen Vdd um so weiter // oben gedrückt wird. So kann die Y-Position bestimmt werden. TRISE=0x00; // Oben = Ausgang TRISB=0x30; // Links, Rechts = Eingang Unten = Ausgang ADCON1=0x03; // AN0-AN11 als Analog Eingänge einstellen Oben=1; // Oben = 5V Unten=0; // Unten = GND Read_ADC(11); // AN11 auslesen y_pos=ADWERT; // Ergebnis in "y_pos" speichern } /**********************************************************************************************/ // Initialisiert das Grafik LCD (Grafik Mode) /**********************************************************************************************/ void GLCD_Init_G(void) { GLCD_RES=0; Delay10KTCYx(1); GLCD_RES=1; GLCD_writecom(0x00); // Mode Con GLCD_writedata(0x32); // Grafik Mode GLCD_writecom(0x01); // Character Pitch GLCD_writedata(0x77); // Chars GLCD_writecom(0x02); // Number of Characters GLCD_writedata(0x13); // 20-1 (0-19) GLCD_writecom(0x03); // Set Duty GLCD_writedata(0x4F); // 80-1 (0-79) GLCD_writecom(0x08); // Start Adresse Low GLCD_writedata(0x00); // 0 GLCD_writecom(0x09); // Start Adresse High GLCD_writedata(0x00); // 0 GLCD_Clear(); // GLCD Inhalt löschen } /**********************************************************************************************/ // Initialisiert das Grafik LCD (Charakter Mode) /**********************************************************************************************/ void GLCD_Init_C(void) { GLCD_RES=0; Delay10KTCYx(1); GLCD_RES=1; GLCD_writecom(0x00); // Mode Con GLCD_writedata(0x30); // Character Mode, Cursor off GLCD_writecom(0x01); // Character Pitch GLCD_writedata(0x77); // 8x8 Chars GLCD_writecom(0x02); // Number of Characters GLCD_writedata(19); // 20-1 (0-19) GLCD_writecom(0x03); // Set Duty GLCD_writedata(79); // 80-1 (0-79) GLCD_writecom(0x04); // Cursor Position GLCD_writedata(0x07); // Line 1 GLCD_writecom(0x08); // Start Adresse Low GLCD_writedata(0x00); // 0 GLCD_writecom(0x09); // Start Adresse High GLCD_writedata(0x00); // 0 GLCD_writecom(0x0A); // Cursor lower adress GLCD_writedata(0x00); // 0 GLCD_writecom(0x0B); // Cursor upper adress GLCD_writedata(0x00); // 0 GLCD_Clear(); // GLCD Inhalt löschen } /**********************************************************************************************/ // Setzt die entsprechenden Bits zum Senden von Daten /**********************************************************************************************/ void GLCD_writedata(unsigned char info) { GLCD_RS=0; GLCD_write(info); } /**********************************************************************************************/ // Setzt die entsprechenden Bits zum Senden eines Befehls /**********************************************************************************************/ void GLCD_writecom(unsigned char info) { GLCD_Busy(); GLCD_RS=1; GLCD_write(info); } /**********************************************************************************************/ // Überträgt Daten/Befehle an das Grafik LCD /**********************************************************************************************/ void GLCD_write(unsigned char info) { GLCD_RW=0; GLCD_Data=info; Delay10TCYx(1); GLCD_Enable(); } /**********************************************************************************************/ // Kontrolliert ob das Display fertig ist /**********************************************************************************************/ void GLCD_Busy(void) { GLCD_RW=1; GLCD_RS=1; GLCD_Enable(); TRISD=0x80; while(LATDbits.LATD7){} TRISD=0x00; } /**********************************************************************************************/ // Setzt die Enable Leitung auf: High|Pause|Low /**********************************************************************************************/ void GLCD_Enable(void) { GLCD_E=1; Delay10TCYx(1); GLCD_E=0; } /**********************************************************************************************/ // Löscht den gesamten Inhalt des Displays /**********************************************************************************************/ void GLCD_Clear(void) { unsigned int i; GLCD_SetAdress(0,0); for (i=0; i<160/8*80; i++) GLCD_writebyte(0); } /**********************************************************************************************/ // Stellt "die" Adresse ein /**********************************************************************************************/ void GLCD_SetAdress(unsigned char x, unsigned char y) { unsigned char adress; adress=y*20+x; GLCD_writecom(0x0A); // write adress low GLCD_writedata(adress&255); GLCD_writecom(0x0B); // write adress high GLCD_writedata(adress/256); } /**********************************************************************************************/ // Auf das Display schreiben /**********************************************************************************************/ void GLCD_writebyte(unsigned char info) { GLCD_writecom(0x0C); GLCD_writedata(info); } /**********************************************************************************************/ // Binär zu Dezimal /**********************************************************************************************/ void BCD_Einer(void) { switch(Einer) { case 0: _0; break; case 1: _1; break; case 2: _2; break; case 3: _3; break; case 4: _4; break; case 5: _5; break; case 6: _6; break; case 7: _7; break; case 8: _8; break; case 9: _9; break; } } void BCD_Zehner(void) { switch(Zehner) { case 0: _0; break; case 1: _1; break; case 2: _2; break; case 3: _3; break; case 4: _4; break; case 5: _5; break; case 6: _6; break; case 7: _7; break; case 8: _8; break; case 9: _9; break; } } void BCD_Hunderter(void) { switch(Zehner) { case 0: _0; break; case 1: _1; break; case 2: _2; break; case 3: _3; break; case 4: _4; break; case 5: _5; break; case 6: _6; break; case 7: _7; break; case 8: _8; break; case 9: _9; break; } } void BCD_Tausender(void) { switch(Zehner) { case 0: _0; break; case 1: _1; break; case 2: _2; break; case 3: _3; break; case 4: _4; break; case 5: _5; break; case 6: _6; break; case 7: _7; break; case 8: _8; break; case 9: _9; break; } } /**********************************************************************************************/ // Hauptprogramm /**********************************************************************************************/ #pragma code void main(void) { LATA = 0x00; // PORTA löschen (kann beim Start undef. Zustand annehmen) LATB = 0x00; // PORTB löschen (kann beim Start undef. Zustand annehmen) LATC = 0x00; // PORTC löschen (kann beim Start undef. Zustand annehmen) LATD = 0x00; // PORTC löschen (kann beim Start undef. Zustand annehmen) LATE = 0x00; // TRISA = 0x0B; // TRISB = 0xFC; // TRISC = 0x03; // TRISD = 0x00; // TRISE = 0x00; // Sekunde=Minute=Stunde=0; /**********************************************************************************************/ ADCON1=0x0F; // Alle Port Pins auf Digital gesetzt CMCON=0x07; // Komparatoreinänge deaktivieren INTCON2bits.RBPU=0; // PORTB Pullups are disabled PORTEbits.RDPU=0; // PORTD Pullups are disabled /**********************************************************************************************/ GLCD_Init_C(); GLCD_SetAdress(0,0); _H;_a;_l;_l;_o;__;_W;_e;_l;_t; while(1) { } }