Forum: Mikrocontroller und Digitale Elektronik LCD funktioniert leider nicht Hilfe!


von cela (Gast)


Angehängte Dateien:

Lesenswert?

Ich versuch einfach mal ein simples lcd anzusteuern aber es funktioniert 
leider nicht! Ich vermute die Initialisierung ist vielleicht falsch
Mein mikrocontrollerist Pic 16F648A   mein Stromlaufplan sieht so 
aus(sehen sie bitte das bild)

-> LCD Module 162f BC BC
Meine code :



#include <INLINE.H>     // Ist fuer Assembleranweisungen notwendig
#include <MATH16.H>
/****************** Portbelegung 
********************************************************/

#define RB4 4
#define RB5 5
#define RA0 0
#define RA3 3
//#define LCD_Enable 2      //RA2
//#define LCD_RS     1      //RA1
//#pragma bit LCD_Enable @ PORTA.2
//#pragma bit LCD_RS     @ PORTA.1
#define LCD_RS    0b.00000010             //RS-Pin ist Bit 1, 
RA1
#define LCD_En    0b.00000100         //Enable-Pin ist Bit 2,        RA2


#pragma config |= 0b.11111110100010             // Konfigurationswort
                                                // Bit 4,1-0: FOSC=HS 
(010)
                                                // Bit 2    : WDTE=OFF 
(0)
                                                // Bit 3    : PWRTE=ON 
(0)
                        // Bit 5    : MCLRE( RESET-Pin )=1
                        // Bit 6    : BODEN=off(0)
                        // Bit 7    : LVP  =1 = RB4/PGM pin has PGM 
function, low-voltage programming enabled
                        // Bit 8    : CPD =OFF (1)
                        // Bit 12-9 : Unimplemented
                        // Bit 13   : CP=OFF (1)
/****************** Konstanten 
**********************************************************/

#define  degre  0b11011111 // Das Zeichen ° für Temperatur

// die Display Befehle

 #define CLEAR_DISPLAY       0x01 // DB1 wird gesetzt
 #define CURSOR_HOME         0x02 // DB2 wird gesetzt

 #define SET_FUNKTION        0x20 // DB5 wird gesetzt
 #define ACHT_BIT_MODE       0x10 // DB4 wird gesetzt
 #define ZWEI_LINE           0x08 // DB3 wird gesetzt
 #define DOTs_5x10           0x04 // DB2 wird gesetzt

 #define DISPLAY_CURSER_MODE 0x08 // DB3 wird gesetzt
 #define DISPLAY_ON          0x04 // DB2 wird gesetzt
 #define CURSER_ON           0x02 // DB1 wird gesetzt
 #define BLINKING_ON         0x01 // DB0 wird gesetzt

 #define ENTRY_MODE_SET      0x04 // DB2 wird gesetzt
 #define INKREMENT           0x02 // DB1 wird gesetzt
 #define DISPLAY_IS_SHIFTED  0x01 // DB0 wird gesetzt
 #define code1               0x3F //  00111111
 #define code2               0xFF //  11111111
 #define code3               0xFF //  11111111


void delay_us(char micro)
{
    #asm
    pause  nop
           nop
           decfsz  micro,f
           goto    pause
    #endasm
}


void delay_ms( uns16 ms)
{
  while(ms)        // Schleife verlassen wen ms=0 ist
  {
    OPTION = 2;     // Vorteiler auf 8 einstellen
    TMR0 = 131;     // 125 * 8 = 1000 (= 1 ms)
  while (TMR0);    // abwarten einer Milisekunde
    ms--;        // "ms" mit jeder Milisekunde ernidrigen
    }
}

void display_enable(void)
  {

    PORTA|=LCD_En;
    //LCD_Enable=1;
    delay_us(1);  // kurze Pause
    PORTA &=~(LCD_En);
    //LCD_Enable=0;

  }

void display_befehl(unsigned char command)
   {
    PORTA &=~LCD_RS;     //RS auf 0 setzen

    PORTB &= 0xC0;       // 11000000
    PORTB |= (command & 0x3F);  // 3F= 00111111
    // D6 an PORTA.3, D7 an PORTA.0
    if (command & 0x40) // 1000000
      PORTA |= 0x40;
    else
      PORTA &= ~0x40;

    if (command & 0x80)  //10000000
      PORTA |= 0x80;
    else
      PORTA &= ~0x80;

    display_enable();
    delay_ms(1);
     }



void display_zeichen(unsigned char zeichen)
{

    PORTA|=LCD_RS;   // RS auf 1 setzen--> LCD soll das Zeichen anzeigen
   PORTB &= 0xC0;       // 11000000
    PORTB |= ( zeichen & 0x3F);  // 00111111
    // D6 an PORTA.3, D7 an PORTA.0
    if ( zeichen & 0x40) // 1000000
      PORTA |= 0x40;
    else
      PORTA &= ~0x40;

    if ( zeichen & 0x80)  //10000000
      PORTA |= 0x80;
    else
      PORTA &= ~0x80;

    display_enable();
    delay_ms(1);
}


 // Sende den Befehl zur Löschung des Displays
  void display_clear(void)
  {
    display_befehl(CLEAR_DISPLAY);
    delay_ms(5);
  }

