एलसीडी 1602 कनेक्शन 4 बिट आदेश. PIC16 आणि LCD निर्देशकांमधील परस्परसंवाद कार्यक्रम

फोर-बिट मोड सक्रिय करण्यासाठी, अंजीर 1 मधील वेळेच्या आकृतीनुसार प्रोग्रामॅटिकरित्या नियंत्रण सिग्नल तयार करणे आवश्यक आहे. संरचनेत, ते "E" डाळींच्या दुप्पट संख्येचा अपवाद वगळता 8-बिट बसच्या आकृतीशी जुळतात. कम्युनिकेशन लाईन्स डेटा बस DB4-DB7 च्या सर्वात महत्वाच्या बिट्समधून जातात, कमी-ऑर्डर DB0-DB3 न वापरलेले राहतात.

आकृती क्रं 1

मोडचा फायदा म्हणजे लहान कंडक्टर, सरलीकृत टोपोलॉजी छापील सर्कीट बोर्ड, MK पोर्ट लाईन्स जतन करत आहे. LCD मधील डेटा ट्रान्सफर रेट कमी होण्याचा तोटा आहे, कारण माहिती प्रत्येकी 4 बिट्सच्या दोन भागांमध्ये (निबल किंवा टेट्राड्स) प्रसारित करावी लागते. तथापि, कार्यक्रमातील अनिवार्य वेळ विलंब आणि "लिक्विड क्रिस्टल्स" चे भौतिक जडत्व लक्षात घेऊन, वेग कमी होणे जवळजवळ जाणवत नाही.

आमच्या LCD साठी चाचणी प्रोग्रामचे उदाहरण वापरून 4-बिट बसचे ऑपरेटिंग तत्त्व पाहू. डिस्प्ले परिचित स्थानाच्या दशांश पत्त्याचे अंक 0-255 आणि त्यामध्ये असलेल्या चिन्हांच्या ग्राफिक प्रतिमा दुसऱ्या विरामांसह दर्शवेल.

तांदूळ. 2

तुम्हाला माहिती आहे की, प्रत्येक एलसीडीमध्ये अंगभूत कॅरेक्टर जनरेटर असतो, जो 8 KB पेक्षा जास्त क्षमतेचा रॉम क्षेत्र असतो, जो निर्मात्याकडे फ्लॅश केला जातो. पारंपारिकपणे, 00-7Fh पत्त्यांसह रॉमच्या पहिल्या सहामाहीत संख्यांची बाह्यरेखा, विरामचिन्हे, तसेच लॅटिन वर्णमालेतील अप्पर आणि लोअरकेस अक्षरे असतात. सर्व काही IBM PC सारखे आहे. दुसरा अर्धा भाग राष्ट्रीय वर्णमालासाठी "फार्म आउट" आहे. या संदर्भात, HD44780 मध्ये कॅरेक्टर जनरेटर वायरिंगसाठी तीन मुख्य पर्यायांसह बदल आहेत:

लॅटिन आणि युरोपियन भाषा (युरोपियन मानक फॉन्ट किंवा युरो)
लॅटिन आणि जपानी वर्ण (जपानी मानक फॉन्ट किंवा जपान)
लॅटिन आणि सिरिलिक (कस्टम फॉन्ट किंवा रशियन, अंजीर 2)

सर्व वर्ण जनरेटर सेल भरलेले नाहीत. "रिक्त" सेलमध्ये प्रवेश करताना, अनियंत्रित माहिती स्क्रीनवर प्रदर्शित केली जाईल, बहुतेक वेळा प्रकाशित ठिपके असतात. 0x00-0x07 पत्त्यांसह पहिले 8 वर्ण तारकाने चिन्हांकित केले आहेत. इच्छित असल्यास, ते वापरकर्त्याद्वारे स्वतंत्रपणे प्रोग्राम केले जाऊ शकतात.

विशिष्ट एलसीडीमध्ये कोणते वर्ण जनरेटर समाविष्ट केले आहे ते त्यात सूचित केले पाहिजे चिन्हकिंवा तांत्रिक बाबींमध्ये, जरी व्यवहारात तुम्हाला विक्रेत्याच्या सन्मानाच्या शब्दावर विश्वास ठेवावा लागेल. एलसीडी स्क्रीनवर सर्व संभाव्य वर्ण शैली आपल्या स्वत: च्या डोळ्यांनी पाहणे हा दुसरा दृष्टीकोन आहे. चला लिहू, प्रोग्राम संकलित करू आणि कंट्रोलर प्रोग्राम करू या, त्यानंतर ओळखीच्या स्थानाच्या दशांश पत्त्याचे अंक 0-255 आणि त्यामध्ये असलेल्या चिन्हांच्या ग्राफिक प्रतिमा एलसीडी स्क्रीनच्या वरच्या ओळीत दुसऱ्या विरामांसह प्रदर्शित केल्या जातील. जर ग्राफिक्स आणि वर्णांचा दिसण्याचा क्रम अंजीर 2 शी जुळत असेल, तर एलसीडी क्रमाने आहे.

class="eliadunit">

पुढे, आम्ही अंजीर 3 नुसार सर्किट एकत्र करतो, त्याचा फक्त फरक असा आहे की डेटा बस 4-वायर लाइनद्वारे जोडलेली आहे, म्हणजे. DB4-DB7 जोडलेले आहेत, परंतु DB0-DB3 वापरलेले नाहीत. डिस्प्लेचे R/W आउटपुट मायनसशी जोडलेले आहे, कारण आमचा डिस्प्ले डेटा रिसीव्हर आहे.

एलसीडी कॅरेक्टर जनरेटर तपासण्यासाठी कोड खाली दिलेला आहे.

// एलसीडी कॅरेक्टर जनरेटर चाचणी प्रोग्राम # समावेश #समाविष्ट करा #define RS PC0 #define EN PC2 // LCD void lcd_com (अस्वाक्षरित चार p) ( PORTC &= ~(1<< RS); // RS = 0 (запись команд) PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // Выделяем старший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // Выделяем младший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция записи данных в ЖКИ void lcd_dat(unsigned char p) { PORTC |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // Выделяем старший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // Выделяем младший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция инициализации ЖКИ void lcd_init(void) { DDRC |= (1 << PC2)|(1 << PC0); // PC1, PC0 - выходы PORTC = 0x00; DDRD = 0xFF; // порт D - выход PORTD = 0x00; _delay_ms(50); // Ожидание готовности ЖК-модуля // Конфигурирование четырехразрядного режима PORTD |= (1 << PD5); PORTD &= ~(1 << PD4); // Активизация четырехразрядного режима PORTC |= (1 << EN); PORTC &= ~(1 << EN); _delay_ms(5); lcd_com(0x28); // Шина 4 бит, LCD - 2 строки lcd_com(0x08); // Полное выключение дисплея lcd_com(0x01); // Очистка дисплея _delay_us(100); lcd_com(0x06); // Сдвиг курсора вправо _delay_ms(10); lcd_com(0x0C); // Включение дисплея, курсор не видим } // Основная программа int main (void) { unsigned char znak = 0; // определяем переменную lcd_init(); // Инициализация дисплея while (1) { lcd_com(0x80); // Вывод в верхнюю левую позицию 1 строки lcd_dat(znak/100 + "0"); // Выделяем сотни lcd_dat((znak/10)%10 + "0"); // Выделяем десятки lcd_dat(znak%10 + "0"); // Выделяем единицы lcd_dat("="); // Выводим знак равенства lcd_dat(znak); // Выводим содержимое знакогенератора _delay_ms(100); // Тут можно поменять задержку вывода символов znak++; // Следующий символ знакогенератора } }

कॅरेक्टर ग्राफिक डिस्प्लेसह कार्य करण्यासाठी, आम्ही लिक्विडक्रिस्टल लायब्ररी वापरण्याचा सल्ला देतो, जी मानक Arduino IDE सेटमध्ये समाविष्ट आहे आणि 8-बिट (4-बिट) समांतर इंटरफेसद्वारे कार्य करण्यासाठी डिझाइन केलेली आहे. जर तुमचा डिस्प्ले I2 बस द्वारे Arduino शी जोडलेला असेल, तर तुम्हाला LiquidCrystal_I2C लायब्ररी (ज्यापैकी बहुतेक फंक्शन्स पहिल्या लायब्ररीच्या फंक्शन्सची पुनरावृत्ती करतात) इन्स्टॉल करणे आवश्यक आहे.

समर्थित डिस्प्ले:

डिस्प्ले कनेक्शन आणि आरंभीकरण
LCD1602 - वर्ण प्रदर्शन (16x02 वर्ण),


#समाविष्ट करा
[ , 8 , 9 , 10 , 11 ]);
निरर्थक सेटअप())( lcd.begin(16 , 2);}

// स्पष्टीकरण:

निरर्थक सेटअप())( OBJECT.begin(NUM_COLUMN, NUMBER_ROWS); )


LiquidCrystal OBJECT(RS, E, D0, D1, D2, D3, D4, D5, D6, D7);


I2C इंटरफेससह (निळा)

#समाविष्ट करा
#समाविष्ट करा
LiquidCrystal_I2C lcd(0x27किंवा 0x3F, 16 , 2);
निरर्थक सेटअप())( lcd.init(); }

// स्पष्टीकरण:



LCD1602 I2C - वर्ण प्रदर्शन (16x02 वर्ण),
I2C इंटरफेससह (हिरवा)

#समाविष्ट करा
#समाविष्ट करा
LiquidCrystal_I2C lcd(0x27किंवा 0x3F, 16 , 2);
निरर्थक सेटअप())( lcd.init(); }

// स्पष्टीकरण:
LiquidCrystal_I2C OBJECT (I2C_ADDRESS, COLUMNS_COLUMN, ROW_COUNTY);
// I2C_ADDRESS एकतर 0x27 किंवा 0x3F असू शकते

LCD2004 - वर्ण प्रदर्शन (20x04 वर्ण),
समांतर इंटरफेससह (निळा)

#समाविष्ट करा
लिक्विडक्रिस्टल एलसीडी(2 , 3 , 4 , 5 , 6 , 7[ , 8 , 9 , 10 , 11 ]);
निरर्थक सेटअप())( lcd.begin(20 , 4);}

// स्पष्टीकरण:
लिक्विड क्रिस्टल ऑब्जेक्ट(RS, E, D4, D5, D6, D7);
शून्य सेटअप())( OBJECT.begin(NUM_COLUMN, NUM_ROWS); )

// जर 8 डेटा बस वायर वापरल्या गेल्या असतील तर त्या सर्व सूचित करा
LiquidCrystal OBJECT(RS, E, D0, D1, D2, D3, D4, D5, D6, D7);

LCD2004 I2C - वर्ण प्रदर्शन (20x04 वर्ण),
I2C इंटरफेससह (निळा)
#समाविष्ट करा
#समाविष्ट करा
LiquidCrystal_I2C lcd(0x27किंवा 0x3F, 20 , 4);
निरर्थक सेटअप())( lcd.init(); }

