Hallo Zusammen, hat jemand von Euch da draussen eine funktionierende C Routine für den C18 Compiler für den PIC18F452. Ich habe versucht eine eigene LCD Routine am PIC anzubinden. Leider komme ich über die Initalisierung nicht hinaus. Im Anhang ist die Deklarierung der einzelnen Bits. Die C-Routine vom c18 funktioniert auch nicht so ganz.... Vielen Dank Ingo
Da es vermutlich etwa 100000000000 verschiedene LCD-Controller und 100000000000000000000 verschiedene LCDs gibt, solltest du deine Frage vielleicht etwas präziser formulieren...
Hi, ich habe den Quelltext mal eingefügt, es geht um den normalen Hitachi Treiber con einem handelsüblichen LCD. Kein abnormales LCD usw... Kompiliert wird vom C18 das ganze, initalisieren tut sich das ganze auch, aber anzeiegen leider nicht.... Tktfreuenz des PIC ist 20 MhZ //********************************************************************** ******** // Unterprogramme für die LCD Anzeige // Programmierer: Ingo Schick // Datum: 05.04.2009 //********************************************************************** ******** //********************************************************************** ******** // Allgemeine Definitionen //********************************************************************** ******** #define LCD PORTD #define LCD_RS PORTDbits.RD0 #define LCD_RW PORTDbits.RD1 #if (HardwareVersion == 1) #define LCD_EN PORTDbits.RD2 // Standard-Verschaltung #define LCD_EN2 PORTDbits.RD3 #else #define LCD_EN2 PORTDbits.RD2 // CC5X-Verschaltung #define LCD_EN PORTDbits.RD3 #endif char gcText[27]; // Variable für die Textausgaben 27 weil 27 Zeichen pro Zeile //********************************************************************** ******** // Allgemeine Funktionen //********************************************************************** ******** void LCD_WRITE(char LCDX) { if (LCDX == 1) LCD_EN=1; else LCD_EN2=1; Delay1KTCYx(5); LCD_EN = 0; LCD_EN2 = 0; } //********************************************************************** ******** //********************************************************************** ******** // LCD-Display initialisieren //********************************************************************** ******** void LCD_INIT(char LCDX) { // Nach Power on 20ms warten; Delay1KTCYx(10); // Initialisierung nach dem Reset. Internes geplenkel LCD = 0x30; LCD_WRITE(LCDX); Delay1KTCYx(50); LCD = 0x30; LCD_WRITE(LCDX); Delay1KTCYx(5); LCD = 0x30; LCD_WRITE(LCDX); Delay1KTCYx(50); // Umschalten auf 4 Bit Transfere LCD = 0x20; LCD_WRITE(LCDX); Delay1KTCYx(50); // nochmals Umschalten auf 4 Bit Transfere nun mit Zusatz, daß auf 2 Zeiliges Display umgestellt wird LCD = 0x20; LCD_WRITE(LCDX); LCD = 0x80; LCD_WRITE(LCDX); Delay1KTCYx(50); // ANZEIGE EIN/AUS -- 1DC0 LCD = 0x00; LCD_WRITE(LCDX); LCD = 0xc0; LCD_WRITE(LCDX); Delay1KTCYx(50); // EINGABEMODUS SETZEN -- 0110 LCD = 0x00; LCD_WRITE(LCDX); LCD = 0x60; LCD_WRITE(LCDX); Delay1KTCYx(50); // ANZEIGE/CRSR POSITION -- SC = 0 RL = 1 LCD = 0x10; LCD_WRITE(LCDX); LCD = 0x40; LCD_WRITE(LCDX); Delay1KTCYx(50); } void LCD_Init (void) { LCD_INIT(1); LCD_INIT(2); } //********************************************************************** ******** //********************************************************************** ******** // LCD-Display löschen //********************************************************************** ******** void LCD_CLR(char LCDX) { // ANZEIGE LÖSCHEN LCD = 0x00; LCD_WRITE(LCDX); LCD = 0x10; LCD_WRITE(LCDX); Delay1KTCYx(10); } void LCD_Clear (void) { LCD_CLR(1); LCD_CLR(2); } //********************************************************************** ******** //********************************************************************** ******** // Zeichen an LCD-Display schreiben //********************************************************************** ******** void LCD_PRINT(unsigned char y,unsigned char x, const char *__putstr) { char cZeichen; unsigned char hb,lb,LCDX; if (y==3) { y = 1; LCDX = 2; } else if ( y==4) { y = 2; LCDX = 2; } else LCDX = 1; hb = x & 0xf0; // aus x das hb rausfiltern if (y == 2) hb = hb| 0x40; LCD = 0x80|hb; LCD_WRITE(LCDX); // Zeile 1 LCD = 0x00|(x-1); LCD = LCD << 4; LCD_WRITE(LCDX); // Spalte x while(*__putstr != 0) // Text ausgeben { cZeichen = *__putstr; switch(*__putstr) { case 'ä' : cZeichen = 0xE1; break; //Umlenkung auf neuen Zeichen Code case 'ö' : cZeichen = 0xEF; break; case 'ü' : cZeichen = 0xF5; break; case 'ß' : cZeichen = 0xE2; break; case 'Ä' : cZeichen = 0x00; break; //Umlenkung ins Character RAM case 'Ö' : cZeichen = 0x01; break; case 'Ü' : cZeichen = 0x02; break; case '°' : cZeichen = 0xDF; break; case 'µ' : cZeichen = 0xE4; break; case '^' : cZeichen = 0xF4; break; // Ohm-Zeichen case '~' : cZeichen = 0xF7; break; // PI-Zeichen } lb= cZeichen & 0x0f; hb= (cZeichen & 0xf0); LCD = 0x01|hb; LCD_WRITE(LCDX); LCD = 0x01|(lb<<4); LCD_WRITE(LCDX); __putstr++; } } //********************************************************************** ********
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.