mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung C18


Autor: Ingo Schick (schicki)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha (Gast)
Datum:

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

Autor: what? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, Anhang?

Autor: Ingo Schick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;
 }
}
//********************************************************************** 
********

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.