mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD ansprechen mit V850ES


Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mit einem evaluation-board auf dem der V850ES/FF2 sitzt ein 
20x4LCD ansprechen (EA W204B-NLW). Als Programmierumgebung verwende ich 
die IAR Embedded Workbench IDE. Ich hab auch ein einfaches 
funktionierendes Blinklicht geschrieben, also soweit müsste die 
Kommunikation zw PC und Board fehlerfrei funktioniern.

Jedoch sehe ich auf dem Board nur die 1. und die 3. komplett geschwärzt, 
die andern beiden sind leer.

Was mache ich falsch?
Vielen Dank im vorraus für alle Hilfen :)

Gruß Philipp


Dazu hier die relevanten Codes:

main.c:
--------------------------------------------------

#include "LCD.h"
#include "global.h"
#include "70F3233.h"
#include <stdio.h>


void vfn_Main(void)
{



 vfn_InitControllerRegs();



  while(1) 
//Start Hauptprogramm
  {
  Init_LCD();

        lcd_string("Hallo.");
  delay_ms(3000);

  lcd_gotoxy(0,2);
  lcd_string("Dies ist ein Displaytest");           //24 Zeichen (t=nr. 
21)
  delay_ms(3000);

  lcd_gotoxy(0,3);
  lcd_string("ä i ü e ö ß");

  }
}



LCD.c
--------------------------------------------------


#include "io_macros.h"
#include "intrv850.h"
#include "io_v850e_df3233.h"
#include "LCD24.2.h"



//#####################################################
//#####################################################
//delay
//#####################################################
//#####################################################

void delay_us(int time)
{
  int a;
  for(a=0;a<(time);a++)
  {
  for(int i=0;i<21;i++)
    {
    }
  }
}

void delay_ms(int time)
{
  int b;
  for(b=0;b<(time);b++)
  {
  delay_us(1000);
  }
}


//#####################################################
//#####################################################
//Enable
//#####################################################
//#####################################################

void  lcd_enable(void)
{


   delay_us(5);
   P9H = P9H | 0x40;                     // 0100 0000EN     = 1;
   delay_us(5);
   P9H = P9H & 0xBF;                     // 1011 1111 EN    = 0;
   delay_us(5);

}

//#####################################################
//#####################################################
//Busyflag abfragen
//#####################################################
//#####################################################

void  lcd_ready(void)
{
   unsigned int watchdog=0;
   int tmp_BF=1;

   PM9L  = PM9L | 0x80;             //1000 0000 nur P97 als input
   P9H  =  P9H  & 0xBF;                  //1011 1111 EN = 0;


   do
   {
     watchdog++;
     delay_us(5);


     P9H = P9H | 0x22;             //S=1 und RW = 1 => lesen; 0000 0010
     lcd_enable();
     delay_us(5);

     tmp_BF=P9L & 0x80;             //1000 0000

    } while (((tmp_BF) == 1) && (watchdog < 500)); //BusyFlag=0 o. 
Timeout erreicht(500*10µs=5ms)

   delay_us(20);


}

//#####################################################
//#####################################################
//Daten schreiben
//#####################################################
//#####################################################
void lcd_write(unsigned char Befehl,unsigned char Byte)
{

   P9H = P9H & 0xFD;                                    //  1111 1101 
RW=0=schreiben
   unsigned char nibble;                                //  für 
RS/RW/Daten/Befehle

   P9H = P9H | (Befehl<<6);                             // Befehl auf 
Bit 6 von P9H (RS-Bit)

   //High Nibble

   nibble=0x00;
   nibble     = (Byte & 0xC0) +((Byte & 0x30)>>4);     // 1100 0000 bzw 
0011 0000, da P9L 1100-0011- belegt ist
   P9L        = nibble;

   lcd_ready();
   PM9L=0xFF;                                          //  P9L in 
Outputmodus
   lcd_enable();


   //Low Nibble

   nibble=0x00;
   nibble     = ((Byte & 0x0C)<<4) + (Byte & 0x03);    // 0000 1100 bzw 
0000 0011
   P9L        = nibble;

   lcd_ready();
   PM9L=0xFF;                                          //  P9 in 
Outputmodus
   lcd_enable();




}

//#####################################################
//#####################################################
//Display leeren und Cursor at Home
//#####################################################
//#####################################################

void lcd_clear(void)
{
   lcd_write(0,0x01);   //Clear
   delay_ms(2);
   lcd_write(0,0x02);   //Home
}

//#####################################################
//#####################################################
//Initialisierung
//#####################################################
//#####################################################

void Init_LCD(void)
{
   lcd_ready();

   P9H = 0x00;                   //Steuerleitungen auf low
   delay_ms(15);

   P9L= 0x02;                   // 4Bit-Modus
   lcd_enable();

   lcd_ready();
   lcd_clear();
}

//#####################################################
//#####################################################
//String schreiben  EVTL SWITCH UMWANDLN DENN WAS IST MIT ÖÄÜ
//#####################################################
//#####################################################

void lcd_string(unsigned char *str)
{

  while(*str > 0)
  {
  if(*str==0xE4)          // wandle ä in lcd ä
    lcd_write(1,0xE1);
    else
          {
                if (*str == 0xF6)           // wandle ö in lcd ö
                       lcd_write(1,0xEF);
                       else
                   {
                           if (*str == 0xFC)           // wandle ü in 
lcd ü
                  lcd_write(1,0xF5);
                else
                  {

      lcd_write(1,*str);      // Zeichen am LC-Display ausgeben


                }
                   }
     }

  *str++;            // zum nächsten Zeichen des Strings

  }

}

//#####################################################
//#####################################################
//GoTo XY (nur 20x4)
//#####################################################
//#####################################################

void lcd_gotoxy(unsigned char pos_x, unsigned char pos_y)
{
      unsigned char y[4] = {0x00,0x40,0x14,0x54};    //Zeilenadressen 
des HD44780
      lcd_write(0,0x80+pos_x+(y[pos_y]));      //DD Ram Set Address (80h 
ist für Befehlscode)


}

//#####################################################
//#####################################################
//Ausgabe eines Bytes in Hex
//#####################################################
//#####################################################

void lcd_hex(unsigned char Data)
{
   unsigned char hi,lo;

   hi = Data;      //high nibble
   hi = (hi & 0xF0)>>4;

   lo = Data;      //low nibble
   lo = lo & 0x0F;

   if (hi<10)      //Wenn Wert größer 10, dann konvertierung in Hex 
(10=A, 11=B...)
      lcd_write(1, (48 + hi));
   else
      lcd_write(1, (65 + (hi-10)));
   if (lo<10)
      lcd_write(1, (48 + lo));
   else
      lcd_write(1, (65 + (lo-10)));
}

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.