İki i2c modülünün arduino'ya bağlantı şeması. LCM1602 LCD ekranın I2C ile Arduino'ya bağlanması. Kendi sembollerinizi yaratın

Bu yazımda size I2C arayüz modülünü kullanarak bir LCD ekranı (2x16 / 20x4) kontrol etmek için nasıl kullanacağınızı anlatacağım. Arduino'yu kullanma. Bu modül, kullanılan denetleyici pinlerinin sayısını azaltmanıza olanak tanır; 8 veya 4 bitlik bağlantı yerine yalnızca 2 pin gereklidir (SDA ve SCL).

Teknik özellikler

Ekran desteği: LCD 16×02 / 20×04
İsteğe bağlı: kontrast ayarı
Besleme gerilimi. 5V
Arayüz: I2C
Boyutlar: 54mm x 19mm x 15mm

I2C arayüz modülü hakkında genel bilgi

Arduino denetleyicilerindeki pin sayısı sınırlı olduğundan ve sıklıkla kullanıldığından çeşitli sensörler ve modülleri bitti, onları kaydetmeye ihtiyaç var, bu durumlar için bu modül geliştirildi, onun yardımıyla iki kontak (SDA ve SCL) üzerinden iletim uygulayabilirsiniz.

Şimdi modülün kendisi hakkında biraz bilgi verelim; PCF8574T yongası üzerine kuruludur. SDA ve SCL hatlarını yukarı çekmek için R8 (4,7 kOhm) ve R9 (4,7 kOhm) dirençleri gereklidir. İdeal olarak, iki veya daha fazla cihazı I2C veri yolu üzerinden bağlarken, yalnızca bir cihazda çekme kullanmanız gerekir. Nedenini daha sonra yazacağım. Kartta üç atlama teli vardır (şema, A0, A1, A2 hatlarının R4, R5, R6 dirençleri aracılığıyla güç kaynağına bağlandığını gösterir), cihazın adresini değiştirmek için gereklidir, toplamda 8 seçenek vardır . Adreslemeyi değiştirmek bize PCF8574T çipi ile IC2 veri yolu üzerinden sekiz adede kadar cihazı bağlama yeteneği verir; adres seçenekleri şekilde gösterilmektedir (varsayılan cihaz adresi 0x27'dir). Modül ayrıca LCD ekranın kontrastını değiştirebilmenize yardımcı olan R11 potansiyometresi ile donatılmıştır.

Bağlantı için modülde üç grup kontak vardır:

İlk grup:
SCL: Seri Saat
SDA: veri hattı (Seri Veri)
VCC: "+" güç
GND: "-" güç kaynağı

İkinci grup:
VSS: "-" güç
VDD: “+” güç
VO: Kontrast kontrol pimi
RS: Kayıt Seç
RW: Okuma/Yazma (Toprağa bağlandığında yazma modu)
E: Etkinleştir (düşme flaşı)
DB0-DB3: Arayüz düşük bitleri
DB4-DB7: Arayüz yüksek bitleri
A: "+" arka ışık güç kaynağı
K: "-" arka ışık güç kaynağı

Üçüncü grup: (atlama teli varsayılan olarak ayarlanmıştır)
VCC:
LCD'den bir:

Arduino'ya bağlanma

Gerekli parçalar:
Arduino UNO R3 x 1 adet.
LCD ekran 1602A (2×16, 5V, Mavi) x 1 adet.
LCD x 1 adet için arayüz modülü I2C, IIC, TWI.
DuPont teli, 2,54 mm, 20 cm, K-E (Dişi - Erkek) x 1 adet.
USB kablosu 2,0 A-B x 1 adet.

Bağlantı:
Öncelikle I2C modülünü lehimleyin LCD ekran, ardından ekranı Arduino UNO'ya bağlamanız gerekir. Bunu yapmak için DuPont kablolamasını kullanacağız; aşağıdaki tabloya göre bağlanıyoruz.

Açıklık sağlamak için başka bir şema vereceğim.

Bu deney için “LiquidCrystal_I2C” kütüphanesini indirip kurmanız gerekiyor. Daha sonra bu örnek kodu Arduino IDE program penceresine kopyalayıp yapıştırın ve denetleyiciye yükleyin.

/* Arduino IDE 1.6.11'de test edildi Test tarihi 15.09.2016 */ #katmak #katmak LiquidCrystal_I2C lcd(0x27,16,2); // Ekranın adresini ve boyutunu ayarlayın void setup() ( lcd.init(); // LCD lcd.backlight()'ı başlatın; // Arka ışığı açın lcd.setCursor(0,0); // LCD'yi ayarlayın imleci 1 satırın başına getirin lcd .print("Merhaba dünya"); // Metni yazdırın lcd.setCursor(0,1); // İmleci 2. satırın başına getirin lcd.print("www. robotchip.ru"); // Metni yazdır ) void loop() ( )

Programı indir

Her şeyi doğru yaptıysanız ancak ekranda sembol yoksa potansiyometreyle kontrastı artırmayı deneyin.


Bağlantılar
LiquidCrystal_I2C kitaplığını indirin
PCF8574T yongasına ilişkin belgeler
LCD1602A için belgeler

Aliexpress'ten satın al

buradan aldım iyi mağazaÇip Direnci, faydalı cihazlarda çalışmak ve kullanmak için başka bir cihazdır. Bu cihazın, HD44780 denetleyici tarafından kontrol edilen bir LCD ekranı 4 bit modunda kontrol etmek üzere tasarlandığı ortaya çıktı. Bu amaçla, I2C veriyolunun paralel 8 bitlik bir bağlantı noktasına dönüştürücüsü olan kart üzerine bir mikro devre monte edilmiştir.

Kart, LCD ekrana hemen bağlanabilecek şekilde yönlendirilmiştir. Giriş, güç ve I2C hatlarını sağlar. Kart, SCL ve SDA hatlarında çekme dirençleri, kontrastı ayarlamak için bir potansiyometre ve ekranın kendisi için güç kaynağı ile hemen donatılmıştır.

Sağdaki atlama kablosu arka ışığı açar/kapatır. Daha sonra bir test cihazıyla donatılarak aşağıdaki tablo derlendi. Modül incelendikten sonra şunu ortaya çıktı: P3 arka ışığı kontrol eder. Jumper takılıysa, 1 arka ışığı açar ve 0 onu kapatır. Jumper çıkarıldığında arka ışık her zaman kapalıdır. Daha sonra, axlib kitaplığının I2C veri yolu (yazılım uygulaması) ile çalışma işlevleri ve PCF8574 yongasını kontrol etme işlevleriyle desteklenmesine karar verildi. Kısaca modülün çalışma şekli. Bir baytın paralel çıktısını almak için, mikro devrenin adresini I2C veriyoluna göndermeniz gerekir (varsayılan olarak 0x4E'dir. Ayrıca, karttaki atlama tellerini lehimleyerek ve en az üç önemli olanın değerini değiştirerek adresi değiştirebilirsiniz.) adresin bitleri), ardından ACK'yi aldıktan sonra bir veri baytı gönderilir. Çip bir ACK ile yanıt verdikten sonra bayt çipin paralel portunda görünür. LCD ekranı kontrol etmek için axlib kitaplığından işlevler aldım ve bunları I2C veri yolu ile çalışacak şekilde biraz değiştirdim. #katmak #katmak #katmak #katmak #define 0x4E EKLE // Çip adresi /* LCD Chip RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 P3 bağlantı ayağında arka aydınlatma bulunmaktadır. 1 açık, 0 kapalı */ // Çıkış verileri com |= 0x04; // Birim başına E pcf8574_byte_out(com, EKLE); // Çıkış verileri com &= 0xFB; // E'den sıfıra pcf8574_byte_out(com, EKLE); // Çıkış verileri) void init(void) ( _delay_ms(30); com(0x30); _delay_us(40); com(0x30); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x30); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x20); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x20); // Parametrelerin ayarlanması com(0x80); // Parametrelerin ayarlanması com(0x00); //Ekranı kapat com(0x80); //Ekranı kapat com(0x00); // Göstergeyi temizle com(0x10); // Göstergeyi temizle com(0x00); com(0x60); // Veri giriş modunu ayarlayın com(0x00); com(0xC0); // Seçilen imleçle ekranı aç) void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Data_h |= 0x04'ün en anlamlı 4 bitini aktarın; pcf8574_byte_out(data_h, ADD); // En anlamlı 4 biti aktar // En anlamlı 4 biti aktar // Düşük 4 biti aktar // Düşük 4 biti aktar // Düşük 4 biti aktar) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" ); while(1) ( ) ) Burada tam olarak neler oluyor? Öncelikle I2C ve PCF8574 için kütüphaneleri birbirine bağlıyoruz. I2C hakkında zaten yazdım, o yüzden bu konuyu tekrar tekrar anlatacağım ama size PCF8574.h'de neler olduğunu anlatacağım. Kütüphane yalnızca üç işlevi içerir.
BYTE pcf8574_test(BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); return ask; )İlk fonksiyon veriyolunda bir cihazın olup olmadığını kontrol etmek için yazılmıştır. Prensip olarak veri yolu üzerinde bulunan herhangi bir cihazı aramak için kullanılabilir. Fonksiyon istenilen cihazın adresini alır ve cevap verirse sıfır değerini döndürür. Böyle bir adrese sahip bir cihaz veri yolunda değilse bir tane döndürecektir.
BYTE pcf8574_byte_out(BYTE verileri, BYTE ekle) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(veri); i2c_stop(); return ask; ) Bu işlev zaten tamamen bu çip için uyarlanmıştır. Argüman olarak veri yoluna aktarılacak bayt ve çipin adresi verilir. İşlev önce çipi adrese göre sorgulayacak ve ardından baytı gönderecektir. Çip bir bayt aldıysa ve ACK ile yanıt verdiyse, işlev çiple çalışmayı bitirecek ve başarılı bir bayt gönderimi olarak sıfır döndürecektir. Ve şu anda mikro devre bu baytı paralel portuna gönderecektir. Aksi halde NACK alırız ve bir tane geri göndeririz, iletim başarısız olur.
BYTE pcf8574_str_out(BYTE *data, BYTE sütunu, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Bu işlev deneme amaçlı oluşturulmuştur. Bir baytlık veri dizisine, bu baytların sayısına ve çipin adresine yönelik bir işaretçiyi kabul eder. Aslında, tüm verileri oturum başına bir bayt yerine tek bir oturumda aktarma girişimi. İşlev çalışıyor ancak LCD ekran için uygun değil. Şimdi ana programa dönelim. Kütüphaneleri bağladıktan sonra mikro devrenin adresini yazıyoruz. Daha sonra lcd.h'ye benzer üç fonksiyon oluşturuyoruz. Tek fark veri aktarım prensibindedir.
void com(BYTE com) ( com |= 0x08; // Arka ışığın açık olması için P3'ten bire pcf8574_byte_out(com, EKLE); // Çıkış verileri com |= 0x04; // Birim başına E pcf8574_byte_out(com, EKLE); // Çıkış verileri com &= 0xFB; // E'den sıfıra pcf8574_byte_out(com, EKLE); // Çıkış verileri } Bu işlev yalnızca ekrana komutlar gönderir. 0x08'den gelen komutun mantıksal eklenmesiyle ilk satırın ortaya çıktığı yer burasıdır. Baytı doğrudan LCD ekranın bağlantı noktasına değil, tekrarlayıcımız aracılığıyla ilettiğimiz için bu hataya ihtiyaç duyulmaktadır. Yani, bir bayt sağladıysak ve yalnızca bir bit çıktısı almamız gerekiyorsa, lütfen gerekli biti önceki bayta atayın ve onu tekrar bağlantı noktasına gönderin. Bu çok büyük bir güçlük. Birinin sürekli olarak üçüncü hanede kalması için 0x08 ile ekleme yapılması gerekir. Arka ışığı hatırladın mı? Arka ışığı açan bu eklentidir. Daha sonra veri yoluna bir bayt aktarma fonksiyonunu çağırıyoruz. Yukarıda hakkında yazıyor. Daha sonra baytı veri yolu aracılığıyla çipe aktarıyoruz. Daha sonra, E'yi bire ayarlamalısınız; bu, baytın 0x04 ile mantıksal olarak eklenmesinin gerçekte yaptığı şeydir. E.'yi sıfırladıktan sonra, herhangi bir komutu yalnızca komutun kendisini argüman olarak ileterek ekrana gönderebilirsiniz. void init(void) ( _delay_ms(30); // Güç açıldıktan sonra duraklat com(0x30); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x30); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x30); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x20); // 4 bit moduna geç _delay_us(40); // Komutun yürütülmesi için gecikme com(0x20); // Parametrelerin ayarlanması com(0x80); // Parametrelerin ayarlanması com(0x00); //Ekranı kapat com(0x80); //Ekranı kapat com(0x00); // Göstergeyi temizle com(0x10); // Göstergeyi temizle com(0x00); // Veri giriş modunu ayarlayın com(0x60); // Veri giriş modunu ayarlayın com(0x00); // Seçilen imleçle ekranı aç com(0xC0); // Seçilen imleçle ekranı aç } Bu işlev yalnızca ekranı başlatır. Komutların sırası LCD ekrandaki veri sayfasından alınır. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // data_h |= 0x04'ün en anlamlı 4 bitini aktarın; pcf8574_byte_out(data_h, ADD); // En anlamlı 4 biti aktar data_h &= 0xF9; pcf8574_byte_out(veri_h, EKLE); // En anlamlı 4 biti aktar pcf8574_byte_out(veri_l, EKLE); // Düşük 4 biti aktar veri_l |= 0x04; pcf8574_byte_out(veri_l, EKLE); // Düşük 4 biti aktar veri_l &= 0xF9; pcf8574_byte_out(veri_l, EKLE); // Düşük 4 biti aktar } Bu fonksiyon verileri LCD ekrana iletir. Baytın önce en önemli yarım baytla ve ardından düşük baytla iletilmesi dışında komutlarla aynı şekilde yürütülür. Ve geri kalanı aynı. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) Bu işlev yalnızca bir dizenin ekrana aktarılması içindir. Aslında konumuzla alakası yok.

AtmelStudio 6.2 Projesi

Yetkili 01.08.15 17:11

Virgül eksik. Aynen öyle: "MERHABA DÜNYA!" Ve bu cihaz yalnızca HD44780 için tasarlanmamıştır. Ana tarafa çekme dirençleri monte edilmiştir. Spesifikasyona göre veriler LCD denetleyiciye E düşme yönünde yazılır. Dolayısıyla ilk fonksiyon basitleştirilmiştir: void com(BYTE com) ( com |= 0x08; // backlight pcf8574_byte_out(com | 0x04, ADD); / / Veri çıkışı pcf8574_byte_out(com , ADD); // E'den sıfıra) Ve geri kalanı da önemli ölçüde daha az olabilir. Örneğin, void char_out(BYTE data) yalnızca iki çağrı alacaktır ve hatta ek değişkenler olmadan daha da fazlasını alacaktır. LCD başlatma, zamanlama spesifikasyonlarına aykırı olarak gerçekleştirildi.

Alexey 02.08.15 19:11

Eksik virgül nedeniyle ekran etkilenmeyecektir. Bu cihaz, bu veya benzer bir denetleyiciye sahip ekranlar için özel olarak tasarlanmıştır. Ancak bu mikro devre gerçekten basit bir port genişleticidir. E konusunda katılıyorum. Ek değişkenlere ihtiyaç vardır. Bir fonksiyona argüman iletirseniz ve belirli eylemleri mantıkla gerçekleştirirseniz aksaklıklar meydana gelebilir. Bununla zaten karşılaştım. Başlatma, zamanlamalar ihlal edilmeden gerçekleştirilir. Belgeler, komutlar arasında 40 µs'lik bir duraklama olduğunu söylüyor. Aktarımın yazılımsal ve yavaş olan i2c bus üzerinden gerçekleşmesi nedeniyle dönemler ilgiyle tamamlanıyor. Hala çok tembel değilseniz, versiyonunuzu yazın ve bana gönderin. Yayınlayacağım. Sonuçta bu site amatör bir izleyici kitlesine yöneliktir ve isteyen herkes MK'nin hayatı hakkında görüş ve vizyonunu ifade edebilir.

Alexey 06.08.15 09:14

Saygın "Okuryazar" tarafından belirtildiği gibi ekranı başlatırken zamanlamalar eklendi

Dimitri 06/14/16 21:57

Merhaba Alexey PCF8574 ile çalışmak için kod oluşturucuya bir kütüphane ekleyebilirsiniz.

Alexey 06/14/16 22:32

Düşüneceğim.))

ruslan 21.12.16 19:54
Alexey 21.12.16 21:53

Ah evet. Özellikle ASMA'daki kod. Arduino uzmanları bunu sonuna kadar takdir edeceklerdir)))

Py.sy.
ASM’ye bakmasanız bile oradaki program bir PIC kontrolcüsü için yazılmış. Bu AVR uzmanları için "çok" faydalı bir bilgi mi? özellikle yeni başlayanlar için))) PIC'e karşı hiçbir şeyim yok, ancak PIC ve AVR'nin ASM'si bile farklı. LCD ekranın çalışmasının detaylarına gelince, bir göz atabilirsiniz))) Doğru, ben de CVAVR altında yazdım ama tüm komutlar sökülüp raflara dizildi. Ancak her durumda, nerede daha net yazıldığına kendiniz karar verin))) Yazar yazar, okuyucu seçer.