// स्पष्टीकरण:
LiquidCrystal_I2C OBJECT (I2C_ADDRESS, COLUMNS_COLUMN, ROW_COUNTY);
// I2C_ADDRESS एकतर 0x27 किंवा 0x3F असू शकते

#1 उदाहरण

आम्ही I2C बसद्वारे कनेक्ट केलेल्या LCD1602 डिस्प्लेवर शिलालेख प्रदर्शित करतो. LCD2004 डिस्प्लेसह कार्य करण्यासाठी, तुम्हाला ओळ 3 बदलून LiquidCrystal_I2C lcd(0x27,20,4);

#समाविष्ट करा // I2C बस LiquidCrystal_I2C lcd(0x27,16,2) द्वारे LCD डिस्प्लेसह काम करण्यासाठी लायब्ररी कनेक्ट करा; // डिस्प्ले पॅरामीटर्स निर्दिष्ट करून, लायब्ररी ऑब्जेक्ट घोषित करा (I2C पत्ता = 0x27, स्तंभांची संख्या = 16, पंक्तींची संख्या = 2) // शिलालेख दिसत नसल्यास, पत्ता 0x27 0x3F शून्य सेटअपसह बदला())( / / lcd.init(); // LCD डिस्प्ले lcd.backlight(); // LCD डिस्प्लेचा बॅकलाइट चालू करा , 0 पंक्ती) एलसीडी. ). फंक्शन सतत चालवले जाते. परंतु आम्ही स्थिर मजकूर प्रदर्शित करत असल्याने, आम्हाला तो लूप कोड न वापरता फक्त एकदाच प्रदर्शित करावा लागेल.

#2 उदाहरण

आम्ही 4-बिट समांतर बसद्वारे कनेक्ट केलेल्या LCD1602 डिस्प्लेवर शिलालेख प्रदर्शित करतो. LCD2004 डिस्प्लेसह कार्य करण्यासाठी, तुम्हाला lcd.begin(20, 4) मध्ये ओळ 5 बदलण्याची आवश्यकता आहे;

#समाविष्ट करा // LCD डिस्प्ले LiquidCrystal lcd(2,3,4,5,6,7) सह कार्य करण्यासाठी LiquidCrystal लायब्ररी कनेक्ट करा; // डिस्प्ले पिन दर्शविणारी लायब्ररी ऑब्जेक्ट घोषित करा (RS, E, D4, D5, D6, D7) // जर 8 डेटा बस वायर वापरल्या गेल्या असतील, तर निर्दिष्ट करा (RS, E, D0, D1, D2, D3, D4 , D5, D6,D7) शून्य सेटअप())( // lcd.begin(16, 2); // LCD डिस्प्लेसह कार्य सुरू करा, संख्या (स्तंभ, पंक्ती) lcd.setCursor(0, 0); // कर्सरला स्थितीवर सेट करा (0 स्तंभ, 0 पंक्ती) lcd.print("LCD2004"); // कर्सरच्या स्थितीपासून सुरू होणारा मजकूर "LDC1602" मुद्रित करा lcd.setCursor(0, 1); कर्सरला स्थितीवर सेट करा (0 स्तंभ, 1 पंक्ती) ) lcd.print("www.iarduino.ru"); // "www.iarduino.ru" मजकूर मुद्रित करा, कर्सरच्या स्थितीपासून प्रारंभ करा ) // // void loop()() // लूप फंक्शनमधील कोड सतत कार्यान्वित केला जातो. परंतु आम्ही स्थिर मजकूर प्रदर्शित करत असल्याने, आम्हाला तो लूप कोड न वापरता फक्त एकदाच प्रदर्शित करावा लागेल.

#3 उदाहरण

आम्ही I2C बसद्वारे कनेक्ट केलेल्या LCD1602 डिस्प्लेवर "रशियन भाषा" शिलालेख प्रदर्शित करतो:

#समाविष्ट करा // I2C बस #include सह कार्य करण्यासाठी लायब्ररी कनेक्ट करा // I2C बस LiquidCrystal_I2C lcd(0x27,16,2) द्वारे LCD डिस्प्लेसह काम करण्यासाठी लायब्ररी कनेक्ट करा; // डिस्प्ले पॅरामीटर्स निर्दिष्ट करून, लायब्ररी ऑब्जेक्ट घोषित करा (I2C पत्ता = 0x27, स्तंभांची संख्या = 16, पंक्तींची संख्या = 2) // uint8_t चिन्ह = ( // 6 मूळ चिन्हे (भाषा) ची ॲरे घोषित करा, प्रत्येक चिन्हाचा समावेश आहे 8 बाइट्सचे ( 0, 0,18,20,24,20,18, 0), // ते ( 0, 0,17,19,21,25,17, 0 ), // आणि (10, 4 , 17,19,21,25,17, 0 ), // व्या ( 0, 0, 15,17,15, 5, 9, 0 ), // i ( 0, 0,14,17, 6,17 , 14, 0 ), // z ( 0, 0,17,17,29,19,29, 0 )); // s // void setup())( // lcd.init(); // LCD डिस्प्ले lcd.backlight(); // LCD डिस्प्लेचा बॅकलाइट चालू करा lcd.createChar(1, चिन्ह ); // डिस्प्ले RAM lcd.createChar(2, चिन्ह) मध्ये 1 चिन्ह "i" लोड करा lcd.createChar(3, चिन्ह); डिस्प्ले RAM lcd.createChar (4, चिन्ह) मध्ये "th" चिन्ह; // RAM lcd.createChar(5, चिन्ह) मध्ये 4 था चिन्ह "z" लोड करा; डिस्प्ले RAM lcd.createChar(6, चिन्ह "s" RAM lcd.setCursor(0, 0) मध्ये कर्सर सेट करा (0 स्तंभ, 0 पंक्ती) lcd.print("Pycc\1\); 2\3 \4\5\6\1"); // "Pyccy भाषा" मजकूर आउटपुट करा, जेथे "Pycc" लॅटिनमध्ये लिहिलेले आहे आणि "kyy भाषा" - डिस्प्ले RAM मधील वर्णांमध्ये ) // जर तुम्ही डिस्प्ले RAM मधून एक वर्ण आउटपुट करणे आवश्यक आहे, नंतर \ आणि अक्षर क्रमांक // void loop( )() // लूप फंक्शनमधील कोड सतत कार्यान्वित केला जातो. परंतु आम्ही स्थिर मजकूर प्रदर्शित करत असल्याने, आम्हाला तो लूप कोड न वापरता फक्त एकदाच प्रदर्शित करावा लागेल.

LiquidCrystal आणि LiquidCrystal_I2C लायब्ररीमध्ये सामान्य कार्ये:

  • सुरू(कॉल्स, पंक्ती, ); - स्तंभ, पंक्ती आणि वर्ण आकाराच्या संख्येसह प्रदर्शन सुरू करते.
  • स्पष्ट ();- कर्सरसह डिस्प्ले 0,0 स्थितीत साफ करणे (खूप वेळ लागतो!).
  • मुख्यपृष्ठ();- कर्सर ०.० वर सेट करणे (खूप वेळ लागतो!).
  • डिस्प्ले();- डिस्प्ले त्वरीत चालू करा (RAM मध्ये डेटा न बदलता).
  • noDisplay();- डिस्प्ले पटकन बंद करा (RAM मध्ये डेटा न बदलता).
  • लुकलुकणे();- लुकलुकणारा कर्सर चालू करा (सुमारे 1 Hz च्या वारंवारतेसह).
  • noBlink();- फ्लॅशिंग कर्सर बंद करा.
  • कर्सर();- कर्सर अधोरेखित सक्षम करा.
  • noCursor();- कर्सर अधोरेखित अक्षम करा.
  • scrollDisplayLeft();- डिस्प्ले डावीकडे स्क्रोल करा. शिफ्ट डिस्प्ले डावीकडे एक स्तंभ समन्वय साधते (RAM न बदलता).
  • scrollDisplayRight();- उजवीकडे डिस्प्ले स्क्रोल करा. शिफ्ट डिस्प्ले एका स्तंभाला उजवीकडे समन्वय साधते (RAM न बदलता).
  • डावीकडून उजवीकडे();- पुढील वर्ण प्रदर्शित केल्यानंतर, एक स्तंभ उजवीकडे, कर्सरची स्थिती आणखी शिफ्ट करण्यासाठी निर्दिष्ट करते.
  • rightToLeft();- पुढील वर्ण प्रदर्शित केल्यानंतर, एक स्तंभ डावीकडे, कर्सरची स्थिती आणखी शिफ्ट करण्यासाठी निर्दिष्ट करते.
  • noAutoscroll();- मजकूर भविष्यात कर्सर स्थानाच्या डावीकडे संरेखित केला जाईल (नेहमीप्रमाणे) निर्दिष्ट करते.
  • स्वयं स्क्रोल();- मजकूर भविष्यात कर्सर स्थानावरून उजवीकडे संरेखित केला जाईल असे सूचित करते.
  • CreateChar(संख्या, ॲरे ); - निर्दिष्ट क्रमांकाखाली CGRAM प्रदर्शित करण्यासाठी एक सानुकूल वर्ण लिहा.
  • सेटकर्सर(कॉल, पंक्ती ); - स्तंभ आणि ओळ क्रमांकाने दर्शविलेल्या स्थानावर कर्सर ठेवा.
  • छापा(मजकूर ); - डिस्प्ले स्क्रीनवर मजकूर, चिन्हे किंवा संख्या प्रदर्शित करा. सिंटॅक्स समान नावाच्या सीरियल क्लास फंक्शन प्रमाणे आहे.

फंक्शन्स फक्त LiquidCrystal_I2C लायब्ररीमध्ये लागू केले जातात:

  • त्यात();- प्रदर्शन आरंभीकरण. ऑब्जेक्ट तयार केल्यानंतर प्रथम LiquidCrystal_I2C लायब्ररी कमांड असणे आवश्यक आहे. खरं तर, हे फंक्शन लिक्विडक्रिस्टल लायब्ररीमध्ये देखील आहे, परंतु त्या लायब्ररीमध्ये जेव्हा एखादी वस्तू तयार केली जाते तेव्हा ते स्वयंचलितपणे (डिफॉल्टनुसार) कॉल केले जाते.
  • बॅकलाइट ();- डिस्प्ले बॅकलाइट चालू करा.
  • noBacklight();- डिस्प्ले बॅकलाइट बंद करते.
  • सेटबॅकलाइट(झेंडा ); - बॅकलाईट नियंत्रण (सत्य - चालू / असत्य - बंद), noBacklight आणि बॅकलाइट फंक्शन्सऐवजी वापरले.

कनेक्शन:

// I2C बससाठी:
#समाविष्ट करा
#समाविष्ट करा
LiquidCrystal_I2C एलसीडी(पत्ता , कर्नल , पंक्ती );
निरर्थक सेटअप())(
lcd.init();
}

पॅरामीटर:
  • पत्ता: I2C बसवर पत्ता प्रदर्शित करा - 0x27 किंवा 0x3F
  • col:
  • पंक्ती:
// 4-वायर समांतर बससाठी:
#समाविष्ट करा
लिक्विड क्रिस्टल एलसीडी(आर.एस. , , D4 , D5 , D6 , D7 );
निरर्थक सेटअप())(
lcd.begin(कर्नल , पंक्ती );
}
पॅरामीटर:
  • RS:आर्डिनो पिनची संख्या ज्याला RS पिन जोडलेली आहे
  • ई: Arduino पिन नंबर ज्याला पिन E जोडलेला आहे
  • D0...D3: Arduino पिनची संख्या ज्याला पिन D0-D3 जोडलेले आहेत
  • D4...D7: Arduino पिनची संख्या ज्यावर पिन D4-D7 जोडलेले आहेत
  • col:डिस्प्लेमध्ये अंमलात आणलेल्या स्तंभांची संख्या
  • पंक्ती:डिस्प्लेमध्ये लागू केलेल्या ओळींची संख्या
// 8-वायर समांतर बससाठी:
#समाविष्ट करा
लिक्विड क्रिस्टल एलसीडी(आर.एस. , , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 );
निरर्थक सेटअप())(
lcd.begin(कर्नल , पंक्ती );
}
सुरू(कर्नल , पंक्ती , );
स्क्रीन परिमाणे आणि वर्णांसह डिस्प्ले सुरू करते.
पॅरामीटर:
  • col:डिस्प्लेमध्ये अंमलात आणलेल्या स्तंभांची संख्या
  • पंक्ती:डिस्प्लेमध्ये लागू केलेल्या ओळींची संख्या
  • आकार:वर्ण आकार, स्थिरांक द्वारे दर्शविला जातो:
    LCD_5x8DOTS (डीफॉल्ट), किंवा LCD_5x10DOTS
/* I2C बससाठी: */ # समावेश // I2C बस #include सह कार्य करण्यासाठी लायब्ररी कनेक्ट करा // I2C बस LiquidCrystal_I2C lcd(0x3F,20,4) द्वारे LCD डिस्प्लेसह काम करण्यासाठी लायब्ररी कनेक्ट करा; // डिस्प्ले पॅरामीटर्स दर्शवत, लायब्ररी ऑब्जेक्ट घोषित करा (I2C पत्ता = 0x3F, स्तंभांची संख्या = 20, पंक्तींची संख्या = 4) // void setup())( // lcd.init(); // यासह कार्य सुरू करा LCD डिस्प्ले lcd.backlight (); // LCD डिस्प्लेचा बॅकलाइट चालू करा... // आउटपुट माहिती जी स्टार्टअपवर प्रदर्शित केली जावी) // // void loop()() // ... // आउटपुट माहिती जी तुमच्या कोडच्या अल्गोरिदमनुसार बदलली पाहिजे) // /* 4-वायर समांतर बससाठी: */ #include // LCD डिस्प्ले LiquidCrystal lcd(2,3,4,5,6,7) सह कार्य करण्यासाठी LiquidCrystal लायब्ररी कनेक्ट करा; // डिस्प्ले पिन दर्शविणारी लायब्ररी ऑब्जेक्ट घोषित करा (RS, E, D4, D5, D6, D7) // जर 8 डेटा बस वायर वापरल्या गेल्या असतील, तर निर्दिष्ट करा (RS, E, D0, D1, D2, D3, D4 , D5, D6,D7) शून्य सेटअप())( // lcd.begin(16, 2); // LCD डिस्प्लेसह कार्य सुरू करा, संख्या दर्शविते (स्तंभ, पंक्ती) ... // आउटपुट माहिती जी पाहिजे स्टार्टअपवर प्रदर्शित केले जाईल) // void loop()() // ... // आउटपुट माहिती जी तुमच्या कोडच्या अल्गोरिदमनुसार बदलली पाहिजे) //

प्रदर्शन नियंत्रण कार्ये:

डिस्प्ले();
नोडिस्प्ले फंक्शनद्वारे डिस्प्ले बंद केल्यानंतर ते चालू करते.
टीप: फंक्शन त्वरीत चालते आणि डिस्प्ले RAM बदलत नाही.
noDisplay();
डिस्प्ले बंद करतो.
डिस्प्ले फंक्शन कॉल करेपर्यंत डिस्प्लेवरील डेटा प्रदर्शित केला जाणार नाही, परंतु तो रॅम मेमरीमधून पुसला जाणार नाही आणि डिस्प्ले फंक्शन कॉल केल्यानंतर, तो पुन्हा प्रदर्शित केला जाईल.
टीप: फंक्शन त्वरीत चालते आणि डिस्प्ले RAM बदलत नाही.
scrollDisplayLeft();
डिस्प्ले निर्देशांक एक स्तंभ डावीकडे हलवते.



scrollDisplayRight();
डिस्प्ले निर्देशांक एक स्तंभ उजवीकडे हलवते.
या फंक्शनला सतत कॉल केल्याने एक रेंगाळणारा प्रभाव तयार होईल.
डिस्प्लेवर उपलब्ध असलेल्या माहितीसाठी आणि नंतर प्रदर्शित होणाऱ्या दोन्हीसाठी निर्देशांक हलवले जातात.
टीप: डिस्प्ले RAM न बदलता फंक्शन कार्य करते.
तुम्ही फंक्शनला सलग ४० वेळा कॉल केल्यास, समन्वय मूळ बिंदूवर परत येईल
स्पष्ट ();
कर्सर 0,0 वर सेट करून डिस्प्ले साफ करते.
डिस्प्लेवरील माहिती कायमची मिटवली जाईल.
टीप: बराच वेळ लागतो.
बॅकलाइट ();
डिस्प्ले बॅकलाइट चालू करा.
noBacklight();
डिस्प्ले बॅकलाइट बंद करा.
टीप: फंक्शन फक्त LiquidCrystal_I2C लायब्ररीमध्ये लागू केले जाते.
सेटबॅकलाइट(झेंडा );
बॅकलाइट नियंत्रण (नो बॅकलाइट आणि बॅकलाइट फंक्शन्सऐवजी).
पॅरामीटर:
  • झेंडा:खरे - चालू करते आणि असत्य - बॅकलाइट बंद करते.
टीप: फंक्शन फक्त LiquidCrystal_I2C लायब्ररीमध्ये लागू केले जाते.
/* डिस्प्ले कंट्रोल फंक्शन्सचे निरीक्षण करण्यासाठी संदेश प्रदर्शित करा: */ lcd.cursor(0,0); // कर्सर डिस्प्लेच्या सर्वात वरच्या कोपर्यात सेट करा (0 स्तंभ, 0 पंक्ती) lcd.print("iarduino.ru"); // "iarduino.ru" मजकूर प्रदर्शित करा (पहिले अक्षर "i" स्थिती "0.0" वर असेल, आणि शेवटचे "u" स्थान "10.0" वर असेल, "11.0" स्थानावर अदृश्य कर्सर असेल) // lcd.noDisplay (); // डिस्प्ले बंद करा (डिस्प्लेमधून शिलालेख अदृश्य होईल) lcd.display(); // डिस्प्ले चालू करा (शिलालेख त्याच ठिकाणी डिस्प्लेवर दिसेल) lcd.scrollDisplayLeft(); // स्तंभांचे निर्देशांक डावीकडे शिफ्ट करा (डिस्प्ले पहिल्या अक्षराशिवाय "arduino.ru" प्रदर्शित करेल, जो डिस्प्लेच्या पलीकडे जाईल, परंतु त्याच्या RAM मध्ये राहील) lcd.scrollDisplayRight(); // स्तंभ निर्देशांक उजवीकडे शिफ्ट करा (डिस्प्ले "iarduino.ru" त्याच ठिकाणी प्रदर्शित करेल जिथे ते मूळ प्रदर्शित केले गेले होते) lcd.clear(); // डिस्प्ले साफ करा (शिलालेख डिस्प्लेमधून कायमचे गायब होईल) lcd.noBacklight(); // डिस्प्ले बॅकलाइट बंद करा lcd.backlight(); // डिस्प्ले बॅकलाइट चालू करा lcd.setBacklight(0); // डिस्प्ले बॅकलाइट बंद करा lcd.setBacklight(1); // डिस्प्ले बॅकलाइट चालू करा

कर्सर नियंत्रण कार्ये:

सेटकर्सर(कर्नल , पंक्ती );
कर्सर निर्दिष्ट स्थानावर ठेवते.
पॅरामीटर:
  • col:स्तंभ क्रमांक (0 पासून सुरू होतो).
  • पंक्ती:ओळ क्रमांक (0 पासून सुरू होणारी)
मुख्यपृष्ठ();
कर्सर 0,0 वर सेट करत आहे. फंक्शन setCursor(0,0) सारखे कार्य करते;
टीप: बराच वेळ लागतो.
लुकलुकणे();
ब्लिंकिंग कर्सर सक्षम करा.
टीप: कर्सर संपूर्ण कॅरेक्टर फील्ड व्यापतो आणि आधी सेट केलेल्या स्थितीत सुमारे 1 Hz च्या वारंवारतेवर ब्लिंक करतो.
noBlink();
ब्लिंक करणारा कर्सर बंद करा.
टीप: कर्सर अदृश्य होतो, परंतु त्याची स्थिती राखली जाते.
कर्सर();
कर्सर अंडरलाइनिंग सक्षम करा.
टीप: कर्सर अंडरस्कोरचे रूप धारण करतो आणि तो पूर्वी ठेवलेल्या स्थितीत असतो.
noCursor();
कर्सर अधोरेखित करणे बंद करा.
टीप: कर्सर अदृश्य होतो, परंतु त्याची स्थिती राखली जाते.
lcd.setCursor(0, 1); // दुसऱ्या ओळीच्या पहिल्या वर्णावर कर्सर सेट करा (पंक्ती आणि स्तंभ क्रमांकन 0 पासून सुरू होते) lcd.home(); // कर्सरला पहिल्या ओळीच्या पहिल्या अक्षरावर सेट करा (जसे की lcd.setCursor(0,0);) lcd.blink(); // कर्सर दृश्यमान करा (कर्सरच्या जागी एक आयत ब्लिंक होईल) lcd.noBlink(); // कर्सर अदृश्य करा (ब्लिंकिंग आयत काढा) lcd.cursor(); // कर्सर दृश्यमान करा (कर्सरच्या जागी एक अंडरस्कोर दिसेल) lcd.noCursor(); // कर्सर अदृश्य करा (अंडरस्कोर काढा) // जर कर्सर एखाद्या वर्ण असलेल्या ठिकाणी आदळला तर हे वर्ण अदृश्य होत नाही

दिशा आणि संरेखन दर्शविणारी कार्ये:

