Forum: Mikrocontroller und Digitale Elektronik LCD ansprechen mit V850ES


von Philipp (Gast)


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)));
}

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.