GeK 01/04/17 12:52

"Çipin I2C adresi (varsayılan olarak 0x4E'dir)"

Adresin en önemli 4 biti sabittir,
PCF8574'ün öneki 0100'dür ve PCF8574A'nın öneki 0111'dir.
Alttaki 3 bit, çipin A2-A0 girişlerinin durumuna bağlıdır. Varsayılan olarak, 3 atlama kablosunun tümü sırasıyla açıktır, çip adresi 0111111 değerini alır.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 1 0x20 0x38
// 1 1 0 0x21 0x39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Alexey 01/04/17 14:27

Bir şeyi karıştırdın.
Mikro devrenin belgelerinden alıntı

0b01001110, 0x4E'dir
Yani burada her şey doğru. Adresi değiştirmeniz gerekiyorsa, bunu Tanımla'da değiştirmeniz yeterlidir.

Yuri 12/14/17 21:26

İyi günler! Ayrıca PCF8574 adaptörüyle çalışmak için lcdgotoxy ve lcdclear işlev kodunu da kullanabilirsiniz.

İskender 05.20.18 18:14

İyi günler! Rusça metnin çıktısını nasıl alırsınız?

Alexey 05.20.18 23:04

Bu MELT'in yerli bir sergisi. Kiril alfabesi hafızasına kazınmış durumda.