डावीकडून उजवीकडे();
निर्दिष्ट करते की प्रत्येक नवीन वर्णानंतर, कर्सर स्थितीने एक स्तंभ उजवीकडे हलविला पाहिजे.
टीप: जर तुम्ही "abc" मजकूर प्रदर्शित केला तर डिस्प्ले "abc" दर्शवेल आणि मजकूर मूळ कर्सर स्थानाच्या उजवीकडे असेल.
(नेहमी प्रमाणे)
rightToLeft();
निर्दिष्ट करते की प्रत्येक नवीन वर्णानंतर, कर्सर स्थितीने एक स्तंभ डावीकडे हलविला पाहिजे.
टीप: जर तुम्ही "abc" मजकूर प्रदर्शित केला तर डिस्प्ले "cba" प्रदर्शित करेल आणि मजकूर मूळ कर्सर स्थानाच्या डावीकडे असेल.
(उजवीकडून डावीकडे लेखन)
noAutoscroll();
सूचित करते की भविष्यात, मजकूर मूळ कर्सर स्थानाच्या डावीकडे संरेखित केला पाहिजे.
टीप: जर तुम्ही कर्सर 10.0 च्या स्थानावर ठेवला आणि मजकूर प्रदर्शित केला, तर प्रदर्शित मजकूराचा पहिला वर्ण या स्थानावर असेल.
(नेहमी प्रमाणे)
स्वयं स्क्रोल();
सूचित करते की भविष्यात, मजकूर मूळ कर्सर स्थानाच्या उजवीकडे संरेखित केला पाहिजे.
टीप: जर तुम्ही कर्सर 10.0 च्या स्थानावर ठेवला आणि मजकूर प्रदर्शित केला, तर कर्सर या स्थानावर असेल.
(आउटपुट मजकूरात जितक्या वेळा अक्षरे आहेत तितक्या वेळा तुम्ही scrollDisplayLeft फंक्शनला कॉल केल्यास डिस्प्ले निर्देशांक डावीकडे हलवले जातील)
lcd.leftToRight(); // कर्सरला उजवीकडे जाण्याची सूचना द्या (युरोपियन लेखनात नेहमीप्रमाणे) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // डिस्प्लेवर आपण पाहू: "ABC" ("A" नंतर कर्सर उजवीकडे हलविला आणि "B" प्रदर्शित झाला, नंतर कर्सर उजवीकडे हलविला आणि "C" प्रदर्शित झाला) lcd.rightToLeft(); // कर्सरला डावीकडे जायला सांगा (उजवीकडून डावीकडे लिहिल्याप्रमाणे) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // डिस्प्लेवर आपण पाहू: "CBA" ("A" नंतर कर्सर डावीकडे हलविला आणि "B" प्रदर्शित झाला, नंतर कर्सर डावीकडे हलविला आणि "C" प्रदर्शित झाला) lcd.noAutoscroll(); // डावे संरेखन सेट करा (नेहमीप्रमाणे) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // डिस्प्लेवर आपण पाहू: "ABC" (नेहमीप्रमाणे) lcd.autoscroll(); // संरेखन उजवीकडे सेट करा (प्रदर्शन निर्देशांक प्रदर्शित केलेल्या वर्णांच्या संख्येनुसार डावीकडे हलवले जातील) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // डिस्प्लेवर आपण पाहू: "ABC" (प्रदर्शन निर्देशांक 3 वर्ण डावीकडे हलवले जातील, कारण प्रत्येक वर्णानंतर scrollDisplayLeft फंक्शनला कॉल केला जातो)

मजकूर आणि चिन्ह इनपुट कार्ये:

createChar(संख्या, ॲरे);
डिस्प्लेच्या CGRAM वर निर्दिष्ट क्रमांकाखाली एक सानुकूल वर्ण लिहितो.
जर तुम्हाला मजकूर (प्रिंट फंक्शन वापरून) प्रदर्शित करायचा असेल ज्यामध्ये तुम्ही सेट केलेला वर्ण असावा, एक स्लॅश आणि हा वर्ण ज्याच्या खाली लिहिला होता तो क्रमांक निर्दिष्ट करा: print("C\1MBO\2").
पॅरामीटर:
  • संख्या:संख्या ज्याखाली चिन्ह लिहिले जाईल.
  • रचना:लिहिल्या जाणाऱ्या वर्णाचे प्रतिनिधित्व करणारी ॲरे.
टीप: ॲरेमध्ये अनेक बाइट्स असतात, ज्याची संख्या चिन्हातील ओळींच्या संख्येइतकी असते. प्रत्येक सेट बाइट बिट एका सेट (प्रदर्शित) वर्ण पिक्सेलशी संबंधित आहे.
मुद्रित (मजकूर);
डिस्प्ले स्क्रीनवर मजकूर, चिन्हे किंवा संख्या प्रदर्शित करा.
पॅरामीटर:
  • मजकूर:वर्ण, संख्या किंवा स्ट्रिंग प्रदर्शित करणे.
टीप: वाक्यरचना त्याच नावाच्या सीरियल क्लास फंक्शन सारखी आहे.
#समाविष्ट करा // I2C बस #include सह कार्य करण्यासाठी लायब्ररी कनेक्ट करा // I2C बस LiquidCrystal_I2C lcd(0x27,16,2) द्वारे LCD डिस्प्लेसह काम करण्यासाठी लायब्ररी कनेक्ट करा; // डिस्प्ले पॅरामीटर्स (I2C पत्ता = 0x27, स्तंभांची संख्या = 16, पंक्तींची संख्या = 2) // uint8_t प्रतीक_d = (0b00000, // "d" चिन्हाची 1 ओळ 0b00000, /) दर्शवणारी लायब्ररी ऑब्जेक्ट घोषित करा / "d" चिन्हाची दुसरी ओळ " 0b00110, // "d" 0b01010 वर्णाची तिसरी ओळ, // "d" 0b01010 वर्णाची चौथी ओळ, // "d" 0b01010 वर्णाची 5वी ओळ, // "d" 0b11111 वर्णाची 6 वी ओळ, // "d" " 0b10001 वर्णाची 7 वी ओळ); // "d" चिन्हाची 8वी ओळ संपूर्ण ॲरे एका ओळीत लिहिली जाऊ शकते: uint8_t symbol_d=(0,0,6,10,10,10,31,17); // uint8_t प्रतीक_i = (0b00000, // "आणि" चिन्हाची 0b00000 ची पहिली ओळ, // "आणि" चिन्हाची 2री ओळ 0b10001, // "आणि" चिन्हाची 3री ओळ 0b10011, // 0b10011 ची चौथी ओळ "आणि" चिन्ह 0b10101, // "आणि" चिन्हाची 5 वी ओळ 0b11001, // "आणि" चिन्हाची 6 वी ओळ 0b10001, // "आणि" चिन्हाची 7 वी ओळ 0b00000); // "आणि" चिन्हाची 8वी ओळ संपूर्ण ॲरे एका ओळीत लिहिली जाऊ शकते: uint8_t symbol_i=(0,0,17,19,21,25,17,0); void setup())( // lcd.init(); // LCD डिस्प्ले lcd.backlight(); // LCD डिस्प्ले lcd.createChar(1,symbol_d) चा बॅकलाइट चालू करा; // लोड करा डिस्प्ले मेमरी lcd .createChar(2,symbol_i) मध्ये पहिले चिन्ह // डिस्प्ले मेमरीमध्ये लोड करा lcd.setCursor(0,0); कर्सर सर्वात वरच्या कोपऱ्यात lcd.print("Pa\ 1\2o"); // "P", "a", "o" अक्षरे लॅटिनमध्ये लिहिताना "रेडिओ" आउटपुट करा, ) // आणि वर्ण "d", "i" हे डिस्प्ले मेमरीमधून आउटपुट आहेत, जे त्यांचे क्रमांक दर्शवतात // void loop())( // lcd.setCursor(0,1); lcd.print(" "); // संपूर्ण तळ पुसून टाका लाइन lcd.setCursor("i"); lcd.print("arduino"); // मजकूर "i" "arduino" प्रदर्शित करा; .ru" तळाच्या ओळीत विलंब (2000); // 2 सेकंद प्रतीक्षा करा lcd.setCursor( 0,1); lcd.print(" "); // संपूर्ण तळ ओळ lcd.setCursor(0,1) पुसून टाका; lcd.print(12.345); // 12.34 अंक मुद्रित करा (2 दशांश स्थाने प्रदर्शित आहेत) विलंब (2000) ); // संपूर्ण तळ ओळ मिटवा lcd.setCursor(0,1); lcd.print(12, HEX); // हेक्साडेसिमल संख्या विलंब (2000) म्हणून क्रमांक 12 प्रदर्शित करा; // 2 सेकंद प्रतीक्षा करा lcd.setCursor(0,1); lcd.print(""); // संपूर्ण तळ ओळ मिटवा lcd.setCursor(0,1); lcd.print(1); // क्रमांक 1 विलंब (2000) प्रदर्शित करा; // 2 सेकंद थांबा)

आज, सिम्बॉलिक लिक्विड क्रिस्टल एलसीडी इंडिकेटर्सचा वापर साध्या लाक्षणिक माहिती प्रदर्शित करण्यासाठी केला जातो. आम्ही त्यांच्याबरोबर कसे कार्य करावे याबद्दल बोलू. लेखाच्या या भागात, आम्ही HITACHI HD44780 कंट्रोलर (किंवा सुसंगत SAMSUNG KS0066) वर आधारित वर्ण LCDs वर तपशीलवार विचार करू. या LCDs सह काम करताना मला मिळालेली माहिती पद्धतशीर करण्याचा लेख हा एक प्रयत्न आहे.

कंट्रोलर HD44780 (KS0066) सह कॅरेक्टर LCD. इंटरफेस

कॅरेक्टर LCD हे ठिपकेंच्या मॅट्रिक्सपेक्षा अधिक काही नाही, जे रेषा आणि वर्ण फील्डमध्ये विभागलेले आहे:

हे मॅट्रिक्स नियंत्रित करण्यासाठी आणि वास्तविक वर्ण आउटपुट करण्यासाठी एक विशेष नियंत्रक वापरला जातो.

HD44780 (आणि त्याचे सुसंगत KS0066) हे समांतर 4 किंवा 8-बिट इंटरफेससह मोनोक्रोम LCD कॅरेक्टर-सिंथेसाइझिंग डिस्प्लेच्या नियंत्रकांसाठी वास्तविक मानक आहे. या कंट्रोलरच्या आधारे, 8x1 (एका ओळीत आठ वर्ण) पासून सुरू होणारी आणि 40x4 (दोन स्वतंत्र नियंत्रण चिप्स असलेली) सह समाप्त होणारी, भिन्न डिझाइन आणि रिझोल्यूशनसह मोठ्या संख्येने मॉडेल तयार केले जातात. कंट्रोलरची ठराविक ऑपरेटिंग वारंवारता 270 kHz आहे.

एलसीडी कंट्रोलर 3 मेमरी ब्लॉक्ससह कार्य करतो:

1. कॅरेक्टर आउटपुट करण्यासाठी कंट्रोलर मेमरी वापरतो DDRAM(Display Data RAM), जिथे आपण LCD वर पाहू इच्छित असलेल्या वर्णांचे ASCII कोड संग्रहित केले जातात. त्यासाठी 80 मेमरी सेलचे वाटप करण्यात आले आहे. हे स्पष्ट आहे की एलसीडीवर आपल्याला डीडीआरएएममधील वर्णांचा फक्त काही भाग दिसेल - जर आमची एलसीडी 1 किंवा 2 ओळ असेल आणि प्रत्येक ओळीत 8 वर्ण प्रदर्शित करत असेल, तर याप्रमाणे:

डिस्प्लेचे कार्यरत क्षेत्र, जसे आपण पाहू शकता, डीडीआरएएम सेलसह हलविले जाऊ शकते (आपल्याला एक रेंगाळणारा प्रभाव मिळेल).

2. नियंत्रक स्वतःहून चिन्हांचे टेम्पलेट घेतो CGROM(कॅरेक्टर जनरेटर रॉम) – कॅरेक्टर जनरेटर मेमरी. चिन्ह सारणी HD44780 च्या तपशीलामध्ये आढळू शकते.

3. वापरकर्ता चिन्हे (त्यांचे टेम्पलेट) संचयित करण्यासाठी मेमरी प्रदान केली जाते CGRAM(कॅरेक्टर जनरेटर रॅम).

तसेच, नियंत्रक, काही अटींवर अवलंबून, त्यात प्राप्त केलेला डेटा वितरीत करतो सूचना नोंदवहीकिंवा डेटा रजिस्टर.

ठराविक 14-पिन HD44780 कंट्रोलर इंटरफेस:

ग्राउंड, सामान्य, GND

पुरवठा व्होल्टेज, Vcc (+5V)

कॉन्ट्रास्ट समायोजित करणे (Vo)

नोंदणी निवड (HD44780 साठी R/S, KS0066 साठी A0)

वाचा/लिहा (R/W)

फॉल ई वर स्ट्रोब (सक्षम करा)

बिट 0 (8-बिट इंटरफेससाठी किरकोळ)

डेटा लाइन

DB 4 (4-बिट इंटरफेससाठी किरकोळ)

DB 7 (8 (4) बिट इंटरफेससाठी उच्च)

बॅकलिट प्रदर्शनासाठी

बॅकलिट डिस्प्लेसाठी बॅकलाइट पॉवर (एनोड)

बॅकलिट डिस्प्लेसाठी बॅकलाइट पॉवर (कॅथोड)

आम्ही डेटाशीटमध्ये विशिष्ट एलसीडीवरील पिनची संख्या पाहतो.

पुढील आकृतीनुसार अतिरिक्त 10 kOhm ट्रिम रेझिस्टर जोडून एलसीडीवरील प्रतिमेचा कॉन्ट्रास्ट बदलला जाऊ शकतो:

परंतु, तुम्ही तुमच्या कंट्रोलरचे तपशील पहावे (उदाहरणार्थ, KS0066 चिपवरील Klsn10294v-0 LCD मध्ये 1-Vcc आणि 2-GND आहे). बॅकलाइट पॉवर सप्लाय त्याच्या प्रकारानुसार मॉडेलपासून मॉडेलमध्ये बदलू शकतो. सामान्यत: बॅकलाइट 5 व्होल्टद्वारे समर्थित असते;

पिन असाइनमेंट R/S, R/W, ई:

जेव्हा उच्च लॉगमधून E संक्रमण होते. टर्मिनल्सवर आधीपासूनच "हँग" असलेल्या कमी डेटाची पातळी DB0..DB7, नंतरच्या प्रक्रियेसाठी एलसीडी कंट्रोलरच्या मेमरीमध्ये लिहिलेले असतात.

उच्च लॉग येथे. R/S (रजिस्टर सिलेक्ट) स्तरावर, LCD कंट्रोलर बिट्सचा हा संच डेटा (कॅरेक्टर कोड) म्हणून ओळखतो आणि कमी स्तरावर - एक सूचना म्हणून आणि त्यांना योग्य रजिस्टरला पाठवतो.

R/W पिन DB0..DB7 च्या ऑपरेशनची दिशा ठरवते - जर R/W “0” असेल, तर आपण फक्त DB पोर्टवर लिहू शकतो आणि जर R/W = “1” असेल तर आपण त्यातून वाचू शकतो. (उदाहरणार्थ, नियंत्रक व्यस्त आहे किंवा नवीन डेटा प्राप्त करण्यास मोकळा आहे का ते शोधा). जर आपण LCD वरून डेटा वाचला नाही, तर आपण जमिनीवर R/W "रोपण" करू शकतो.

HD44780 सूचना संच

एलसीडीवर माहिती प्रदर्शित करणे सुरू करण्यासाठी, त्याचे नियंत्रक प्रारंभ करणे आवश्यक आहे (त्याला इंटरफेस, फॉन्ट, ऑफसेट इ. बद्दल माहिती द्या). नियंत्रक एकूण 11 आज्ञा स्वीकारू शकतो:

सूचनांचे नाव

पिन स्थिती

पूर्ण होण्याची वेळ

f गुलाम = 270 kHz

संपूर्ण LCD साफ करणे आणि DDRAM पत्ता 0 वर सेट करणे

वर्तमान DDRAM पत्ता 0 वर सेट केल्याने (कर्सर - होम) DDRAM डेटा बदलत नाही

डेटा आउटपुट करताना कर्सर हालचालीची दिशा (I/D) आणि डिस्प्ले ऑफसेट (S) सेट करणे

चालू/बंद नियंत्रण प्रदर्शित करा

चालु बंद. डिस्प्ले(डी), कर्सर(सी) आणि त्याचा झगमगाट(बी)

कर्सर किंवा डिस्प्ले शिफ्ट

कर्सर हलवते आणि डिस्प्ले DDRAM वर हलवते

इंटरफेस (DL), ओळींची संख्या (N) आणि वर्ण फॉन्ट (F) सेट करणे

CGRAM पत्ता सेट करा

CGRAM पत्ता काउंटर सेट करत आहे. यानंतर, तुम्ही CGRAM वर डेटा लिहू शकता

DDRAM पत्ता सेट करा

DDRAM पत्ता काउंटर सेट करत आहे

व्यस्त ध्वज आणि पत्ता वाचा

जर BF = 1 असेल तर LCD कंट्रोलर अंतर्गत ऑपरेशन करत आहे (व्यस्त). AC6-AC0 – DDRAM पत्त्याचे वर्तमान मूल्य

RAM वर डेटा लिहा

RAM वर डेटा लिहित आहे

RAM वरून डेटा वाचा

RAM वरून डेटा वाचत आहे

I/D = 1: DDRAM पत्ता I/D = 0: कमी होतो
S = 1: डिस्प्ले वर्किंग एरिया DDRAM द्वारे हलवण्याची परवानगी आहे
D = 1: डिस्प्ले (चित्र) चालू
C = 1: कर्सर सक्षम
B = 1: कर्सर ब्लिंकिंग सक्षम

S/C = 1: हलवा डिस्प्ले S/C = 0: कर्सर हलवा
R/L = 1: उजवा R/L = 0: डावीकडे

DL=1:8 बिट DL=0:4 बिट्स
N=1:2 ओळी N=0:1 रेषा
F = 1: 5x10 F = 0: 5x8

ACG:CGRAM पत्ता
जोडा: DDRAM पत्ता (कर्सर पत्ता)
AC: पत्ता काउंटर DD आणि CGRAM पत्ते

एलसीडी आरंभ

एलसीडी कंट्रोलर सुरू करण्याचे 2 मार्ग आहेत:

1. अंतर्गत रीसेट सर्किट द्वारे.

2. मॅन्युअल मोडमध्ये (त्यावर अनेक कमांड पाठवून, ज्याद्वारे आम्ही एलसीडीचा ऑपरेटिंग मोड सेट करतो)

पॉवर चालू केल्यानंतर कंट्रोलरचे अंतर्गत रीसेट सर्किट लगेच कार्य करण्यास सुरवात करते. यात एक कमतरता आहे - जर आमची शक्ती ऑपरेटिंग स्तरावर हळू हळू (10 ms पेक्षा कमी) होत असेल तर कंट्रोलरचे सेल्फ-इनिशियलायझेशन योग्यरित्या पुढे जाऊ शकत नाही. या आरंभिकरण पद्धतीसह, नियंत्रक स्वतः खालील आदेश कार्यान्वित करतो:

1.स्पष्ट प्रदर्शित करा

2. फंक्शन सेट:
डीएल = 1; 8-बिट इंटरफेस डेटा
एन = 0; 1-लाइन प्रदर्शन
F = 0; 5x8 डॉट वर्ण फॉन्ट

3. ऑन/ऑफ नियंत्रण प्रदर्शित करा:
डी = 0; डिस्प्ले ऑफ
C = 0; कर्सर बंद
बी = 0; डोळे मिचकावणे

4. एंट्री मोड सेट:
I/D = 1; १ ने वाढ
एस = 0; शिफ्ट नाही

दुसरी पद्धत उर्जा स्त्रोतावरील सर्किटचे अवलंबित्व काढून टाकते. मॅन्युअल मोडमध्ये एलसीडी कंट्रोलर सुरू करण्यासाठी, तुम्ही खालील अल्गोरिदम करणे आवश्यक आहे:

तुम्ही बघू शकता की, येथे काहीही क्लिष्ट नाही: आम्ही एलसीडीला कमांडनंतर कमांड पाठवतो, त्यांची अंमलबजावणी वेळ (सुमारे 40 μs) लक्षात घेऊन किंवा एलसीडी कंट्रोलरचा व्यस्त ध्वज तपासतो (नंतर आम्हाला आरडब्ल्यू पिन लावण्याची आवश्यकता आहे. मायक्रोकंट्रोलर फूट आणि ते “1” वर सेट करा जेव्हा आम्हाला हे शोधायचे असेल की, LCD व्यस्त आहे की नाही).

हे, खरं तर, प्रतिकात्मक एलसीडीसह कार्य करण्याच्या सिद्धांताशी संबंधित आहे. तुम्ही काही चुकल्यास किंवा चूक केली असल्यास, कंट्रोलरचे तपशील वाचा किंवा .

दुसऱ्या भागात, आम्ही पीआयसी मायक्रोकंट्रोलर आणि एलसीडी यांच्यातील संवादाच्या हार्डवेअर आणि सॉफ्टवेअरच्या अंमलबजावणीचा विचार करू.

काही काळ हा डिस्प्ले निष्क्रिय पडून होता.


आणि आता ते एका प्रकल्पात जोडण्याची इच्छा आहे, आपण अर्थातच, तयार फंक्शन्ससह लायब्ररी शोधण्याचा प्रयत्न करू शकता, परंतु या प्रकरणात प्रदर्शन कसे कार्य करते याचे चित्र अपूर्ण आहे आणि आम्ही आहोत. त्यावर आनंदी नाही. एकदा तुम्हाला एलसीडी डिस्प्लेचे ऑपरेटिंग तत्त्व समजले की, ते गहाळ असल्यास किंवा काही प्रमाणात समाधानकारक नसल्यास इच्छित डिस्प्लेसाठी तुमची स्वतःची लायब्ररी लिहिणे कठीण होणार नाही.

तर, चला सुरुवात करूया.
पहिली गोष्ट म्हणजे पिनआउट शोधणे, म्हणजे कोणता संपर्क कशासाठी जबाबदार आहे, दुसरी गोष्ट म्हणजे डिस्प्ले नियंत्रित करणाऱ्या कंट्रोलरचे नाव शोधणे, हे करण्यासाठी, या एलसीडीसाठी डेटाशीट डाउनलोड करा आणि ते उघडा. पहिले पान.


संपर्क डावीकडून उजवीकडे मोजले जातात, प्रथम लाल बाणाने चिन्हांकित केले जाते. पुरवठा व्होल्टेज 5 व्होल्ट आहे, नियंत्रण नियंत्रक S6A0069किंवा तत्सम, उदाहरणार्थ, ks0066U.

आम्ही नियंत्रण नियंत्रकाचे नाव का शोधत होतो? वस्तुस्थिती अशी आहे की डिस्प्लेवरील डेटाशीटमध्ये वेळ विलंब (वेळ आकृती) आहे, कमांड सिस्टमचे वर्णन केले आहे, परंतु तेथे कोणतेही सामान्य आरंभीकरण नाही आणि त्याशिवाय कोठेही नाही.
पुढे, दुसरे पृष्ठ उघडा आणि कोणता संपर्क कशासाठी जबाबदार आहे हे सांगणारी तक्ता पहा.


DB7…DB0- डेटा/पत्ता बस.

R/W- आम्ही काय करू, वाचू (R/W=1) किंवा लिहू (R/W=0) ठरवते

आर/एस- आम्ही कमांड (RS=0) किंवा डेटा (RS=1) पाठवू की नाही हे ठरवते.

– स्ट्रोब इनपुट, या इनपुटवर सिग्नल बदलून आम्ही डिस्प्लेला डेटा वाचण्याची/लिहण्याची परवानगी देतो.

LED±- बॅकलाइट नियंत्रण.

मला असे म्हणणे आवश्यक आहे की मला मिळालेल्या डिस्प्लेवर, बॅकलाइट चालू होणार नाही, हे करण्यासाठी, आपल्याला बोर्डवर R7 म्हणून चिन्हांकित केलेल्या रेझिस्टरमध्ये सोल्डर करणे आवश्यक आहे. पण सध्या आम्हाला त्याची गरज नाही.

कंट्रोल कंट्रोलरसाठी डेटाशीट डाउनलोड करा आणि सुरुवातीच्या सूचना शोधा. चित्रांवर क्लिक करून ते मोठे केले जाऊ शकतात.



असे दिसून आले की 8-बिट आणि 4-बिट मोडसाठी अशा दोन सूचना आहेत. हे कोणत्या प्रकारचे मोड आहेत? हे मोड निर्धारित करतात की किती वायर डेटा प्रसारित केला जाईल: चार किंवा आठ. चला ट्रान्समिशन पाहू 4 तारा, या प्रकरणात, डिस्प्ले हळू कार्य करेल, परंतु आम्ही मायक्रोकंट्रोलरच्या 4 पिन वाचवू आणि आठ-बिट मोडची अंमलबजावणी फारशी वेगळी नाही.

माहिती कनेक्शन आकृती खालीलप्रमाणे आहे.


पॉवर पिन दरम्यान पोटेंशियोमीटर जोडून कॉन्ट्रास्ट समायोजित केले जाऊ शकते.

मी तुमचे लक्ष त्या वस्तुस्थितीकडे वेधून घेऊ इच्छितो की सुरुवातीच्या काळात आर/एसआणि R/Wनेहमी शून्याच्या समान असतात, म्हणजेच आम्ही पाठवू संघ.

प्रारंभ करताना आपण कॉन्फिगर करू शकता:

  • N - प्रदर्शित रेषांची संख्या
  • C - कर्सर चालू किंवा बंद करा
  • बी - कर्सर ब्लिंक करा
  • I/D - ॲड्रेस काउंटर व्हॅल्यू वाढवा किंवा कमी करा
  • एसएच - डिस्प्ले विंडो हलवा
शेवटचे दोन मुद्दे अधिक तपशीलाने पाहू.
खालील चित्र दाखवते की आम्हाला कोणत्या पत्त्यावर डेटा लिहायचा आहे जेणेकरून तो एका विशिष्ट स्थितीत प्रदर्शित होईल, उदाहरणार्थ, जर आम्हाला चिन्ह प्रदर्शित करायचे असेल तर दुसऱ्या ओळीचे पहिले स्थान, नंतर आपण 0x40 पत्त्यावर लिहावे.


यानंतर, काउंटर मूल्य आपोआप बदलेल, एकतर वाढेल किंवा कमी होईल आणि त्यासह कर्सरची स्थिती बदलेल.

तसे, आपण ज्या मेमरीला लिहितो त्याला म्हणतात DDRAM, आम्ही या मेमरीमध्ये जे काही लिहितो ते डिस्प्लेवर प्रदर्शित केले जाईल, अजूनही आहे CGROM, जे कॅरेक्टर जनरेटर टेबल साठवते.


हे सारणी बदलता येत नाही, परंतु त्यातून तयार चिन्हे घेतली जाऊ शकतात. स्मरणशक्तीचा आणखी एक प्रकार आहे CGRAM, हे एक कॅरेक्टर जनरेटर टेबल देखील आहे, परंतु आम्ही या टेबलमधील वर्ण स्वतः काढतो.


आता स्क्रीनच्या हालचालीबद्दल काही शब्द, वस्तुस्थिती अशी आहे की सामान्यत: डिस्प्लेवर आपल्याला सर्व डीडीआरएएम दिसत नाही, परंतु खालील चित्रात दर्शविल्याप्रमाणे फक्त एक विशिष्ट भाग दिसतो.


आपण अदृश्य भागात देखील लिहू शकतो, परंतु आपण स्क्रीन विंडो या ठिकाणी हलविल्याशिवाय आपण जे लिहितो ते दृश्यमान होणार नाही.

आम्ही सिद्धांत पूर्ण केले, चला सराव करू.
4-बिट मोडमध्ये एलसीडी डिस्प्लेसह संप्रेषणाचे चित्र खालीलप्रमाणे आहे.


डेटा बाइट्समध्ये पाठविला जातो, परंतु आमच्याकडे 4-बिट मोड असल्याने, एक बाइट पाठवण्यासाठी तुम्हाला 2 पाठवणे आवश्यक आहे, सर्वात लक्षणीय बिट आधी. चित्रात, पहिल्या पार्सलला D7 (उच्च टेट्राड), दुसरे D3 (लो टेट्राड) असे नियुक्त केले आहे. पुढील पाठवण्याआधी, आम्ही व्यस्त ध्वज तपासला पाहिजे आणि जर तो सेट केला नसेल, तर आम्ही तो पुन्हा पाठवू शकतो, जोपर्यंत LCD नियंत्रित करतो तो त्याचा व्यवसाय पूर्ण करत नाही.

पाठवण्याचे सामान्य चित्र असल्याने, पाठवण्याचे ऑपरेशन कसे अंमलात आणायचे ते शोधूया.


ते पाठवण्यासाठी तुम्हाला 8-बिट बस वापरण्याची आवश्यकता आहे:
  • R/W 0 वर सेट केले
  • बसला कमांड कोड/डेटा जारी करा
  • विलंब 2us
  • लोअर स्ट्रोब ई

वाचन ऑपरेशन त्याच प्रकारे लागू केले आहे:

  • नियंत्रण नियंत्रक विनामूल्य असल्याची खात्री करा
  • R/W 1 वर सेट केले
  • स्ट्रोब ई वाढवा (या क्षणी एलसीडी बसमध्ये डेटा आउटपुट करेल)
  • विलंब 2us
  • एलसीडीने काय दिले ते आम्ही वाचतो
  • लोअर स्ट्रोब ई
2us विलंब कोठून आला?

वेळेच्या वर एक सारणी आहे जी आलेखावर दर्शविलेले विलंब किती समान आहेत हे सांगते, आणि म्हणून स्ट्रोब पल्सचा कालावधी - tw पुरवठा व्होल्टेजवर अवलंबून 230nS किंवा 450nS समान असावा, आम्ही ते थोडेसे घेतले. समास आम्ही फक्त हा विलंब का विचारात घेतला? कारण उर्वरित विलंबांचे मूल्य फारच कमी आहे.

4-बिट बस पाठवण्यासाठी:

  • नियंत्रण नियंत्रक विनामूल्य असल्याची खात्री करा
  • आम्ही काय पाठवू यावर अवलंबून RS 0 (कमांड) किंवा 1 (डेटा) वर सेट करा
  • R/W 0 वर सेट केले
  • स्ट्रोब E वाढवा (1 वर सेट करा)
  • आम्ही बसला सर्वोच्च नोटबुक जारी करतो
  • विलंब 2us
  • लोअर स्ट्रोब ई
  • विलंब 1us
  • स्ट्रोब E वाढवा (1 वर सेट करा)
  • आम्ही बसला लो टेट्राड जारी करतो
  • विलंब 2us
  • लोअर स्ट्रोब ई

4-बिट बसवर वाचण्यासाठी:

  • नियंत्रण नियंत्रक विनामूल्य असल्याची खात्री करा
  • पुल-अप सह इनपुटसाठी डेटा पोर्ट
  • आपण काय वाचू यावर अवलंबून RS 0 (कमांड) किंवा 1 (डेटा) वर सेट करा
  • R/W 1 वर सेट केले
  • स्ट्रोब E वाढवा (1 वर सेट करा)
  • विलंब 2us
  • वरिष्ठ नोटबुक वाचा
  • लोअर स्ट्रोब ई
  • विलंब 1us
  • स्ट्रोब E वाढवा (1 वर सेट करा)
  • विलंब 2us
  • आम्ही खालची नोटबुक वाचतो
  • लोअर स्ट्रोब ई

स्ट्रोब वाढवणे आणि बसमध्ये कमांड/डेटा आउटपुट करणे स्वॅप केले जाऊ शकते. आता डिस्प्ले सुरू करणे कठीण होणार नाही. आरंभीकरण सुलभ करण्यासाठी, आम्ही व्यस्त ध्वज वाचन विलंबाने बदलू आणि आम्ही नंतर ध्वजासह कार्य करण्याचा विचार करू.
हे लक्षात घ्यावे की 4-बिट मोडमध्ये इनिशिएलायझेशन दरम्यान, 4-बिट सूचना वापरल्या जातात आणि इनिशिएलायझेशननंतर, 8-बिट इंस्ट्रक्शन सिस्टम वापरली जाते, म्हणून इनिशिएलायझेशनसाठी आम्ही कमांड पाठवण्यासाठी स्वतंत्र फंक्शन लागू करतो. रद्द करा Write_Init_Command(uint8_t डेटा).
// Atmega16 #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define #RWE21 #define #समाविष्ट करा void Write_Init_Command(uint8_t डेटा) (//पाय ज्याद्वारे आज्ञा/डेटा LCD_DDR आउटपुटवर प्रसारित केला जातो |= DATA_BUS; //आम्ही LCD_PORT &= ~(1 कमांड पाठवू<आनंदाने लुकलुकणारा कर्सर सूचित करतो की आरंभ यशस्वी झाला. IN

असे झाले की मी येथे मौजमजेसाठी स्वतःसाठी काहीतरी विकत घेतले एलसीडीआठ वर्णांच्या दोन ओळी प्रदर्शित करा. तो एका डब्यात पडला होता, पण मला काहीतरी आदळले आणि मी त्याचा वापर करण्याचा निर्णय घेतला, त्याच वेळी त्याच्या कामात गुंतलो. कसे कनेक्ट करावे AVR LCDमी तुम्हाला आता डिस्प्लेबद्दल सांगेन.