void display_init(void)
{

   delay_ms(15);
   //PORTA  &=~(1<<LCD_RS);

   display_befehl(0x30);
   delay_ms(5);

   display_befehl(0x30);
   delay_us(100);

   display_befehl(0x30);
   delay_us(100);

   display_befehl( SET_FUNKTION | ACHT_BIT_MODE | ZWEI_LINE );  // 8Bit 
Modus  2 Zeilen  5x7
   display_befehl(DISPLAY_CURSER_MODE );  // Display aus  Cursor aus  
kein Blinken
   display_clear();   // Display Clear
   display_befehl(ENTRY_MODE_SET | INKREMENT);  // inkrement / Keine 
shift

   }


  // Sendet den Befehl: Cursor Home
   void cursor_return_home(void)
  {
     display_befehl(CURSOR_HOME);
     delay_ms(5);
   }

 // setzt den Cursor in Zeile und  Spalte
  void set_cursor(unsigned char x, unsigned char y)
  {
    display_befehl(DISPLAY_CURSER_MODE | DISPLAY_ON | CURSER_ON);
    unsigned char position = 0;

    switch (x) {
     case 1: position = 0x80 + 0x00 + y; break;    // 1er Zeile
     case 2: position = 0x80 + 0x40 + y; break;    // 2er Zeile
    }
    display_befehl(position);

  // Curser-Unterstrich ausblinden
    display_befehl(DISPLAY_CURSER_MODE| DISPLAY_ON );
  }

// Schreibt einen String auf das LCD
 void display_string(const char *string)
{
    while(*string) {
        display_zeichen(*string);
        string++;
    }
}

void main(void)
{
  char  c = 'a';
  const char *str = "abcd";
  CMCON=0x07;                        // CMCON  = 0b00000111.... 
Porta=digital I/O
  TRISA=0b.10110000;
  TRISB=0b.11000000;

  display_init();
  display_clear();
  display_string(c);
  display_clear();
  display_string(str);

// set PB7 as output
  TRISB &= ~0x80;
  while(1){
    PORTB ^= 0x80;
  }
}

von holger (Gast)


Lesenswert?

>sehen sie bitte das bild

Welches Bild? Das ist ein Word Dokument.
Wer zieht sich sowas schon rein ;)

von cela (Gast)


Angehängte Dateien:

Lesenswert?

sorry hier ist die schaltung

von holger (Gast)


Lesenswert?

Als erstes:

  char  c = 'a';
  display_string(c);

char ist kein String sondern nur ein Zeichen.
Beide Zeilen schon mal entsorgen. Das kann so nicht gehen.

Was sollen die Dioden und Pulldowns an deinem Display?

Dein Bild sagt fast nichts über deinen Anschluss
des LCD aus. Welches Text-Display hat schon 34 Pins?
Laut deinem Quellcode 8 Bit Ansteuerung.

Trag mal Werte in deine Schaltung ein.

von cela (Gast)


Lesenswert?

Die Schaltung ist nicht von mir gemacht. ich sollte nur Software ….

von Wolfgang-G (Gast)


Lesenswert?

wieviel Stunden hast Du dich mit dem Problem schon beschäftigt?

von cela (Gast)


Lesenswert?

Seit ein paar Tagen    versuche ich dieses Problem zu lösen aber klappt 
leider nicht

von holger (Gast)


Lesenswert?

>Seit ein paar Tagen    versuche ich dieses Problem zu lösen aber klappt
>leider nicht

Das Programm sieht doch gar nicht so schlecht aus.
Hat schon mal irgendwer das Display mit dieser Beschaltung
zum laufen gebracht?

Die Größe der Pulldowns könnte ein Problem sein.
Das Display hat evtl. interne Pullups.
Wegen der Dioden könnte es also passieren das das Display
keinen anständigen Lowpegel mehr bekommt.

Also weg mit den Dioden (überbrücken) und den
Pulldowns (entfernen).

R9 oder R10 könnten für das Backlight sein.
Welcher von beiden kann ich dir nicht sagen.
Problem: Wahrscheinlich ist einer der beiden ein Pulldown
für RW. Der müsste eigentlich auch gebrückt werden.
Falls man da den falschen erwischt ist das Backlight hin !

R12 und R11 sind für den Kontrast. Da sollte man besser
einen 22k Trimmer für nehmen. Versuchsweise mal R11 kurzschliessen.
Mehr als das das Display komplett schwarz wird passiert dann nicht.

von holger (Gast)


Lesenswert?

>R9 oder R10 könnten für das Backlight sein.
>Welcher von beiden kann ich dir nicht sagen.

R10 hängt ja an Plus ;)
Also R9 brücken.

von cela (Gast)


Lesenswert?

Mein Programm läuft Fehler frei. aber  statt erwünschter String zu 
bekommen, bekomme ich nur fff .ich weiß nicht wovon es hängt ab.

von cela (Gast)


Lesenswert?

>Hat schon mal irgendwer das Display mit dieser Beschaltung
>zum laufen gebracht?


Ja aber nicht  C sondern mit assembler

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.