İskender 21.05.18 04:55

İyi günler! AtmelStudio 6.2 "ЁPҐBET MҐP!" Projesinde sizin yaptığınız gibi yazıyorum. normal olarak çıkıyor
ve "MERHABA DÜNYA!" yazarsanız her türlü saçmalığı ortaya çıkarıyor. iki taneye sahibim
Görüntüleme seçeneklerinden biri Kiril alfabesine sahiptir. ikincisi Çinli.

Alexey 21.05.18 09:22

İlk önce bir test programı yazardım. Tüm hafızayı yineler ve sembolleri ve adreslerini görüntüler. Ve sonra sorunun ne olduğunu anlayın. Büyük olasılıkla karakter tablosu ascii tablosuyla eşleşmiyor.

Andrey 09/03/18 08:32

Tünaydın!

Proteus için bir devre şeması sağlayabilir misiniz?

Andrey 09/03/18 10:22

Yoksa Proteuse'da kimse kontrol etmedi mi?

Andrey 09/03/18 10:56

main_init'i çözdüm

Pavlus 30.05.19 23:35

İlginç bir şekilde, ekran adresi 0x4E'dir ve aynı ekran Arduino'ya bağlıysa adres 0x27'dir.

Pavlus 31.05.19 11:04

Çalışmanız için çok teşekkür ederiz! İnternetin tamamını taradım ve sizinki dışında verilen örneklerin hiçbiri işe yaramadı. Tek sorun, proje arşivinde ekran başlatma işlevinde _delay_ gecikmelerinin belirtilmemiş olması ve buna göre çalışmıyor

Alexey 06/01/19 09:52

Bu daha çok bir gösteri projesi. İyi bir nedenden dolayı axlib kütüphanesinin yeniden yazılması gerekiyor, ancak STM32 ve STM8'in hızla hareket ettiği gerçeği göz önüne alındığında, AVR'nin hiçbir anlamı yok.

Pavel 06/05/19 12:57

STM'nin DIP paketleri yoktur; baskılı devre kartlarının yapımı daha zordur. Projelerim için AVR'nin yetenekleri oldukça fazla, bir Atmega 8'e pek çok şey sığdırabilirsiniz

Alexey 06/05/19 15:20

Evet, ama Atmega8 ve stm8s003'ün maliyeti ne kadar)))

Dimitri 06/07/19 00:41

Merhaba Alexey.
Lütfen bana pcf8574'ten port durumunu nasıl okuyacağımı söyle?
i2c veriyolunda harici bir ünite, 8 GPIO yapmak istiyorum - işte bu kadar.

Dimitri 06/07/19 17:56

Kendim cevaplayacağım
İşlev bir bayt döndürür - mikro devre bağlantı noktalarının durumu
uint8_t pcf8574_byte_rcv(uint8_t addr)
{
uint8_t ask = ACK;
adres |= 0b01; //OKUMAK
uint8_t veri=0;
i2c_start();
sor = i2c_send_byte(addr);
if(!ask) veri = i2c_read_byte(NACK);
i2c_stop();

Verileri döndür;
}

