- Labornetzteil AliExpress    Werbung      
Ergebnis 1 bis 10 von 38

Thema: LCD an ATmega32

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    12.08.2010
    Ort
    Zürich
    Alter
    62
    Beiträge
    39
    Zitat Zitat von 021aet04 Beitrag anzeigen
    Ich werde es testen, es könnte aber sein das du die Frequenz ändern musst, da ich keinen 16Mhz Quarz habe und kein Bascom verwende. Ich programmiere in C mit dem AVR Studio.
    Ich habe das LCD mit Bascom programmiert, da ich ausschliessen wollte, dass der Fehler in der Software liegt. Kannst Du mir Dein C Sourcecode rüberbeamen?

    Als Greenhorn habe ich mich mit der Verbindung vom LCD auf Port C vertan. Könnte sein, dass ich den Bug dort entfernen kann. Bin trotzdem dankbar für den Quellecode in C.

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    Ich kann dir den Quellcode geben.

    Die eigentliche Routine ist:
    Code:
    #include "HD44780.h"
    
    void LCD_Ctrl (unsigned char data)
    {
    
        PORTB &= ~(1<<RS);
    
    //erstes Nibble
    
        PORTC = ((data & 0xF0)>>4);
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
    
    //zweites Nibble
    
        PORTC = data & 0x0F;
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
    
        _delay_us(100);
    
    }
    
    void LCD_Home (void)
    {
    //Display löschen und auf Homeposition setzen
        LCD_Ctrl (0x01);
        _delay_ms(1);
        LCD_Ctrl (0x02);
        _delay_ms(5);    
    }
    
    void LCD_Data (unsigned char data)
    {
        _delay_us(100);
    
    //erstes Nibble
    
        PORTC = ((data & 0xF0)>>4);
        PORTB |= (1<<RS);
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
    
    //zweites Nibble
    
        PORTC = data & 0x0F;
        PORTB |= (1<<RS);
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
            
        PORTB &= ~(1<<RS);
    
        _delay_us(100);
    }
    
    void LCD_Init(void)
    {
        DDRC |= 0x0F;                    //PC0 - PC3 als Ausgang
        DDRB |= (1<<PB6) | (1<<PB7);    //RS und EN als Ausgang
    
        _delay_ms(15);
        LCD_Ctrl (0x28);
    
        _delay_ms(5);
        LCD_Ctrl (0x28);
    
        _delay_ms(1);
        LCD_Ctrl (0x28);
    
    /*    0b00001DCB
            0        1
    D:         Display
           aus     ein
    C:         Cursor
           aus     ein
    B:         Blinken
           aus     ein
    0x0F: Display ein, Cursor sichtbar, Blinken ein
    0x0E: Display ein, Cursor sichtbar, Blinken aus
    0x0C: Display ein, Cursor unsichtbar, Blinken aus
    
    */
        _delay_ms(1);
        LCD_Ctrl (0x0C);
    
        _delay_ms(1);
        LCD_Ctrl (0x01);
    
        _delay_ms(1);
        LCD_Ctrl (0x02);
    
        _delay_ms(5);
    
    }
    
    void LCD_Pos (unsigned int zeile, unsigned int spalte)
    {
        LCD_Ctrl (0x80 + spalte - 1+ 0x40 * (zeile - 1));
        _delay_us (100);
    }
    
    void LCD_String (char text [20])
    {
        unsigned int i=0;
        
        while ((!(text[i] == 0)) & (i < 20))
        {
            LCD_Data (text[i]);
            i++;
        }
    }
    
    void LCD_Integer (unsigned int data)
    {
        unsigned char a;
    
        a = (data % 10000)/1000;        //Tausender
        LCD_Data (a + 48);
    
        a = (data % 1000)/100;            //Hunderter
        LCD_Data (a + 48);
    
        a = (data % 100)/10;            //Zehner
        LCD_Data (a + 48);
    
        a = data % 10;                    //Einer
        LCD_Data (a + 48);
        
    }
    Ich habe 1:1 vom Buch "Basiskurs R8C/13" von Elektor genommen (nur Ports,... an den AVR angepasst).

    In der HD44780.h sind nur andere Headerdateien, die man benötigt (z.B. damit man "PORTX",... nutzen kann), und es ist noch RS bzw EN definiert.

    Die einzelnen Funktionen sind:
    LCD_Ctrl => wird verwendet um das LCD einzustellen (Kommandos senden), LCD wird gelöscht und Cursorposition wird auf Home gesetzt
    LCD_Data => wird verwendet um Daten an das LCD zu senden, damit etwas angezeigt wird
    LCD_Init => stellt die benötigten Pins auf Ausgang, stellt das LCD ein
    LCD_Home => löscht das Display und setzt den Cursor auf die Grundposition (Zeile 1, Spalte 1)
    LCD_Pos => springe zu Cursorposition
    LCD_String => übergibt einen String an das LCD
    LCD_Integer => übergibt eine Zahl von "0000" bis "9999" an das Display, inkl. auftrennen der einzelnen Stellen

    Das Beispiel von dir würde dann in etwa so aussehen (die Headerdateien,... fehlen noch, die Main funktioniert aber so):

    Code:
    .........
    
    int main (void)
    {
         LCD_Init;
         LCD_String ("16x4 LCD Display");
         LCD_Pos (2, 1);
         LCD_String ("----------------");
    }

Ähnliche Themen

  1. I2C an ATMEGA32
    Von WeiserDruide im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 31.07.2010, 12:27
  2. ADC mit ATmega32
    Von Jannik im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 12.03.2008, 08:36
  3. datenaustausch von atmega32 zu atmega32 über spi usw...
    Von roboterheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.10.2007, 22:39
  4. Speicherplatz des ATmega32 + Display an ATmega32
    Von Rob.Anfänger im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 19.11.2006, 01:59
  5. ATMega32
    Von AceKiller73 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 29.04.2006, 21:51

Berechtigungen

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

    Werbung      Solar Speicher und Akkus Tests