सुरुवातीला, मी लगेच आरक्षण करेन ज्याबद्दल आपण बोलत आहोत एलसीडीनियंत्रकावरील निर्देशक HD44780,जे अल्फान्यूमेरिक डिस्प्ले मार्केटमध्ये वास्तविक उद्योग मानक बनले आहे. हे जिथे शक्य असेल तिथे विकले जाते, स्वस्त आहे (8x2 ची किंमत सुमारे 150 रूबल आहे), आणि त्यासाठी एक टन कोड देखील लिहिलेला आहे. नेहमीप्रमाणे, मी चाक पुन्हा शोधण्याचा आणि या प्रकारच्या निर्देशकांसह कार्य करण्यासाठी माझी स्वतःची लायब्ररी तयार करण्याचा निर्णय घेतला. अर्थात, असेंबलरमध्ये, परंतु दुसरे काय? ;)

जोडणी.
एलसीडीबेस वर HD44780शी जोडते AVRमायक्रोकंट्रोलर थेट पोर्टवर. दोन कनेक्शन पद्धती आहेत - 8 बिट आणि 4 बिट. आठ-बिट मोडमध्ये, बाइट अपलोड करणे थोडे सोपे आहे - तुम्हाला बाइट बदलण्याची आवश्यकता नाही, परंतु चार-बिट मोडमध्ये तुम्हाला चार कमी कंट्रोलर पाय घालावे लागतील. 8-बिट मोडमध्ये काम करण्याचे आणखी एक वैशिष्ट्य आहे - हा डिस्प्ले काही कंट्रोलरशी कनेक्ट केला जाऊ शकतो बाह्य रॅम म्हणूनआणि साध्या फॉरवर्डिंग कमांडचा वापर करून डेटा पाठवा. वैयक्तिकरित्या, मी ते पूर्ण पोर्ट मोडमध्ये कनेक्ट केले आहे; माझ्याकडे टर्मिनल्सपैकी एक ठेवण्यासाठी कोठेही नव्हते, म्हणून ते खेदजनक नाही.

  • निष्कर्ष DB7…DB0ही डेटा/पत्ता बस आहे.
  • - स्ट्रोब इनपुट. या लाईनवरील व्होल्टेजला धक्का देऊन, आम्ही डिस्प्लेला कळवतो की त्याला डेटा बसमधून/ला डेटा प्राप्त/पाठवावा लागेल.
  • RW— आमचा डेटा कोणत्या दिशेने जात आहे हे ठरवते. जर 1 असेल तर डिस्प्लेवरून वाचा, जर 0 असेल तर डिस्प्लेवर लिहा.
  • आर.एस.— काय प्रसारित केले जात आहे हे निर्धारित करते, कमांड (RS=0) किंवा डेटा (RS=1). डेटा वर्तमान पत्त्यावर मेमरीमध्ये लिहिला जाईल आणि कमांड कंट्रोलरद्वारे अंमलात येईल.

शक्तीच्या बाजूने, गोष्टी अगदी सोप्या आहेत:

  • GND- वजा, हे सामान्य आहे.
  • Vcc- अधिक वीज पुरवठा, सहसा 5V
  • V0- कॉन्ट्रास्ट इनपुट. येथे आपल्याला शून्य ते पुरवठा व्होल्टेजवर व्होल्टेज लागू करणे आवश्यक आहे, ज्यामुळे प्रतिमा कॉन्ट्रास्ट सेट करा. तुम्ही पोटेंशियोमीटरने चालू केलेले व्हेरिएबल रेझिस्टर स्थापित करू शकता आणि ते तुमच्या हृदयाच्या सामग्रीमध्ये फिरवू शकता. मुख्य गोष्ट म्हणजे जास्तीत जास्त कॉन्ट्रास्ट मूल्य पकडणे, परंतु त्यामुळे परिचितता (चिन्हाच्या सभोवतालच्या चौकोनांचा एक राखाडी प्रभामंडल) दृश्यमान होणार नाही. तुम्ही कॉन्ट्रास्ट खूप कमी सेट केल्यास, वर्ण आळशीपणे आणि विचारपूर्वक स्विच होतील. कॅल्क्युलेटर सारखे ज्याच्या बॅटरी मृत झाल्या आहेत.
  • — हे एलईडी बॅकलाइट एनोडचे इनपुट आहे. थोडक्यात, एक प्लस.
  • TO- त्यानुसार, कॅथोड, ज्याला वजा म्हणून देखील ओळखले जाते. बॅकलाइट अंदाजे 100mA काढतो आणि म्हणून तुम्हाला तेथे 100 Ohm वर्तमान-मर्यादित प्रतिरोधक स्थापित करणे आवश्यक आहे. तसे, अनेक एलसीडी डिस्प्लेमध्ये सोल्डरिंग प्रतिरोधकांसाठी बोर्डवर स्पॉट्स असतात. आपण कॉल केल्यास, आपण हे सुनिश्चित करू शकता की या ओळी एलसीडी पॉवर इनपुट्सकडे नेतात, म्हणून, प्रतिरोधकांमध्ये सोल्डरिंग करून, आपल्याला बॅकलाइट पॉवर करण्याचा त्रास करण्याची गरज नाही, ती कंट्रोलरच्या वीज पुरवठ्याशी जोडली जाईल.
HD44780 LCD कंट्रोलरची तार्किक रचना

कंट्रोलरचे स्वतःचे नियंत्रण युनिट असते, जे आदेश आणि मेमरीवर प्रक्रिया करते. हे तीन प्रकारांमध्ये विभागलेले आहे:

DDRAM- मेमरी प्रदर्शित करा. मध्ये रेकॉर्ड केलेले सर्व काही DDRAMस्क्रीनवर प्रदर्शित होईल. म्हणजेच, उदाहरणार्थ, आम्ही तेथे कोड लिहिला 0x31- स्क्रीनवर एक चिन्ह पॉप अप होईल "1"कारण 0x31हा अंकाचा ASCII कोड आहे 1. पण इथे एक वैशिष्ठ्य आहे - DDRAMस्क्रीनच्या दृश्यमान क्षेत्रापेक्षा मेमरी खूप मोठी आहे. सहसा, DDRAMसमाविष्टीत आहे 80 पेशी- पहिल्या ओळीत 40 आणि दुसऱ्या ओळीत 40, आणि डिस्प्ले दृश्यमान क्षेत्र हायलाइट करून स्लाइडच्या नियमावरील खिडकीप्रमाणे या रेषेत फिरू शकतो. म्हणजेच, उदाहरणार्थ, आपण ते ठेवू शकता DDRAMएकाच वेळी पाच मेनू आयटम, आणि नंतर फक्त एका वेळी एक आयटम दाखवून, डिस्प्ले मागे आणि पुढे हलवा. डिस्प्ले हलविण्यासाठी एक विशेष कमांड आहे. कर्सरची संकल्पना देखील आहे - ही ती जागा आहे जिथे पुढील वर्ण लिहिला जाईल, म्हणजे. ॲड्रेस काउंटरचे वर्तमान मूल्य. कर्सर स्क्रीनवर असणे आवश्यक नाही; ते स्क्रीनच्या मागे स्थित असू शकते किंवा पूर्णपणे अक्षम केले जाऊ शकते.

CGROM- प्रतीक सारणी. जेव्हा आपण सेलवर लिहितो DDRAMबाइट, नंतर टेबलमधून एक वर्ण घेतला जातो आणि स्क्रीनवर काढला जातो. CGROMबदलता येत नाही, त्यामुळे बोर्डवर रशियन अक्षरे असणे महत्त्वाचे आहे. जर, अर्थातच, रशियन-भाषेचा इंटरफेस नियोजित असेल.

CGRAM- प्रतीकांची एक सारणी देखील, परंतु आपण स्वतःची चिन्हे तयार करून ते बदलू शकतो. हे रेषीयरित्या संबोधित केले जाते, म्हणजेच, प्रथम एका वर्णाचे 8 बाइट्स आहेत, एका ओळीने, खालपासून वरपर्यंत - एक बिट स्क्रीनवरील एका बिंदूच्या समान आहे. मग त्याच प्रकारे दुसरे चिन्ह. आमची ओळख 5 बाय 8 गुण असल्याने सर्वात लक्षणीय तीन बिट्स काही फरक पडत नाहीत. एकूण मध्ये CGRAMअनुक्रमे 8 वर्ण असू शकतात CGRAMत्यात आहे 64 मेमरीचे बाइट्स. या प्रोग्राम करण्यायोग्य वर्णांमध्ये 0x00 ते 0x07 पर्यंतचे कोड असतात. म्हणून, फेकणे, उदाहरणार्थ, प्रथम मध्ये 8 बाइट्स CGRAM(कोड 00 सह पहिले वर्ण) काही कचरा, आणि त्यात लिहिणे DDRAMशून्य (मधील पहिल्या वर्णाचा कोड CGRAM) आम्हाला स्क्रीनवर आमची बकवास दिसेल.

मेमरी प्रवेश.
येथे सर्व काही सोपे आहे. आपण कोणती मेमरी निवडण्यासाठी कमांड वापरतो आणि कोणत्या पत्त्यापासून लिहू. आणि मग फक्त बाइट्स पाठवा. जर असे सूचित केले असेल की आम्ही DDRAM वर लिहित आहोत, तर कॅरेक्टर स्क्रीनवर (किंवा लपविलेल्या भागात) दिसतील, जर CGRAM मध्ये असेल, तर बाइट आधीपासूनच कॅरेक्टर जनरेटर मेमरीमध्ये दिसतील. मुख्य गोष्ट क्षेत्रावर परत स्विच करणे विसरू नका DDRAM

कमांड सिस्टम.
कमांड सिस्टीम मू सारखी सोपी आहे. लेग दर्शवेल की डिस्प्ले कंट्रोलरला कमांड पाठवली जात आहे. आर.एस.=0. कमांडमध्येच सर्वात महत्त्वाचा बिट असतो, जो ही कमांड कशासाठी जबाबदार आहे हे ठरवते आणि पॅरामीटर बिट्स, जे HD44780 कंट्रोलरला कसे पुढे जायचे ते सांगतात.

कमांड टेबल:

DB7DB6DB5DB4DB3DB2DB1DB0अर्थ
0 0 0 0 0 0 0 1 स्क्रीन साफ ​​करणे. DDRAM च्या स्थान 0 वर पत्ता काउंटर
0 0 0 0 0 0 1 डीडीआरएएम रिसेट शिफ्टला ॲड्रेसिंग, ॲड्रेस काउंटर 0 वर
0 0 0 0 0 1 I/Dएसस्क्रीन आणि कर्सर शिफ्ट सेट करणे
0 0 0 0 1 डीसीबीडिस्प्ले मोड सेट करत आहे
0 0 0 1 S/Cआर/एलबिट्सवर अवलंबून कर्सर किंवा स्क्रीन शिफ्ट करा
0 0 1 डी.एल.एनएफओळींची संख्या, बस रुंदी आणि वर्ण आकार निवडणे
0 1 ए.जी.ए.जी.ए.जी.ए.जी.ए.जी.ए.जी.पत्ता SGRAM वर स्विच करा आणि SGRAM मध्ये पत्ता सेट करा
1 इ.सइ.सइ.सइ.सइ.सइ.सइ.सपत्ता DDRAM वर स्विच करा आणि पत्ता DDRAM वर सेट करा

