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:
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');
}
und die Headerdatei lcd.h:
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();

}
Mit freundlichen Grüßen,
Sebastian