0
Καλησπέρα!
Θα θελα την βοήθεια σας!
Αν και έψαξα αρκετά άρθρα σχετικά με την απορία μου τελικά δεν μπόρεσα να καταλάβω!
Λοιπόν, έχω μια LCD 20χ4 (HD44780) και προγραμματίζω τον atmega32 (avrstudio4- stk500)
Έχω βρει έτοιμες συναρτήσεις για την LCD
Το πρόβλημά μου είναι στην συνάρτηση gotoXY την οποία την βρήκα για να δουλεύει σωστά για lcd 2 γραμμών.Κώδικας: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 }
Οπότε έψαξα να βρω τι τιμές πρέπει να δώσω για 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 λόγια πως δουλεύει το θέμα θα το εκτιμούσα!!
Ευχαριστώ εκ των προτέρων!