- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: LCD: Hallo Welt mit C

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Ort
    Bielefeld
    Beiträge
    39
    Anzeige

    E-Bike
    Hallo,

    da gibt es keinen Unterschied zwischen PORTB und LATB. Es funktioniert immer noch nicht. Es muss ein semantischer Fehler vorliegen.

    Mit freundlichen Grüßen,
    Sebastian

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    330
    Hallo

    dann könnte sein, was ic oben schon gechrieben habe, dass du vor den TRIS-Befehlen die Speicher-Bank wechseln musst. Hats du denn schon mal mit dem Debugger festzustellen, ob deine Ports A und B tatsächlich Daten ausgeben ?
    Du könntest dein Programm mal abändern - für tstzwecke und schreiben:
    TRISB = 0 ; also alle Ausgang
    PORTB = 0x55;
    und jetzt mit MPLAB Sim überprüfen, ob da auch 55 auf dem PortB steht, und dann das gleiche mit PORTA.
    TRISA = 0;
    PORTA = 0x55;

    gerhard

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Ort
    Bielefeld
    Beiträge
    39
    Hallo,

    das habe ich alles schon mit dem Debugger überprüft. Muss man denn bei MPLAB-C18 die Registerbank wie bei Assembler umschalten?
    Ich vermute mal das dort ein semantischer Fehler vorliegt oder das das was auf sprut.de steht nicht ganz korrekt ist: Das heruntergeladene Hex-file läuft einwandfrei. Wenn ich allerdings den Assemblercode assembliere und auf den PIC ziehe - funktioniert es nicht. Seltsam wahrscheinlich falscher Assemblercode zum Hex-file???

    Gruß,
    Sebastian

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    330
    Hallo Sebastian

    jetzt hab ich glaub ich ein bisschen den Überblick verloren. Anfangs war vom Pic16F84 die Rede, danach kam den C18-Compiler ins Spiel, aber sicher nicht für den PIC16F84. Mit welchem PIC arbeitest du denn jetzt gerade ?

    Gerhard

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Ort
    Bielefeld
    Beiträge
    39
    Hallo,

    ich progge immer noch für den 16F84 - hab mir aber jetzt einen 18F13?? besorgt - mal sehen. Es klappt jetzt jedenfalls.
    Mein Code:
    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();
    
    }
    Gruß,
    Sebastian

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Ort
    Bielefeld
    Beiträge
    39

    Wie steuer ich die zweite Zeile an..

    Hallo,

    noch mal eine Frage. Die erste Zeile kann ich ohne Probleme ansteuern. Die zweite Zeile funktioniert allerdings nicht. Wenn ich den Kontrast hochdrehe und mehr als 16 Buchstaben eingebe, sieht man in der zweiten Zeile nichts.
    -Seltsamerweise habe ich aber mit 00101000 das Display auf zwei-zeilig gestellt.
    -Dann habe ich versucht mit folgender Funktion, den Cursor zu positionieren - das funktionierte leider auch mit den Werten 2,2 nicht:
    Code:
     void positionieren(char zeichen, char spalte){
         char uebergabe = 0;
         uebergabe.F0 = spalte.F0;
         uebergabe.F1 = spalte.F1;
         uebergabe.F2 = spalte.F2;
         uebergabe.F3 = zeichen.F0;
         uebergabe.F4 = zeichen.F1;
         uebergabe.F5 = zeichen.F2;
         uebergabe.F6 = 1;
          OutLcdControl(uebergabe);   //Datenueber uebertragen
    }
    -Über die Speicheradresse 42 auf die zweite Zeile zuzugreifen geht leider auch nicht mit folgender Fkt.:
    Code:
    void ruecke_zur_speicherstelle(char adresse){
          char uebergabe = adresse;
          uebergabe.F7 = 1;
          OutLcdControl(uebergabe);
     }
    Hat jemand eine Idee, was ich falsch mache?

    Gruß,
    Sebastian

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress