Εμφάνιση αποτελεσμάτων : 1 έως 6 από 6

Θέμα: LCD 20x4 HD44780 Controller

  1. #1
    Μέλος
    Εγγραφή
    Feb 2008
    Περιοχή
    Γαλάτσι
    Μηνύματα
    36

    Προεπιλογή LCD 20x4 HD44780 Controller

    Καλησπέρα!

    Θα θελα την βοήθεια σας!
    Αν και έψαξα αρκετά άρθρα σχετικά με την απορία μου τελικά δεν μπόρεσα να καταλάβω!

    Λοιπόν, έχω μια LCD 20χ4 (HD44780) και προγραμματίζω τον atmega32 (avrstudio4- stk500)

    Έχω βρει έτοιμες συναρτήσεις για την LCD

    Κώδικας:
    void LCDByte(uint8_t c,uint8_t isdata)
    {
     //Sends a byte to the LCD in 4bit mode
     //cmd=0 for data
     //cmd=1 for command
     uint8_t hn,ln;   //Nibbles
     uint8_t temp;
     hn=c>>4;    //hn had the 4 most significal bits of c
     ln=(c & 0x0F);   //hn had the 4 less significal bits of c
     if(isdata==0)
      RESET(RS);   //if is comand
     else
      SET(RS);    //if is data
     _delay_us(0.500);  //tAS
     //Send high nibble
     SET(E);
     temp=(LCD & 0XF0)|(hn);
     LCD=temp;
     _delay_us(1);   //tEH
     //Now data lines are stable pull E low for transmission
     RESET(E);
     _delay_us(1);
     //Send the lower nibble
     SET(E);
     temp=(LCD & 0XF0)|(ln);
     LCD=temp;
     _delay_us(1);   //tEH
     //SEND
     RESET(E);
     _delay_ms(2);   //tEL
    }
    //***************************
    void InitLCD()
    {
     //After power on Wait for LCD to Initialize
     _delay_ms(30);
     //Set IO Ports
     DDRC=0xFF;  //<<<<<<<<<<<<<<<<<!!!!!!!!!!!!!!!!must set the correct port
     LCD=0X00;
     //Set 4-bit mode
     _delay_us(1);   //tAS
     SET(E);
     LCD|=(0b00000010);   // 4 bits interface data length
     _delay_us(1);
     RESET(E);
     _delay_us(1);
     
     //Wait for LCD to execute the Functionset Command
     _delay_ms(10);           //[B] Forgot this delay
     //Now the LCD is in 4-bit mode
     LCDByte(0b00001111,0); //Display On
     LCDByte(0b00101000,0); //function set 4-bit,2 line 5x7 dot format
    }
    Το πρόβλημά μου είναι στην συνάρτηση gotoXY την οποία την βρήκα για να δουλεύει σωστά για lcd 2 γραμμών.

    Οπότε έψαξα να βρω τι τιμές πρέπει να δώσω για 4 γραμμών..

    Κώδικας:
    void LCDGotoXY(uint8_t x,uint8_t y)
    {  
      if(x<40)
      {
       switch(y)
       {
        // Line 1
        case 0: x|=0x80; break;   //1000 0000  
        // Line 2
        case 1: x|=0xC0; break;   //1100 0000  
        // Line 3
        case 2: x|=0x94; break;   //1001 0100 
        // Line 4 
        case 3: x|=0xD4; break;   //1101 0100 
       }
       //LCDCmd(x);
       LCDByte(x,0);
      }
      
    }

    Δυστυχώς, όμως δεν μου δουλεύει σωστά.
    Οι 2 πρώτες γράμμες είναι πάλι οκ, αλλά όταν παίζω στις 2 τελευταίες έχω πρόβλημα.
    Μέχρι και την 4 θέση (γραμμές 3 και 4) πηγαίνουν σωστά οι χαρακτήρες. Από κει και μετά μπερδεύεται η κατάσταση!

    Προσπάθησα να καταλάβω πως λειτουργεί με τις διευθύνσεις της lcd αλλά δεν τα κατάφερα..

    Άλλες τιμες που δοκίμασα είναι τα
    0x00
    0x40
    0x14
    0x54
    που είναι οι αρχικές διευθύνσεις της κάθε γραμμής, αλλά μάλλον δεν είναι τόσο απλό!

    Όπως και να χει όποιος μπορεί να μου δώσει τις σωστές τιμές ή να μου πει με 2 λόγια πως δουλεύει το θέμα θα το εκτιμούσα!!


    Ευχαριστώ εκ των προτέρων!

    0 Not allowed! Not allowed!
    Athens Wireless Metropolitan Network
    --------nekstath #9491#-----------
    ============================
    Σύλλογος Ραδιοερασιτεχνών Ελλάδος
    ------------SW1MNP---------------

  2. #2
    Μέλος Το avatar του χρήστη sabouras
    Εγγραφή
    Aug 2008
    Μηνύματα
    137

    Προεπιλογή

    δοκιμασε αυτη τη βιβλιοθηκη. Νομιζω οτι θα σε καλυψει
    http://homepage.hispeed.ch/peterfleu...-software.html

    1 Not allowed! Not allowed!

  3. Ένα μέλος ευχαρίστησε τον sabouras για αυτό το χρήσιμο μήνυμα:

    agis68 (18-02-15)

  4. #3
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.962

    Προεπιλογή

    δες εδώ τι προτείνει
    http://www.microchip.com/forums/m102011.aspx

    0 Not allowed! Not allowed!

  5. #4
    Μέλος
    Εγγραφή
    Feb 2008
    Περιοχή
    Γαλάτσι
    Μηνύματα
    36

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από sabouras Εμφάνιση μηνυμάτων
    δοκιμασε αυτη τη βιβλιοθηκη. Νομιζω οτι θα σε καλυψει
    http://homepage.hispeed.ch/peterfleu...-software.html


    Καταρχας, ευχαριστω για τις απαντησεις!!!


    sabouras τον εχεις δοκιμασει το συγκεκριμενο κωδικα.??
    Ενώ βλέπω ότι εχει υπολογισει μεσα στον κωδικα για 4 γραμμες, στην πραξη παλι μονο στις 2 πρωτες γραμμες μου παιζει η Lcd...

    Βεβαια δεν ξερω αν είναι δικο μου το λαθος, αλλα νομιζω δεν εχω κανει!!

    0 Not allowed! Not allowed!
    Athens Wireless Metropolitan Network
    --------nekstath #9491#-----------
    ============================
    Σύλλογος Ραδιοερασιτεχνών Ελλάδος
    ------------SW1MNP---------------

  6. #5
    Μέλος
    Εγγραφή
    Feb 2008
    Περιοχή
    Γαλάτσι
    Μηνύματα
    36

    Προεπιλογή

    Τελικά βρήκα το λάθος που έκανα!!

    Οπότε παραθέτω ολόκληρο τον κώδικα μαζί σε περίπτωση που τον χρειαστεί κάποιος άλλος.

    Δουλεύει κανονικά για LCD 20x4 με 4-bit.




    file=lcd.h

    Κώδικας:
    #define F_CPU 16000000L
    #include <avr/io.h>
    #include <util/delay.h>
     
    #ifndef _LCD_H
     #define _LCD_H
     
    /************************************************
     LCD CONNECTIONS
    *************************************************/
    #define LCD   PORTC   //Port PC0-PC3 are connected to D4-D7
    #define RS  PORTC5
    #define RW  PORTC6
    #define E  PORTC7   //Position of enable
    #define SET(x)  (LCD|=(1<<x))
    #define RESET(x) (LCD&=(~(1<<x)))
     
    
    //The prototyping is necessary for the definiton of LCDWriteStringXY()
    void LCDGotoXY(uint8_t x,uint8_t y);
    void LCDWriteString(const char *msg);
     
     
    
    //**********************LCD*****************************
    void LCDByte(uint8_t c,uint8_t isdata)
    {
     //Sends a byte to the LCD in 4bit mode
     //cmd=0 for data
     //cmd=1 for command
    
     uint8_t hn,ln; //Nibbles
     uint8_t temp;
    
     hn=c>>4; //hn had the 4 most significal bits of c
     ln=(c & 0x0F); //hn had the 4 less significal bits of c
    
     if(isdata==0)
     RESET(RS); //if is comand
     else
     SET(RS);  //if is data
    
     _delay_us(0.500); //tAS
    
     //Send high nibble
     SET(E);
     temp=(LCD & 0XF0)|(hn);
     LCD=temp;
     _delay_us(1); //tEH
     //Now data lines are stable pull E low for transmission
     RESET(E);
     _delay_us(1);
    
     //Send the lower nibble
     SET(E);
     temp=(LCD & 0XF0)|(ln);
     LCD=temp;
     _delay_us(1); //tEH
     //SEND
     RESET(E);
     _delay_ms(2); //tEL
    }
    
    //***************************
    void InitLCD()
    {
     //After power on Wait for LCD to Initialize
     _delay_ms(30);
    
     //Set IO Ports
     DDRC=0xFF;  //<<<<<<<<<<<<<<<<<!!!!!!!!!!!!!!!!must set the correct port
     LCD=0X00;
    
     //Set 4-bit mode
     _delay_us(1); //tAS
     SET(E);
     LCD|=(0b00000010);  // 4 bits interface data length
     _delay_us(1);
     RESET(E);
     _delay_us(1);
     
     //Wait for LCD to execute the Functionset Command
     _delay_ms(10);  //[B] Forgot this delay
    
     //Now the LCD is in 4-bit mode
    
     LCDByte(0b00001111,0); //Display On
     LCDByte(0b00101000,0); //function set 4-bit,2 line 5x7 dot format
    }
     
    //***************************
    void LCDGotoXY(uint8_t x,uint8_t y)
    {  
      if(x<40)
      {
     
      switch(y)
      {
     // Line 1
     case 0: x +=0x80; break; //1000 0000
     // Line 2
     case 1: x +=0xC0; break; //1100 0000
     // Line 3
     case 2: x +=0x94; break; //1001 0100
     // Line 4
     case 3: x +=0xD4; break; //1101 0100
      }
    
      //LCDCmd(0x80|x); //(x);
      LCDByte(x,0);
      }
      
    }
    
    //***************************
    void LCDWriteString(const char *msg)
    {
    
     while(*msg!='\0')
     {
     //Custom Char Support
     if(*msg=='%')
     {
     msg++;
     int8_t cc=*msg-'0';
    
     if(cc>=0 && cc<=7)
     {
     LCDData(cc);
     }
     else
     {
     LCDData('%');
     LCDData(*msg);
     }
     }
     else
     {
     LCDData(*msg);
     }
     msg++;
     }
    }
    
    //***************************
    void LCDWriteStringXY(const char *msg, uint8_t x, uint8_t y)
    { 
     //Call the function for the cursor movement
     LCDGotoXY(x,y);
    
     //Call the function for write the message
     LCDWriteString(msg);
    }
    
    //***************************
    void LCDWriteInt(int val)
    {
    
      if(val<0)
      {
       LCDByte('-',1);
       val=(-val);
      }
    
      char str[5]={0,0,0,0,0};
      int i=4,j=0;
      while(val)
      {
       str[i]=val%10;
       val=val/10;
       i--;
      }
      
      while(str[j]==0) j++;
      
      for(i=j;i<5;i++)
      {
       LCDByte(48+str[i],1);
      }
    }
    
    //***************************
    void LCDWriteIntXY(int val, uint8_t x, uint8_t y)
    {
     //Call the function for the cursor movement
     LCDGotoXY(x,y);
    
     //Call the function for write the integer
     LCDWriteInt(val);
    }
     
    //**********************LCD_end*******************************
     
     
     
     
    
    #endif


    file=main.c
    Κώδικας:
    #define F_CPU 16000000L
    #include <avr/io.h>  
    #include <util/delay.h>
    #include "lcd.h"  
     
    
    int main()
    {
    int c=0;
    while(1)
    { 
     
    
     LCDWriteIntXY(1,c,0);
     LCDWriteIntXY(2,c,1);
     LCDWriteIntXY(3,c,2);
     LCDWriteIntXY(4,c,3);
     _delay_ms(1000);
     LCDByte(0b00000001,0);
     if(c>=19){ c=0; }
     else {c++; }
    }
     
    
    }

    0 Not allowed! Not allowed!
    Athens Wireless Metropolitan Network
    --------nekstath #9491#-----------
    ============================
    Σύλλογος Ραδιοερασιτεχνών Ελλάδος
    ------------SW1MNP---------------

  7. #6
    Μέλος Το avatar του χρήστη sabouras
    Εγγραφή
    Aug 2008
    Μηνύματα
    137

    Προεπιλογή

    Φυσικα και δουλευει. Πρεπει να πας στο αρχειο lcd.h και να δηλωσεις lines απο 2 σε 4.
    Επισης δηλωνεις και τη ταχυτητα του μικροελεγκτη που θα χρησιμοποιησεις στη μεταβλητη Xtal.
    ψαξε μεσα στο lcd.h και θα βρεις τα παρακατω.

    #define XTAL 8000000 /**< clock frequency in Hz, used to calculate delay timer */

    /**
    * @name Definitions for Display Size
    * Change these definitions to adapt setting to your display
    */
    #define LCD_LINES 2 /**< number of visible lines of the display */
    #define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */

    0 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. LCD 2x16 HD44780 Power Supply
    By ALAMAN in forum Γενικά
    Απαντήσεις: 16
    Τελευταίο Μήνυμα: 27-11-14, 21:29
  2. Display 20x4 για Arduino
    By alefgr in forum Μικροελεγκτές
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 23-11-13, 03:45
  3. Πρόβλημα εμφάνισης χαρακτήρων [HD44780 Character LCD]
    By SpawNerGR in forum Κυκλώματα για Η/Υ
    Απαντήσεις: 12
    Τελευταίο Μήνυμα: 14-12-10, 19:03
  4. pic 16f84 clock με lcd hd44780
    By ok1gr in forum Χρονοκυκλώματα
    Απαντήσεις: 62
    Τελευταίο Μήνυμα: 28-10-09, 23:00
  5. Backlight πρόβλημα σε LCD μέσω παράλληλης (LCD smartie, HD44780)
    By Stergios_[.gr] in forum Κυκλώματα για Η/Υ
    Απαντήσεις: 14
    Τελευταίο Μήνυμα: 23-10-09, 19:39

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας