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