Hallo,
ich progge immer noch für den 16F84 - hab mir aber jetzt einen 18F13?? besorgt - mal sehen. Es klappt jetzt jedenfalls.
Mein Code:
Gruß,Code:#define ENABLE PORTB.F0 #define RS PORTB.F2 #define RW PORTB.F3 #define D4 PORTB.F4 #define D5 PORTB.F5 #define D6 PORTB.F6 #define D7 PORTB.F7 #define T4 TRISB.F4 #define T5 TRISB.F5 #define T6 TRISB.F6 #define T7 TRISB.F7 void inittheLCD (); void schreiben(char byte); void controlachtbit(char byte); void inittheLCD(); void OutLcdControl(char byte); void display_loeschen_cursor(); void display_on(); void display_off(); void cursor_anfang(); void entry_mode(); void zwei_zeilig(); void ausfuehren(); void busy(); void schreiben(char byte); void main() { TRISB = 0; PORTB = 0; TRISA = 0; PORTA = 0; PORTA.F0 = 1; inittheLCD(); PORTA.F0 = 0; schreiben('H'); schreiben('a'); schreiben('l'); schreiben('l'); schreiben('o'); schreiben(' '); schreiben('1'); schreiben('1'); schreiben('e'); schreiben('r'); Delay_ms(10); while(1); } void inittheLCD() { /*Initialisierung des LCD-Displays*/ Delay_ms(250); //LCD auf 8bit initialisieren (3mal) controlachtbit(0b00110000); Delay_ms(250); controlachtbit(0b00110000); Delay_ms(250); controlachtbit(0b00110000); Delay_ms(250); controlachtbit(0b00110000); Delay_ms(250); //LCD auf 4bit initialisieren controlachtbit(0b00100000); Delay_ms(50); //Display loeschen - curser home display_loeschen_cursor(); Delay_ms(1050); //2zeilig zwei_zeilig(); Delay_ms(1050); //Display: aus display_off(); Delay_ms(1050); //Eingabemodus entry_mode(); Delay_ms(1050); //Curser Anfang: cursor_anfang(); Delay_ms(1050); //Display: an display_on(); Delay_ms(1050); } void controlachtbit(char byte) { /*Ein Steuerbyte 8bittig uebertragen*/ PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; ausfuehren(); //Test: PORTA.F3 = D7; return; } void OutLcdControl(char byte){ /*Ein Steuerbyte 4-bittig uebertragen*/ Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; ausfuehren(); Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F0; D5 = byte.F1; D6 = byte.F2; D7 = byte.F3; ausfuehren(); Delay_ms(40);//busy(); //Test: PORTA.F2 = 1; return; } void display_loeschen_cursor(){ //Display wird geloescht und Cursor an den Anfang gesetzt OutLcdControl(1); } void display_on(){ //Display wird eingeschaltet OutLcdControl(0b00001111); } void display_off(){ //Display wird ausgeschaltet OutLcdControl(0b00001000); } void cursor_anfang(){ //Curser wird an den Anfang gesetzt OutLcdControl(3); } void entry_mode(){ //LCD wird auf eingabemodus geschaltet OutLcdControl(0b00000110); } void zwei_zeilig(){ //LCD wird auf 2 zeilig eingestellt OutLcdControl(0b00101000); } void ausfuehren(){ //ein Befehl wird ausgefuehrt (LCD-ENABLE an und aus) ENABLE = 1; Delay_ms(15); ENABLE = 0; Delay_ms(15); } void busy(){ /*Diese Fkt. laueft solange bis das Busyflag 0 ist*/ PORTB = 0; //Datenbus auf Eingabe schalten T4 = 1; T5 = 1; T6 = 1; T7 = 1; RW = 1; while(1){ ENABLE = 1; Delay_ms(10); if(D7 == 0)//Wenn das Busy-Flag 0 ist - dann wird diese Schleife abgebrochen break; ENABLE = 0; Delay_ms(20); ENABLE = 1; Delay_ms(20); ENABLE = 0; Delay_ms(20); } ENABLE = 0; Delay_ms(20); ENABLE = 1; Delay_ms(20); ENABLE = 0; //Datenbus auf Ausgabe schalten T4 = 0; T5 = 0; T6 = 0; T7 = 0; PORTB = 0; } void schreiben(char byte){ Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; RS = 1; ausfuehren(); Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F0; D5 = byte.F1; D6 = byte.F2; D7 = byte.F3; RS = 1; ausfuehren(); Delay_ms(40);//busy(); }
Sebastian







Zitieren

Lesezeichen