Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung C18


von Ingo S. (schicki)


Lesenswert?

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

von Micha (Gast)


Lesenswert?

Da es vermutlich etwa 100000000000 verschiedene LCD-Controller und 
100000000000000000000 verschiedene LCDs gibt, solltest du deine Frage 
vielleicht etwas präziser formulieren...

von what? (Gast)


Lesenswert?

Ähm, Anhang?

von Ingo Schick (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.