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.