Pavel 06/07/19 20:37

Genel olarak bir rölenin fiyatı için maliyeti ne kadardır, 150 ruble) ve STM için panoları nasıl bağlarsınız? LUT güvenilmez, CNC router ne alacağından emin değil (denemedim)

Belki de piyasadaki en popüler ekranlardan biri. Popüler HD44780U denetleyici üzerine kurulmuştur. Modelin adından ekranın 16 karakterlik iki satırdan oluştuğu anlaşılmaktadır. Bu özel modelde Rusça dili desteği yoktur.

Sh2s veri yolu, aynı anda iki kablo aracılığıyla 127'ye kadar cihazı bağlamanıza olanak tanır. Bu I2C, PCF8574T yongasında uygulanır.

Bağlantı şeması:

Mavi olan şey ekran kontrastını ayarlamanıza olanak tanıyan değişken bir dirençtir.

Soldaki atlama teli ekranın arka aydınlatmasından sorumludur.

Arduino'ya 4 kontaktan oluşan bir blok şu şekilde bağlanır:

GND - GND
VCC-5V
SDA - A4 (Arduino MEGA ise, o zaman D20'ye)
SCL - A5 (Arduino MEGA ise D21'e)

Kütüphane

Eskiz

Ekranın farklı bir IIC adresi olabilir, 0x27 yerine 0x3F olabilir. Adresi doğru bir şekilde belirlemek için bir i2c cihaz tarayıcısını kullanabilirsiniz.

#katmak #katmak //LCD ekranın adresini 0x27, 16 karakter, 2 satır olarak ayarladık LiquidCrystal_I2C lcd(0x27, 16, 2); geçersiz kurulum() ( lcd.init(); // Ekranı başlat //arka ışığı aç lcd.backlight(); //Metnin görüntülenmeye başlayacağı konumu ayarlayın. lcd.setCursor(2, 0); //çıkış satırı 1 lcd.print("Merhaba Dünya!"); //ikinci satırı da aynı şekilde yazdırıyoruz lcd.setCursor(1, 1); lcd.print("www.site"); ) geçersiz döngü () ( )

Belki de piyasadaki en popüler ekranlardan biri. Popüler HD44780U denetleyici üzerine kurulmuştur. Modelin adından ekranın 16 karakterlik iki satırdan oluştuğu anlaşılmaktadır. Bu özel modelde Rusça dili desteği yoktur.

Sh2s veri yolu, aynı anda iki kablo aracılığıyla 127'ye kadar cihazı bağlamanıza olanak tanır. Bu I2C, PCF8574T yongasında uygulanır.

Bağlantı şeması:

Mavi olan şey ekran kontrastını ayarlamanıza olanak tanıyan değişken bir dirençtir.

Soldaki atlama teli ekranın arka aydınlatmasından sorumludur.

Arduino'ya 4 kontaktan oluşan bir blok şu şekilde bağlanır:

GND - GND
VCC-5V
SDA - A4 (Arduino MEGA ise, o zaman D20'ye)
SCL - A5 (Arduino MEGA ise D21'e)

Kütüphane

Eskiz

Ekranın farklı bir IIC adresi olabilir, 0x27 yerine 0x3F olabilir. Adresi doğru bir şekilde belirlemek için bir i2c cihaz tarayıcısını kullanabilirsiniz.

#katmak #katmak //LCD ekranın adresini 0x27, 16 karakter, 2 satır olarak ayarladık LiquidCrystal_I2C lcd(0x27, 16, 2); geçersiz kurulum() ( lcd.init(); // Ekranı başlat //arka ışığı aç lcd.backlight(); //Metnin görüntülenmeye başlayacağı konumu ayarlayın. lcd.setCursor(2, 0); //çıkış satırı 1 lcd.print("Merhaba Dünya!"); //ikinci satırı da aynı şekilde yazdırıyoruz lcd.setCursor(1, 1); lcd.print("www.site"); ) geçersiz döngü () ( )

  • FC-113 modülü, I2C seri veri yolu için bir giriş-çıkış “genişletici” olan 8 bitlik bir kaydırma yazmacı olan PCF8574T yongasını temel alır. Şekilde mikro devre DD1 olarak adlandırılmıştır.
  • R1, LCD ekranın kontrastını ayarlamak için kullanılan bir trim direncidir.
  • J1 Jumper'ı ekranın arka ışığını açmak için kullanılır.
  • 1…16 numaralı pinler, modülü LCD ekran pinlerine bağlamak için kullanılır.
  • Cihazın I2C adresini değiştirmek için A1...A3 kontak pedleri gereklidir. Uygun jumper'ları lehimleyerek cihazın adresini değiştirebilirsiniz. Tablo, adreslerin ve atlama tellerinin yazışmalarını göstermektedir: “0” açık devreye, “1” ise kurulu bir atlama teline karşılık gelir. Varsayılan olarak 3 atlama kablosunun tümü açıktır ve aygıt adresi 0x27.

2 LCD ekranın Arduino'ya bağlantı şeması I2C protokolü aracılığıyla

Modül Arduino'ya I2C veri yolu için standart bir şekilde bağlanır: modülün SDA pini analog port A4'e, SCL pini Arduino'nun analog port A5'e bağlanır. Modül Arduino'dan +5 V ile beslenmektedir. Modülün kendisi 1…16 pinleri ile LCD ekrandaki karşılık gelen 1…16 pinlerine bağlanır.


3 İş için kütüphane I2C protokolü aracılığıyla

Artık I2C arayüzü üzerinden LCD ile çalışacak bir kütüphaneye ihtiyacımız var. Örneğin bunu kullanabilirsiniz ("Örnek kodu ve kitaplığı indir" satırındaki bağlantı).

İndirilen arşiv LiquidCrystal_I2Cv1-1.rar bir klasöre sıkıştırın \kütüphaneler\ Arduino IDE dizininde bulunur.

Kitaplık, LCD ekranlar için bir dizi standart işlevi destekler:

İşlevAmaç
Likit kristal() LiquidCrystal tipi bir değişken oluşturur ve ekran bağlantı parametrelerini (pin numaraları) kabul eder;
başlamak() LCD ekranın başlatılması, parametrelerin ayarlanması (satır sayısı ve karakter);
temizlemek() ekranı temizlemek ve imleci başlangıç ​​pozisyonuna döndürmek;
Ev() imleci başlangıç ​​pozisyonuna döndürün;
setCursor() imleci belirli bir konuma ayarlamak;
yazmak() sembolü LCD ekranda görüntüler;
Yazdır() metni LCD ekranda görüntüler;
imleç() imleci gösterir, yani. bir sonraki karakterin yerinin altını çizmek;
İmleç yok() imleci gizler;
göz kırpmak() imleç yanıp sönüyor;
göz kırpma yok() Yanıp sönmeyi iptal edin;
görüntü yok() görüntülenen tüm bilgileri kaydederken ekranı kapatmak;
görüntülemek() görüntülenen tüm bilgileri kaydederken ekranı açmak;
kaydırmaDisplayLeft() ekran içeriğini 1 konum sola kaydırın;
kaydırmaDisplayRight() ekran içeriğini 1 konum sağa kaydırın;
Otomatik kaydırma() otomatik kaydırmayı etkinleştir;
Otomatik kaydırma yok() otomatik kaydırmayı devre dışı bırak;
soldan sağa() metnin yönünü soldan sağa ayarlar;
sağdan sola() metin yönü sağdan sola;
createChar() LCD ekran için özel bir karakter oluşturur.

4 Metin çıktısı için taslak I2C veri yolu aracılığıyla LCD ekrana

Örneği açalım: Dosya Örnekleri LiquidCrystal_I2C CustomChars ve bunu biraz değiştireceğiz. Sonunda yanıp sönen bir sembolün olacağı bir mesaj görüntüleyeceğiz. Koda yapılan yorumlar, taslağın tüm nüansları hakkında yorum yapar.

#katmak // Wire kütüphanesini dahil et #include // LCD kütüphanesini bağlayın #define printByte(args) write(args); // uint8_t kalp = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // “kalp” sembolünün bit maskesi LiquidCrystal_I2C lcd(0x27, 16, 2); // 16x2 LCD ekran için 0x27 adresini ayarlayın geçersiz kurulum() ( lcd.init(); // LCD ekranı başlatılıyor lcd.backlight(); // ekranın arka ışığını aç lcd.createChar(3, kalp); // 3. bellek hücresinde bir “kalp” sembolü oluşturun lcd.home(); // imleci sol üst köşeye, (0,0) konumuna getirin lcd.!"); // bir metin satırı yazdır lcd.setCursor(0, 1); // imleci 2. satıra, karaktere taşıyın 1 lcd.print( " i "); // mesajı 2. satıra yazdırın lcd.printByte(3); // 3. hücrede bulunan “kalp” sembolünü yazdırın lcd.print(" Arduino "); } geçersiz döngü() (// son karakterin yanıp sönmesi lcd.setCursor(13, 1); // imleci satır 2, karakter 1'e taşıyın lcd.print("\t"); gecikme(500); lcd.setCursor(13, 1); // imleci 2. satır, 1. karaktere getirin lcd.print(" "); gecikme(500); }

Bu arada, komut tarafından yazılan karakterler lcd.createChar(); gücü kapattıktan sonra bile ekran belleğinde kalır, çünkü ROM 1602'yi görüntülemek için yazılmıştır.

5 Kendi sembollerinizi yaratın LCD ekran için

LCD ekranlar için kendi sembollerinizi oluşturma konusuna daha yakından bakalım. Ekrandaki her karakter 35 noktadan oluşur: 5 geniş ve 7 yüksek (+1 alt çizgi için ayrılmış satır). Yukarıdaki çizimin 6. satırında 7 sayıdan oluşan bir dizi tanımlıyoruz: (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Onaltılı sayıları ikiliye dönüştürün: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Bu sayılar, sembolün 7 satırının her biri için bit maskelerinden başka bir şey değildir; burada "0", açık bir noktayı ve "1", karanlık bir noktayı belirtir. Örneğin bit maskesi olarak belirtilen kalp sembolü şekildeki gibi ekranda görünecektir.

6 LCD ekran kontrolü I2C veriyolu aracılığıyla

Krokiyi Arduino'ya yükleyelim. Sonunda yanıp sönen imleç ile belirttiğimiz yazı ekranda görünecektir.


7 Arkasında ne var I2C veriyolu

Bonus olarak, Latince "A", "B" ve "C" karakterlerinin LCD ekranda görüntülenmesine ilişkin zamanlama şemasına bakalım. Bu karakterler ekran ROM'unda saklanır ve adresleri ekrana iletilerek ekranda görüntülenir. Diyagram ekranın RS, RW, E, D4, D5, D6 ve D7 pinlerinden alınmıştır. zaten FC-113 “I2C paralel veri yolu” dönüştürücüsünden sonra. Donanımsal konulara biraz daha derinlemesine daldığımızı söyleyebiliriz.


Latin karakterlerinin “A”, “B” ve “C” LCD ekranındaki çıkışının zamanlama şeması 1602

Diyagram, ekran ROM'unda bulunan karakterlerin (veri sayfasının 11. sayfasına bakın, aşağıdaki bağlantı) iki yarım parça halinde iletildiğini gösterir; bunlardan ilki tablo sütun numarasını ve ikincisi satır numarasını belirler. Bu durumda veriler hat üzerindeki sinyalin kenarında "kilitlenir" e(Etkinleştir) ve satır R.S.(Kayıt seçimi) mantıksal tek durumdadır; bu, verilerin aktarıldığı anlamına gelir. RS hattındaki düşük durum, talimatların gönderildiği anlamına gelir; her karakter iletilmeden önce bunu görürüz. Bu durumda, LCD ekranın (0, 0) konumuna geri dönüş talimat kodu iletilir; bu, ekranın teknik açıklaması incelenerek de öğrenilebilir.

Ve bir örnek daha. Bu zamanlama diyagramı LCD ekrandaki Kalp sembolünün çıkışını gösterir.


Yine ilk iki dürtü Olanak vermek talimatlara uymak Ev()(0000 0010 2) - taşıyıcıyı (0; 0) konumuna getirin ve ikinci ikisini - 3 10 bellek hücresinde saklanan LCD ekrana çıktı (0000 0011 2) “Kalp” sembolü (talimat) lcd.createChar(3, kalp); taslak).