- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: Probleme mit LCD (HD44780) Wie sezt man einen ascii-char auf cursor pos ?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1

    Probleme mit LCD (HD44780) Wie sezt man einen ascii-char auf cursor pos ?

    Anzeige

    Praxistest und DIY Projekte
    Hi !

    Ich versuche schon seit einigen Tagen ein Display mit HD44780, in 4-bit Betrieb anzusteuern....

    Ich habe mich so ein bisschen an folgende Anleitung gehalten:
    http://www.mikrocontroller.net/artic...-Tutorial:_LCD

    Ich habe auch definitiev nicht alles falsch gemacht, da die Command befehle wie z.B Cursor setzen aktivieren / deaktivieren und auch das initialisieren in den 4-bit modus zu funktionieren scheint.....

    Was ich jezt überhaupt nicht verstehe, ist wie ich ein ascii zeichen sende....
    So wie ich das verstanden habe, ist es auch ein byte (high/low-nibble)übertragen wie bei einem Command... nur das der RS pin in diesem fall auf HIGH gezogen werden muss...

    Achso ich habe bewusst auf RW verzichtet.... mache ich vlt einen timing fehler ?

    Also ganz konkret: wie sende ich ein z.B 'a' an die aktuelle Cursor Position ?

    Hier erst mal der code:

    lcd.h:
    Code:
    //Frequenz MicroProzessorUnit:
    #define MPU_XTAL 8000000
    
    //LCD-IO-Pins (nur 4-bit Betrieb!):
    #define LCD_COM_DDR             DDRB
    #define LCD_COM_PORT            PORTB
    #define LCD_DATA_DDR            DDRB
    #define LCD_DATA_PORT           PORTB
    #define LCD_RS_PORT             LCD_COM_PORT
    #define LCD_RW_PORT             LCD_COM_PORT
    #define LCD_E_PORT              LCD_COM_PORT
    //Command lines(cmd pins müssen nicht auf selbem port liegen):
    #define LCD_E_PIN               0  
    #define LCD_RS_PIN              1            
    #define LCD_RW_PIN              7
    //Data lines(data pins müssen auf selbem port liegen reiehnfolge beliebig): 
    #define LCD_DATA4_PIN            2        
    #define LCD_DATA5_PIN           3         
    #define LCD_DATA6_PIN           4          
    #define LCD_DATA7_PIN            5
    
    //User Konstanten:
    #define LCD_ON_CURSOR_ON        14
    #define LCD_ON_CURSOR_OFF        12
    #define LCD_ON_CURSOR_BLINK        15
    #define LCD_OFF                    0
    
    #define LCD_CLS                    1
    #define LCD_HOME                2
    
    #define LCD_CFG_4BIT_5x07        56
    #define LCD_CFG_4BIT_5x10        60
    
    #define LCD_INCR_CURSOR            20        
    #define LCD_DECR_CURSOR            16
    
    //LCD Interne Konstanten:
    #define LCD_WR_DATA                1
    #define LCD_WR_COMMAND            0
    
    //LCD-Init-Funktionen:
    void cfgLcdCommandLines(void);
    void cfgLcdDataByteLinesWrite(void);
    void cfgLcdDataByteLinesRead(void);
    void toggleE(void);
    unsigned char mkOutNibble(unsigned char dataByte);
    void lcdSendByte(unsigned char dataByte, unsigned char mode);
    void lcdSendData(unsigned char dataByte);
    void cfgLcd4Bit();
    void lcdIncrCursor(void);
    void lcdDecrCursor(void);
    void lcdCls(void);
    void lcdHome(void);
    void lcd_init(unsigned char mode);
    lcd.c

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    
    #include "lcd.h"
    #include "usart.h"
    
    void cfgLcdCommandLines(void)
    {
        LCD_COM_DDR |= (1<<LCD_E_PIN);
        LCD_COM_DDR |= (1<<LCD_RS_PIN);
        LCD_COM_DDR |= (1<<LCD_RW_PIN);
    }
    
    void cfgLcdDataByteLinesWrite(void)
    {
        LCD_DATA_DDR |= (1<<LCD_DATA4_PIN);
        LCD_DATA_DDR |= (1<<LCD_DATA5_PIN);
        LCD_DATA_DDR |= (1<<LCD_DATA6_PIN);
        LCD_DATA_DDR |= (1<<LCD_DATA7_PIN);
    }
    
    void cfgLcdDataByteLinesRead(void)
    {
        LCD_DATA_DDR &=~ (1<<LCD_DATA4_PIN);
        LCD_DATA_DDR &=~ (1<<LCD_DATA5_PIN);
        LCD_DATA_DDR &=~ (1<<LCD_DATA6_PIN);
        LCD_DATA_DDR &=~ (1<<LCD_DATA7_PIN);
    }
    
    void toggleE(void)
    {
        LCD_COM_PORT |= (1<<LCD_E_PIN);    
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        LCD_COM_PORT &=~ (1<<LCD_E_PIN);
    }
    unsigned char mkOutNibble(unsigned char dataByte)
    {
        unsigned char out = 0;
        out = ((dataByte & 1)<<LCD_DATA4_PIN);
        out |= ((dataByte & 2)<<(LCD_DATA5_PIN-1));
        out |= ((dataByte & 4)<<(LCD_DATA6_PIN-2));
        out |= ((dataByte & 8)<<(LCD_DATA7_PIN-3));
        return out;
    }
    
    void lcdSendByte(unsigned char dataByte, unsigned char mode)
    {
        unsigned char lNibble = dataByte & 15;
        unsigned char uNibble = (dataByte>>4) & 15;
        if(mode==LCD_WR_DATA)
        {
            LCD_COM_PORT |= (1<<LCD_RS_PIN);
            _delay_ms(1);
        }else
        {
            LCD_COM_PORT &=~ (1<<LCD_RS_PIN);
        }
        LCD_DATA_PORT = mkOutNibble(uNibble);
        toggleE();
        LCD_DATA_PORT = mkOutNibble(lNibble);
        toggleE();
    }
    
    void lcdSendData(unsigned char dataByte)
    {
        unsigned char lNibble = dataByte & 15;
        unsigned char uNibble = (dataByte>>4) & 15;
        LCD_COM_PORT |= (1<<LCD_RS_PIN);
    
        LCD_DATA_PORT = mkOutNibble(uNibble);
        toggleE();
        LCD_DATA_PORT = mkOutNibble(lNibble);
        toggleE();
    }
    
    void cfgLcd4Bit()
    {
        LCD_COM_PORT &=~ (1<<LCD_RS_PIN);
        LCD_DATA_PORT = mkOutNibble(3);
        toggleE();
        _delay_ms(10);
        LCD_DATA_PORT = mkOutNibble(3);
        toggleE();
        _delay_ms(1);
        LCD_DATA_PORT = mkOutNibble(3);
        toggleE();
        _delay_ms(1);
        LCD_DATA_PORT = mkOutNibble(2);
        toggleE();
        _delay_ms(10);
    }
    
    void lcdIncrCursor(void)
    {
        lcdSendByte(LCD_INCR_CURSOR,LCD_WR_COMMAND);
        _delay_ms(8);
    }
    
    void lcdDecrCursor(void)
    {
        lcdSendByte(LCD_DECR_CURSOR,LCD_WR_COMMAND);
        _delay_ms(8);
    }
    
    void lcdGotoXY(unsigned char xVal, unsigned char yVal)
    {
        
    }
    
    void lcdCls(void)
    {
        lcdSendByte(LCD_CLS, LCD_WR_COMMAND);
    }
    
    void lcdHome(void)
    {
        lcdSendByte(LCD_HOME, LCD_WR_COMMAND);
    }
    
    void lcd_init(unsigned char mode)
    {
        _delay_ms(200);
        cfgLcdCommandLines();
        cfgLcdDataByteLinesWrite();
        cfgLcd4Bit();
        
        lcdSendByte(mode, LCD_WR_COMMAND);
        lcdSendByte(LCD_CFG_4BIT_5x10, LCD_WR_COMMAND);
        
        lcdSendByte(7, LCD_WR_COMMAND);
        _delay_ms(10);
        lcdCls();
    }
    main.c

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #include "init.h"
    #include "usart.h"
    #include "globals.h"
    #include "lcd.h"
    
    int main(void)
    {
        cfgPorts();
        cfgUsart();
        enableInterrupts();
        lcd_init(LCD_ON_CURSOR_BLINK);
    
        while(1)
        {    
            asm("nop");
            asm("nop");
        }
          return 0;
    }
    Ich währe über jedlichen Ansatz sehr dankbar !

    Mfg Fugitivus

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    Hi !

    ich glaube ich habe den Fehler... habsch mal eben mit nem osci gemessen und festgestellt das ich den RS pin nicht auf 1 setze, sprich ich habe vergessen auszumaskieren ^^ ich denke das wird es sein ^^ gebe rückmeldung wenn es dann mit dem maskieren klappt ^^

    mfg Fugitivus

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    jup, falsch ausmaskiert..... jezt funst alles wunderbar....

    Danke an alle....

    Mfg Fugitivus

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.04.2010
    Ort
    Wien
    Beiträge
    119
    Blog-Einträge
    4
    #include "init.h"
    #include "usart.h"
    #include "globals.h"

    was sind das für bibliotheken bzw woher bekomm ich die?
    ich will einen display ansteuern, hab aber keine ahnung wie und such schon seit stunden herum,
    werd aber nicht schlau... gibt es vl irgendwo eine komplettlösung dafür?

    mfg michi

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    Hi !
    Die libs hab ich selber gebaut.....
    Die usart.h brauchst du nicht für das lcd ebensowenig die init.h....
    Die einzigen files die du brauchen würdest habe ich oben angegeben.... wobei in der lcd.h noch die display verdrahtung in form von konstanten angepasst werden muss.... eigendlich dürfte die lib sich von selber erklähren...
    Der einzige unterschied zwischen dieser und der von z.B: Peter Fleurys (siehe :http://www.mikrocontroller.net/articles/HD44780), ist das ich das busyflag nicht abfrage und deshalb den RW Pin nicht verdrahten muss....

    Die frage die sich mir jezt stellt.... Was für ein Display willst du denn genau beschreiben ? gibt ja 1000 verschiedene von RS232 über rs485 oder usb,SPI, Lan ist eigendlich alles möglich aso.... dann gibts noch vga dvi etc etc........ also währe ganz praktisch wenn du mal sagen könntest um was für ein display es sich handelt, dann kann ich vlt weiter helfen....

    Ist es eins mit HD44780 controller dann sollte das beispiel oben eigendlich ausreichend erklährung bieten... nen gutes tutorial gibt es bei oben genanntem link.....

    Mfg Fugitivus....

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.04.2010
    Ort
    Wien
    Beiträge
    119
    Blog-Einträge
    4
    Danke für die Antwort, ich hab mch am Freitag mit einem freund zusammengesetzt
    und das Problem wurde mehr oder weniger gelöst. (8-bit Modus)
    Ich denke schon, dass es einer ist, zumindest kann ich den cursor bewegen und zeichen setzen,
    wie die codiert sind hab ich noch nicht herausen, aber ich hab ja genug zeit zum probieren xD

    danke nochmal!
    Infos zu meinen Projekten gibts auf meiner Homepage: http://langeder.org/

Ähnliche Themen

  1. Probleme über Variabel-Addressierung auf Flash-Char
    Von Nicy im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.01.2009, 18:17
  2. [Probleme mit] HD44780-LCD ansteuern
    Von E. Hakennase im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 26.08.2008, 15:38
  3. RS232 P. Fleury Char und String Probleme mal wieder
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 31.10.2007, 15:52
  4. Laufschrift aktualisieren, Probleme mit char*
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 20.07.2007, 13:01
  5. Wie kann ich einen Integer einfach in einen Char umwandeln
    Von Andun im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 14.07.2005, 14:59

Berechtigungen

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

Solar Speicher und Akkus Tests