LCD-Ansteuerung C18

OP #1219664
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
Gast #1219683
Da es vermutlich etwa 100000000000 verschiedene LCD-Controller und 
100000000000000000000 verschiedene LCDs gibt, solltest du deine Frage 
vielleicht etwas präziser formulieren...
Gast #1220627
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++;
 }
}
//********************************************************************** 
********

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.