Hallo,
mit meinem Pic (16F84A) möchte ich eine LCD-Anzeige (2*16) ansteuern und "Hallo" ausgeben. Das möchte ich allerdings nicht in Assembler machen, sondern in C (MikroC).
Dazu habe ich folgenden Code geschrieben. Es wäre nett, wenn jemand mal darüber gucken könnte:
main.c:
und die Headerdatei lcd.h:Code:#include <C:\Dokumente und Einstellungen\benutzer\Eigene Dateien\PIC\lcd.h> 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'); }
Mit freundlichen Grüßen,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 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 inittheLCD() { /*Initialisierung des LCD-Displays*/ Delay_ms(250); //LCD auf 8bit initialisieren (3mal) controlachtbit(48); Delay_ms(50); controlachtbit(48); controlachtbit(48); controlachtbit(48); //LCD auf 4bit initialisieren controlachtbit(32); //Display loeschen - curser home display_loeschen_cursor(); //2zeilig zwei_zeilig(); //Display: aus display_off(); //Eingabemodus entry_mode(); //Curser Anfang: cursor_anfang(); //Display: an display_on(); } 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*/ busy(); PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; ausfuehren(); busy(); PORTB = 0; D4 = byte.F0; D5 = byte.F1; D6 = byte.F2; D7 = byte.F3; ausfuehren(); 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(15); } void display_off(){ //Display wird ausgeschaltet OutLcdControl(8); } void cursor_anfang(){ //Curser wird an den Anfang gesetzt OutLcdControl(3); } void entry_mode(){ //LCD wird auf eingabemodus geschaltet OutLcdControl(6); } void zwei_zeilig(){ //LCD wird auf 2 zeilig eingestellt OutLcdControl(40); } void ausfuehren(){ //ein Befehl wird ausgefuehrt (LCD-ENABLE an und aus) ENABLE = 1; Delay_ms(10); ENABLE = 0; Delay_ms(10); } 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(10); ENABLE = 1; Delay_ms(10); ENABLE = 0; Delay_ms(10); } ENABLE = 0; Delay_ms(10); ENABLE = 1; Delay_ms(10); ENABLE = 0; //Datenbus auf Ausgabe schalten T4 = 0; T5 = 0; T6 = 0; T7 = 0; PORTB = 0; } void schreiben(char byte){ PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; RS = 1; ausfuehren(); busy(); PORTB = 0; D4 = byte.F0; D5 = byte.F1; D6 = byte.F2; D7 = byte.F3; RS = 1; ausfuehren(); busy(); }
Sebastian







Zitieren
Lesezeichen