आता मी वैयक्तिक बिट्सचा अर्थ काय ते स्पष्ट करेन:
  • I/D- ॲड्रेस काउंटरची वाढ किंवा घट. डीफॉल्ट मूल्य 0 - घट आहे. त्या. प्रत्येक त्यानंतरचा बाइट n-1 सेलवर लिहिला जाईल. तुम्ही 1 लावल्यास, एक वाढ होईल.
  • एस— स्क्रीन शिफ्ट, जर तुम्ही ते 1 वर सेट केले, तर प्रत्येक नवीन कॅरेक्टरसह स्क्रीन विंडो डीडीआरएएमच्या शेवटी पोहोचेपर्यंत शिफ्ट होईल, जेव्हा तुम्ही स्क्रीनवर सर्व 40 वर्णांसाठी मोठी रेषा प्रदर्शित कराल तेव्हा ते सोयीचे असेल, जेणेकरुन ते स्क्रीन बंद होणार नाही.
  • डी- डिस्प्ले चालू करा. जर तुम्ही तिथे 0 लावलात, तर इमेज गायब होईल आणि यावेळी आम्ही व्हिडिओ मेमरीमध्ये सर्व प्रकारच्या अश्लील गोष्टी करू शकतो आणि ते डोळ्यात दुखणार नाहीत. आणि या स्थितीत चित्र दिसण्यासाठी, तुम्हाला 1 लिहावे लागेल.
  • सह- डॅशच्या स्वरूपात कर्सर चालू करा. हे सोपे आहे, येथे 1 लिहा - कर्सर चालू होईल.
  • बी— कर्सरला ब्लिंकिंग ब्लॅक स्क्वेअर सारखे बनवा.
  • S/Cकर्सर किंवा स्क्रीन हलवित आहे. ते 0 असल्यास, कर्सर हलतो. जर 1 असेल तर स्क्रीन. प्रति संघ एकदा
  • आर/एल— कर्सर आणि स्क्रीनच्या शिफ्टची दिशा ठरवते. 0 - डावीकडे, 1 - उजवीकडे.
  • D/L— डेटा बसची रुंदी निर्धारित करणारा थोडा. 1-8 बिट, 0-4 बिट
  • एन- ओळींची संख्या. 0 - एक ओळ, 1 - दोन ओळी.
  • एफ— चिन्ह आकार 0 - 5x8 पिक्सेल. 1 - 5x10 गुण (अत्यंत दुर्मिळ)
  • ए.जी.- मेमरीमधील पत्ता CGRAM
  • इ.स- मेमरीमधील पत्ता DDRAM

त्यांना माझ्याकडून काय हवे आहे हे समजून घेण्याचा प्रयत्न करून मी स्वत: या चिन्हाकडे बराच वेळ पाहत होतो. वरवर पाहता तो झोपेपासून वंचित होता, परंतु खरंच, हे पहिल्या दृष्टीक्षेपात स्पष्ट नाही, म्हणून मी एका उदाहरणासह त्याचा बॅकअप घेईन.

कार्य:

  1. डिस्प्ले चालू करा.
  2. सामग्री साफ करा.
  3. कर्सर एका स्थितीत हलवा.
  4. आणि तिथे "1" लिहा.
उपाय (आदेशांचा क्रम):

पहिली गोष्ट आरंभ करणेडिस्प्ले ज्याशिवाय HD44780 वरील बहुतेक डिस्प्ले काम करण्यास नकार देतील. काही प्रकारांची डीफॉल्ट स्थिती असते (8-बिट बस, कर्सर 0 वर) आणि त्यांना फक्त डिस्प्ले चालू करण्याची आवश्यकता असते. परंतु तरीही ते करणे अधिक चांगले आहे, विकसकाने काय केले हे आपल्याला कधीच माहित नाही. कोणतेही अतिरिक्त होणार नाही.

  1. 001 11000 बस 8 बिट, 2 ओळी
  2. 00000001 स्क्रीन साफ ​​करणे
  3. 000001 10 पत्ता वाढ. स्क्रीन हलत नाही
  1. 00001 100 डिस्प्ले चालू (D=1)
  2. 00000001 डिस्प्ले साफ केला. पॉइंटर DDRAM वर आहे
  3. 0001 0100 कर्सर (S/C=0) उजवीकडे हलवला (R/L=1)
  4. 00110001 - आम्ही डेटा (RS पिन = 1) कोड "1" 0x31 आधीच रेकॉर्ड केला आहे

टीम आयडेंटिफायर ठळक मध्ये हायलाइट केला आहे, परंतु बाकीचे तुम्हाला टेबलमध्ये दिसेल.

कार्य: आपले स्वतःचे चिन्ह तयार करा. कोड 01 सह आणि स्क्रीनवर प्रदर्शित करा.
आमचा विश्वास आहे की आमचा डिस्प्ले आधीच सुरू झाला आहे आणि डेटा प्राप्त करण्यासाठी तयार आहे.

उपाय:

  1. 01 001000 मध्ये निवडा CGRAMपत्ता 0x08 ही फक्त दुसऱ्या अक्षराची सुरुवात आहे (मी तुम्हाला आठवण करून देतो की एका वर्णाला 8 बाइट्स लागतात)
  2. 00000001 हा 8 बाइट डेटा आहे. ( RS = 1)
  3. 0000001 0 विजेचे चिन्ह काढा, किंवा
  4. 000001 00 एसएस झिग रुण, तुमच्या इच्छेनुसार
  5. 00001 मला 000 चांगले आवडतात.
  6. 00011111 सर्वात लक्षणीय तीन बिट्सचा कोणताही प्रभाव नाही
  7. 0000001 0 तुम्ही तिथे काहीही लिहू शकता
  8. 000001 00 चा निकालावर परिणाम होणार नाही.
  9. 00001 000 डेटाचा शेवटचा बाइट
  10. 1 0000000 आणि ही एक कमांड आहे - पत्ता बदलणे DDRAMआणि पत्त्यासाठी एक सूचक 0000000 — पहिल्या ओळीतील पहिले वर्ण.
  11. 00000001 आणि पुन्हा डेटा ( RS = 1), कोड 01 - इथेच आपण जिपर ठेवतो.
अरेरे आणि तो स्क्रीनवर आहे!

म्हणून, आम्ही तर्कशास्त्र सोडवले आहे, संप्रेषण प्रोटोकॉलच्या भौतिकशास्त्रात जाण्याची वेळ आली आहे. जेव्हा मी माझी लायब्ररी साफ करतो आणि ती पूर्णतेसाठी अनुकूल करतो तेव्हा मी कोड थोड्या वेळाने प्रदान करेन. आत्तासाठी, मी तुम्हाला अल्गोरिदम देईन आणि ते कोणत्याही प्रोग्रामिंग भाषेत लागू केले जाऊ शकते. किमान असेंबलरमध्ये, किमान स्याहमध्ये आणि अगदी वासिकमध्ये :)

LCD कंट्रोलर HD44780 वर वाचन/लेखनासाठी अल्गोरिदम
दिशा, तसेच आदेश/डेटा, पायांद्वारे निर्धारित केला जातो आणि वाचन आणि लेखन स्ट्रोब (पिन ई) च्या संक्रमणाद्वारे 1 ते 0 पर्यंत चालते.

पोर्ट सुरू करत आहे

  1. RS, RW, E - मोडमधून बाहेर पडण्यासाठी.
  2. इनपुट मोडमध्ये DB7..DB0. तथापि, तुम्हाला त्यांना स्पर्श करण्याची गरज नाही; आम्ही त्यांना नंतर पुन्हा परिभाषित करू.

तत्परतेची प्रतीक्षा, व्यस्त ध्वज वाचत आहे.
  1. RS=0 (कमांड)
  2. RW=1 (वाचा)
  3. E=1 (तयार व्हा!!!)
  4. विराम द्या (8 MHz वर 14 प्रोसेसर सायकल पुरेसे होते)
  5. E=0 (Pli!)
  6. बंदरातून वाचन. जर बिट 7 (व्यस्त ध्वज) सेट केले असेल, तर ते रीसेट होईपर्यंत आम्ही सर्वकाही पुन्हा करतो.

आज्ञा लिहा
  1. तयारीची वाट पाहत आहे
  2. RS=0 (कमांड)
  3. RW=0 (लिहा)
  4. E=1 (तयार व्हा!!!)
  5. आउटपुट पोर्ट
  6. पोर्टवर कमांड कोड आउटपुट करा
  7. विराम द्या
  8. E=0 (Pli!)
  9. प्रवेशासाठी शोल्डर गन पोर्ट, फक्त बाबतीत.

डेटा रेकॉर्डिंग
  1. तयारीची वाट पाहत आहे
  2. RS=1 (डेटा)
  3. RW=0 (लिहा)
  4. E=1 (तयार व्हा!!!)
  5. आउटपुट पोर्ट
  6. पोर्टवर कमांड कोड आउटपुट करा
  7. विराम द्या
  8. E=0 (Pli!)
  9. प्रवेशासाठी बंदर, फक्त बाबतीत.

आदेश वाचा
  1. तयारीची वाट पाहत आहे
  2. पुल-अपसह इनपुट करण्यासाठी डेटा पोर्ट (DDR=0, PORT=1)
  3. RS=0 (कमांड)
  4. RW=1 (वाचा)
  5. विराम द्या
  6. पोर्टवरून डेटा वाचत आहे
  7. E=0 (वर!)

डेटा वाचा
  1. तयारीची वाट पाहत आहे
  2. पुल-अपसह इनपुट करण्यासाठी डेटा पोर्ट (DDR=0, PORT=1)
  3. RS=1 (डेटा)
  4. RW=1 (वाचा)
  5. E = 1 (तयार व्हा! या क्षणी, LCD वरून बसला डेटा पाठवला जात आहे)
  6. विराम द्या
  7. पोर्टवरून डेटा वाचत आहे
  8. E=0 (वर!)

चार-बिट बससह, सर्वकाही अगदी सारखेच असते, फक्त तेथे प्रत्येक वाचन/लेखन ऑपरेशन दोन स्ट्रोब पुलांमध्ये केले जाते.

प्रवेश:

  1. विराम द्या
  2. वरिष्ठांची वही बंदरात पाठवली
  3. विराम द्या
  4. विराम द्या
  5. कनिष्ठ टेट्राड बंदरात आणण्यात आले

वाचन
  1. विराम द्या
  2. बंदरातून वरिष्ठ नोटबुक वाचत आहे
  3. विराम द्या
  4. विराम द्या
  5. बंदरातून कमी टेट्राड वाचत आहे

कोडची वाट पहा :) लवकरच येत आहे :)
UPD: