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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.