LSD ekran bağlantısı. Eğitim Kursu

Her radyo amatörü, belirli sayıda basit ev yapımı projeden sonra, sensörler ve düğmeler kullanarak görkemli bir şey inşa etme hedefine gelir. Sonuçta verileri port monitörü yerine ekranda görüntülemek çok daha ilginç. Ama sonra şu soru ortaya çıkıyor: Hangi ekranı seçmeli? Ve genel olarak nasıl bağlanır, bağlanmak için neye ihtiyaç vardır? Bu soruların cevapları bu makalede tartışılacaktır.

LCD 1602

Birçok ekran seçeneği arasında özellikle HD4478 denetleyiciyi temel alan LCD1602 ekranı belirtmek isterim. Bu ekran iki renkte mevcuttur: mavi arka plan üzerinde beyaz harfler, sarı arka plan üzerinde siyah harfler. LCD 1602'yi Arduino'ya bağlamak da herhangi bir soruna neden olmayacaktır çünkü yerleşik bir kütüphane vardır ve ek bir şey indirmeye gerek yoktur. Ekranlar yalnızca fiyat açısından değil aynı zamanda boyut olarak da farklılık gösterir. Çoğu zaman radyo amatörleri 16 x 2, yani 16 karakterden oluşan 2 satır kullanırlar. Ancak 20 karakterden oluşan 4 satırın bulunduğu 20 x 4 de var. Lcd 1602 ekranın Arduno'ya bağlanmasında boyutların ve rengin herhangi bir rolü yoktur; aynı şekilde bağlanırlar. Görüş açısı 35 derece, ekran tepki süresi 250 ms'dir. -20 ila 70 santigrat derece arasındaki sıcaklıklarda çalışabilir. Çalışma sırasında ekran için 4 mA ve arka ışık için 120 mA kullanır.

Nerede kullanılır?

Bu ekran yalnızca radyo amatörleri arasında değil aynı zamanda büyük üreticiler arasında da popülerdir. Örneğin yazıcılar ve kahve makineleri de LCD1602'yi kullanır. Bunun nedeni düşük fiyatıdır, bu ekranın Çin sitelerinde maliyeti 200-300 ruble'dir. Mağazalarımızda bu serginin fiyatları çok yüksek olduğu için oradan satın almaya değer.

Arduino'ya bağlanma

LCD 1602'yi Arduino Nano ve Uno'ya bağlamak farklı değil. Ekranla iki modda çalışabilirsiniz: 4 bit ve 8. 8 bit ile çalışırken hem düşük dereceli hem de yüksek dereceli bitler kullanılır ve 4 bit ile yalnızca düşük dereceli olanlar kullanılır. 8 bit ile çalışmanın özel bir anlamı yoktur, çünkü bağlantı için 4 kişi daha ekleyecektir ki bu tavsiye edilmez, çünkü hız daha yüksek olmayacaktır, ekran güncelleme sınırı saniyede 10 kezdir. Genel olarak, LCD 1602'yi Arduino'ya bağlamak için çok sayıda kablo kullanılır, bu da bazı rahatsızlıklara neden olur, ancak özel kalkanlar vardır, ancak daha sonra buna daha fazla değineceğiz. Fotoğrafta ekranın Arduino Uno'ya bağlantısı gösterilmektedir:

Basit kod:

#katmak // Gerekli LiquidCrystal kütüphanesini ekleyin lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup())( lcd.begin(16, 2); // Ekran boyutunu ayarlayın lcd.setCursor(0, 0); // İmleci ayarlayın başlangıca 1 satır lcd.print("Merhaba, dünya!"); // Metnin çıktısı lcd.setCursor(0, 1); // İmleci 2. satırın başına ayarla lcd.print("site") ; // Metnin çıktısı ) void loop ()( )

Kod ne işe yarar? İlk adım, ekranla çalışmak üzere kitaplığı bağlamaktır. Yukarıda bahsedildiği gibi bu kütüphane Arduino IDE'ye zaten dahil edilmiştir ve ayrıca indirilip kurulmasına gerek yoktur. Daha sonra pinlere bağlanan kontaklar belirlenir: sırasıyla RS, E, DB4, DB5, DB6, DB7. Daha sonra ekran boyutu ayarlanır. 16 karakter ve 2 satırdan oluşan bir versiyonla çalıştığımız için aşağıdaki değerleri yazıyoruz. İmleci ilk satırın başına yerleştirip ilk metnimiz Merhaba Dünya'yı görüntülüyoruz. Daha sonra imleci ikinci satıra getirin ve sitenin adını görüntüleyin. Bu kadar! LCD 1602'nin Arduino Uno'ya bağlanması düşünüldü.

I2C nedir ve neden gereklidir?

Yukarıda belirtildiği gibi, ekranın bağlanması çok fazla bağlantı gerektirir. Örneğin, birden fazla sensör ve bir LCD ekran ile çalışırken 1602 pin yeterli olmayabilir. Çoğu zaman radyo amatörleri, çok fazla bağlantısı olmayan Uno veya Nano versiyonlarını kullanır. Sonra insanlar özel kalkanlar buldular. Örneğin I2C. Yalnızca 4 pinli bir ekranı bağlamanıza olanak tanır. Bu iki kat daha fazla. I2C modülü hem ayrı olarak satılır, hem de kendiniz lehimlemeniz gerekir ve zaten LCD 1602 ekrana lehimlenmiştir.

I2C modülünü kullanarak bağlantı

LCD 1602'yi I2C ile Arduino Nano'ya bağlamak çok az yer kaplar, yalnızca 4 pin vardır: toprak, güç ve 2 veri çıkışı. Arduino'da gücü ve toprağı sırasıyla 5V ve GND'ye bağlıyoruz. Kalan iki kontağı bağlarız: SCL ve SDA herhangi bir analog pime. Fotoğrafta bir lcd 1602'yi bir I2C modülüyle bir arduinoya bağlamanın bir örneğini görebilirsiniz:

Program kodu

Modülsüz bir ekranla çalışmak için yalnızca bir kitaplığın kullanılması gerekiyorsa, bir modülle çalışmak için iki kitaplığa ihtiyacınız vardır. Bunlardan biri zaten Arduino IDE - Wire'a dahil edilmiştir. Başka bir kütüphane olan LiquidCrystal I2C'nin ayrı olarak indirilmesi ve kurulması gerekir. Kütüphaneyi Arduino'ya kurmak için indirilen arşivin içeriğinin kök Kütüphaneler klasörüne yüklenmesi gerekir. I2C kullanan örnek program kodu:

#katmak #katmak LiquidCrystal_I2C lcd(0x27,16,2); // Ekranın void setup() değerini ayarlayın ( lcd.init(); lcd.backlight(); // Ekran arka ışığını açın lcd..setCursor(8, 1); lcd.print("LCD 1602"); ) void loop( ) ( // İmleci ikinci satıra ve sıfır karakterine ayarlayın. lcd.setCursor(0, 1); // Arduino'nun başlatılmasından bu yana geçen saniye sayısını görüntüleyin lcd.print(millis()/1000); )

Gördüğünüz gibi kod neredeyse aynı.

Kendi sembolünüzü nasıl ekleyebilirsiniz?

Bu ekranlardaki sorun Kiril alfabesi ve sembollerinin desteğinin olmamasıdır. Örneğin ekrana yansıtabilmesi için bir sembol yüklemeniz gerekiyor. Bunu yapmak için ekran, kendi sembollerinizden en fazla 7'sini oluşturmanıza olanak tanır. Tabloyu hayal edin:

0 0 0 1 0
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
0 0 0 1 0
0 0 0 0 0

0 ise orada hiçbir şey yok, 1 ise burası boyalı alandır. Yukarıdaki örnekte "gülen surat" sembolünün yaratılışını görebilirsiniz. Arduino'da örnek bir program kullanırsak şöyle görünecektir:

#katmak #katmak // Gerekli kütüphaneyi ekleyin // Gülümseme sembolü bayt gülümsemesinin bit maskesi = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup())( lcd.begin(16, 2); // Ekran boyutunu ayarlayın lcd.createChar(1, smile); // Karakter numarası oluşturun 1 lcd.setCursor(0, 0); // İmleci 1. satırın başına ayarla lcd.print("\1"); // Gülen yüz göster (karakter numarası 1) - "\1" ) geçersiz döngü ())( )

Gördüğünüz gibi tabloyla aynı şekilde bir bit maskesi oluşturuldu. Bir kez oluşturulduktan sonra ekranda bir değişken olarak görüntülenebilir. Bellekte yalnızca 7 karakter saklayabileceğinizi unutmayın. Prensip olarak bu yeterlidir. Örneğin bir derece sembolü göstermeniz gerekiyorsa.

Ekranın çalışmayabileceği sorunlar

Ekranın çalışmadığı zamanlar vardır. Örneğin, açılıyor ancak karakterleri göstermiyor. Veya hiç açılmıyor. Öncelikle pinleri doğru bağlayıp bağlamadığınızı kontrol edin. Arduino'ya I2C olmadan LCD 1202 bağlantısı kullandıysanız kabloların birbirine dolanması çok kolaydır, bu da ekranın düzgün çalışmamasına neden olabilir. Ayrıca ekran kontrastının da artırıldığından emin olmalısınız, çünkü minimum kontrastta LCD 1602'nin açılıp açılmadığı bile görülemez. Bu işe yaramazsa, belki de sorun kontakların lehimlenmesinde yatıyor olabilir, bu bir I2C modülü kullanıldığında olur. Ekranın çalışmamasının bir diğer yaygın nedeni de I2C adresinin yanlış ayarlanmasıdır. Gerçek şu ki, birçok üretici var ve farklı bir adres koyabilirler, burada düzeltmeniz gerekiyor:

LiquidCrystal_I2C lcd(0x27,16,2);

Parantez içinde 0x27 ve 16,2 olmak üzere iki değer görebilirsiniz (16,2 ekran boyutu ve 0x27, I2C adresidir). Bu değerler yerine 0x37 veya 0x3F ayarını deneyebilirsiniz. Diğer bir neden ise arızalı LCD 1602'dir. Arduino'ya ait hemen hemen her şeyin Çin'de üretildiği göz önüne alındığında, satın alınan ürünün arızalı olmadığından %100 emin olamazsınız.

LCD 1602'nin artıları ve eksileri

LCD 1602 ekranın artılarına ve eksilerine bakalım.

  • Fiyat. Bu modül Çin mağazalarından çok uygun fiyata satın alınabiliyor. Fiyatı 200-300 ruble. Hatta bazen I2C modülüyle birlikte satılıyor.
  • Bağlanması kolay. Muhtemelen bugünlerde hiç kimse LCD 1602'yi I2C olmadan bağlamıyor. Ve bu modülle bağlantı yalnızca 4 kontak alır, kablo "ağları" olmayacaktır.
  • Programlama. Hazır kütüphaneler sayesinde bu modülle çalışmak kolaydır; tüm fonksiyonlar zaten yazılmıştır. Ve eğer kendi sembolünüzü eklemeniz gerekiyorsa, bu yalnızca birkaç dakika sürer.
  • Binlerce radyo amatörünün kullanımı sırasında büyük bir dezavantaj tespit edilmedi, yalnızca ekranların Çin versiyonları kullanıldığı için kusurlu satın alma durumları var.

Bu makalede 1602'nin Arduino'ya bağlanması ele alındı ​​ve ayrıca bu ekranla çalışmaya yönelik program örnekleri de sunuldu. Gerçekten kategorisinin en iyilerinden biri; binlerce radyo amatörünün projeleri için onu seçmesi boşuna değil!

HD44780 denetleyiciyi temel alan 1602 boyutlu LCD ekranlar, çeşitli elektronik cihazların geliştirilmesi için en basit, en uygun fiyatlı ve popüler ekranlardan biridir. Hem diz üzerine monte edilen cihazlarda hem de kahve makineleri gibi endüstriyel cihazlarda bulunabilir. Gibi en popüler Arduino temalı modüller ve kalkanlar bu ekran temelinde toplanmıştır.

Bu yazımızda Arduino’ya nasıl bağlayıp bilgileri nasıl görüntüleyeceğinizi anlatacağız.

Kullanılan bileşenler (Çin'de satın alın):

. Kontrol Paneli

. Kabloların bağlanması

Bu ekranların iki tasarımı vardır: siyah harflerle sarı arka ışık veya daha yaygın olarak beyaz harflerle mavi arka ışık.

HD44780 denetleyicideki ekranların boyutu farklı olabilir ancak aynı şekilde kontrol edileceklerdir. En yaygın boyutlar 16x02 (yani iki satırda 16 karakter) veya 20x04'tür. Sembollerin çözünürlüğü 5x8 pikseldir.

Çoğu ekran Kiril alfabesini desteklemez; yalnızca CTK işaretli ekranlarda bu alfabe bulunur. Ancak bu sorunu kısmen çözmeye çalışabiliriz (makalenin devamı).

Ekran çıktıları:

Ekranda bağlantı için 16 pinli bir konnektör bulunur. Pimler tahtanın arkasında işaretlenmiştir.

1 (VSS) - Kontrol cihazı güç kaynağı (-)
2 (VDD) - Kontrol cihazı güç kaynağı (+)
3 (VO) - Kontrast kontrol pimi
4 (RS) - Kayıt seçimi
5 (R/W) - Okuma/Yazma (toprağa bağlandığında yazma modu)
6 (E) - Etkinleştir (reddetme durumunda flaş)
7-10 (DB0-DB3) - 8 bitlik arayüzün düşük dereceli bitleri
11-14 (DB4-DB7) - Arayüzün yüksek dereceli bitleri
15 (A) - Anot (+) arka ışık güç kaynağı
16 (K) - Katot (-) arka ışık güç kaynağı

Kendi kendine test modu:

Bağlanmayı ve bilgileri görüntülemeyi denemeden önce ekranın çalışıp çalışmadığını öğrenmek iyi bir fikir olacaktır. Bunu yapmak için kontrolörün kendisine voltaj uygulamanız gerekir ( VSS ve VDD), arka ışığı açın ( A ve K) ve ayrıca kontrastı da ayarlayın.

Kontrastı ayarlamak için 10 kOhm'luk bir potansiyometre kullanın. Hangi şeklin olacağı önemli değil. Dış ayaklara +5V ve GND beslenir, orta ayak çıkışa bağlanır V.O.

Devreye güç uyguladıktan sonra doğru kontrastı elde etmek gerekir, eğer doğru ayarlanmazsa ekranda hiçbir şey görüntülenmez. Kontrastı ayarlamak için potansiyometreyle oynayın.

Devre doğru monte edilmiş ve kontrastı doğru ayarlanmışsa ekranın üst satırı dikdörtgenlerle doldurulmalıdır.

Bilgi çıkışı:

Ekranı çalıştırmak için Arduino IDE'de yerleşik LiquidCrystal.h kütüphanesi kullanılır.

Kütüphane işlevselliği

//İmleçle çalışma lcd.setCursor(0, 0); // İmleci ayarla (hücre numarası, satır) lcd.home(); // İmleci sıfıra ayarla (0, 0) lcd.imleç(); // İmleç görünürlüğünü etkinleştir (altı çizili) lcd.noCursor(); // İmlecin görünürlüğünü kaldır (altı çizili) lcd.blink(); // İmlecin yanıp sönmesini etkinleştir (imleç 5x8) lcd.noBlink(); // İmlecin yanıp sönmesini kapat (imleç 5x8) //Bilgi çıkışı lcd.print("site"); // Bilgi çıkışı lcd.clear(); // Ekranı temizle, (tüm verileri sil) imleci sıfıra ayarla lcd.rightToLeft(); // Kayıt sağdan sola doğru yapılıyor lcd.leftToRight(); // Yazma işlemi soldan sağa yapılır lcd.scrollDisplayRight(); // Ekrandaki her şeyi bir karakter sağa kaydır lcd.scrollDisplayLeft(); // Ekrandaki her şeyi bir karakter sola kaydır //Casuslar için faydalı bilgiler :) lcd.noDisplay(); // Ekrandaki bilgiler görünmez olur, veriler silinmez // eğer bu fonksiyon aktif olduğu anda hiçbir şey görüntülenmiyorsa, o zaman LCD ekran(); // display() işlevi çağrılırken, kaydedilen tüm bilgiler

Ekranın kendisi iki modda çalışabilir:

8 bit modu - bunun için hem düşük hem de yüksek bitler kullanılır (BB0-DB7)

4 bit modu - bunun için yalnızca en az önemli bitler kullanılır (BB4-DB7)

Bu ekranda 8 bit modunun kullanılması önerilmez. Operasyonu 4 ayak daha gerektirir ve pratikte hız kazancı yoktur çünkü Bu ekranın yenileme hızı sınırlıdır< 10раз в секунду.

Metin çıktısı almak için RS, E, DB4, DB5, DB6, DB7 pinlerini denetleyici pinlerine bağlamanız gerekir. Herhangi bir Arduino pinine bağlanabilirler, asıl önemli olan koddaki doğru sırayı ayarlamaktır.

Basit kod:

#katmak LiquidCrystal lcd(7, 6, 5, 4, 3, 2); geçersiz kurmak()(lcd.begin(16, 2); //Ekran boyutunu ayarlayın lcd.setCursor(0, 0); lcd.print("Merhaba dünya!"); // Metni görüntüle lcd.setCursor (0, 1); // İmleci 2. satırın başına ayarla lcd.print("site"); // Çıkış metni) geçersiz döngü (){ }

Kendi sembollerinizi yaratın

Metin çıktısını çözdük, İngilizce alfabenin harfleri ekranın içindeki kontrol cihazının belleğine kabloyla bağlandı ve onlarla ilgili herhangi bir sorun yok. Peki gerekli sembol kontrolörün hafızasında değilse ne yapmalı?

Sorun değil, gerekli sembol manuel olarak oluşturulabilir (toplamda 7 sembole kadar). Düşündüğümüz ekranlardaki hücre 5x8 piksel çözünürlüğe sahip. Bir sembol yaratmanın tek amacı, bir bit maskesi yazmak ve noktaların yanması gereken yerlere ve yanmaması gereken yerlere sıfırları yerleştirmektir.

Aşağıdaki örnekte gülen yüz çizeceğiz.

Basit kod

//Arduino IDE 1.0.5'te test edildi#katmak #katmak //gerekli kütüphaneyi ekliyoruz // Gülümseme sembolünün bit maskesi byte smile = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) geçersiz kurmak()(lcd.begin(16, 2); //Ekran boyutunu ayarlayın lcd.createChar(1, gülümse); // 1 numaralı sembolü oluştur lcd.setCursor(0, 0); // İmleci 1 satırın başına ayarla lcd.print("\1"); // Gülen yüz göster (karakter numarası 1) - "\1") geçersiz döngü (){ }

Bonus

Yorumlarda bir topluluk üyesi sembol oluşturucuya bir bağlantı gönderdi

  • igorka

      Yukarıdaki gibi karakter oluşturucu,
      Bunu yaptım çünkü zayıf değildim)

Bu sefer size Nokia 1202 cep telefonunun ekranının Atmega8 mikro denetleyicisine nasıl bağlanacağını anlatmak istiyorum. CodeVision ortamında programlıyoruz. Orada burada yanılmış olabilirim. Neyin ne olduğunu anlamam çok uzun sürmedi. Programlama konusunda hiçbir tecrübem yok ve kütüphaneyi ekranla çalışmak için yazmadım. İnternetteki bir projeden kopyalandılar. Gerekli tüm fonksiyonlar orada yazılı olup, Latin harfleri ve Kiril alfabesiyle 5*8 yazı tipi bulunmaktadır. Ayrıca kitaplıkların yazarının cihazında kullandığı birkaç 12*16 ve 24*32 karakteri de vardır. Bunları kaldırırsanız, 5*8 ​​yazı tipi yaklaşık 700 bayt mikro denetleyici flaşını kaplar. Bu nedenle proje için mikrodenetleyicinin "daha yağlı" alınması gerekiyor.Benim durumumda ben kullandım Atmega8. Oldukça yeterli. Tüm dosyalar - kaynaklar, kütüphane vb.

Gösterge bağlantı şeması

LCD ekranı MK'ye bağlamanın şematik diyagramı

Bağlantı şeması çizdim. Ekrana güç sağlamak için 3,3V'luk bir voltaja ihtiyacınız vardır. Mikrodenetleyiciye 5V'tan güç veriyorsanız, direnç bölücüler ve bir mikro devre takın 78L33. Devrenin tamamı 3,3V'tan besleniyorsa direnç bölücülere gerek yoktur. Atmega8A'nın frekansı 8 MHz'den yüksek olmamak koşuluyla 3.3V'den çalışabileceği görülüyor. Şahsen ben denemedim. Her şeyi 5V ile çalışan bir hata ayıklama panosunda topladım. Hiçbir durumda ekranın önüne büyük kapasiteli bir elektrolit koymamalısınız. Çalışmanın en başında kontrol cihazı ekrana başlatma komutları gönderir. Kapasitörün şarj edilmesi zaman alır. Şarj olurken ve ekran çalışmaya başlarken bir süre geçecek ve başlatma komutu almayacaktır. Elbette bunlar milisaniyedir ancak bu durumda etki farkedilir.


Pin şemasını görüntüle

Nokia 1202 ekranı 9 bitlik bir SPI arayüzüne sahiptir. Seçtiğimiz mikrodenetleyicinin bu lüksü yok. Bu nedenle, ekranla iletişim kurmak için donanım değil, yazılım SPI'sini kullanıyoruz, tabiri caizse "hiç düşünmeden". CodeVision'da nasıl yeni projeler oluşturacağınızı size söylemeyeceğim - kendiniz düşünün. Sadece şunu söyleyeceğim: tüm PORTB pinleri çıkış olarak yapılandırılmalıdır. Proje ayarlarında " seçeneğini işaretlemeniz gerekir. Global Sabitleri FLASH Bellekte Saklayın" Bu eylem, yazı tipi dizilerinin ve görsellerimizin flash'ta saklanması için gereklidir.


Böylece projeyi oluşturduk. Bir mikrodenetleyici seçtik, saat frekansını ayarladık ve projeyi yapılandırdık. Sıradaki ne? Daha sonra görüntüleme ve gecikme kitaplıklarıyla çalışmak için kitaplıklar eklemeniz gerekir. Arşivi paketinden çıkarın. Orada iki dosya var. Belirli klasörlere kopyalanmaları gerekir. Umarım CodeVision'ı doğrudan C:\ sürücüsüne yüklemişsinizdir. Evetse, dosyaları uygun yollara kopyalayın:

1100.inc dosyası için C:\cvavreval\inc ve
1100.h dosyası için C:\cvavreval\lib .


Ayrıca dosyada mikrodenetleyici pinlerinin atamasının değiştirilebileceğini de söylemek istiyorum. 1100.saat. Daha sonra bağlantı şeması değişecektir. Kodlamaya başlayalım. Ekranda 5*8 ana yazı tipinde bazı yazılar görüntüleyelim. Başlangıçta kütüphaneler ekleyeceğiz.

#katmak< 1100.h>// kütüphaneyi göster
#katmak // kütüphaneyi geciktir

En altta, ana while(1)() döngüsünden önce ekranı başlatıyoruz ve temizliyoruz.

lcd_init(); // başlatmayı göster
lcd_clear(); // ekranı temizle

Ayrıca yazımızı ana döngünün önüne yerleştireceğiz. Denetleyicinin önce mesajı ekranda göstermesine ve ardından ana döngüde dönmesine izin verin. Bunu yazıyoruz:

print_string("Yazıyı çıktıla",5,0);
print_string("Ne istersek",0,1);
print_string("BUCKER",10,2);

Burada her şeyin açık olduğunu düşünüyorum. İlk rakam ekrandaki x koordinatıdır. 0'dan 96'ya kadar değer alabilir. İkincisi ise string'dir. 0'dan 7'ye kadardır. Prensip olarak oraya 8 buçuk satır sığar ama biz yarım satır okumayacağız. Derleyip flashlıyoruz. Sonuca bakalım. Ayrıca Proteus'u kurup test edebilirsiniz. Kontrolör, projede belirtilen frekansta, 64 ms başlatma gecikmesiyle dahili bir jeneratörden çalışacak şekilde yapılandırılabilir. Derlenmiş projeyle birlikte bir arşiv ekliyorum. Frekans 8 MHz.


Ama başta da yazdığım gibi kütüphanede başka semboller de var. Doğru, harf yok, yalnızca sayılar var. Şimdi görevi biraz karmaşıklaştıralım. Yazıtın hareketsiz kalmasına izin vermeyin, değişin. Diyelim ki 1 saniye aralıklarla 0'dan 9'a kadar sayıyor. 9’a ulaştığında sıfırlanıp yeniden başlayacaktır. 24*32 ölçülerinde büyük sayılar alalım. Peki, başlayalım. Önceki projeyi alıp üç “print_string” satırını silebilirsiniz.Kütüphaneleri ekledikten hemen sonra belli bir global değişken tanımlayalım. M.

karakter m = 0;

Basitçe şunu yazabilirsiniz:

Bu durumda otomatik olarak 0 değeri atanacaktır. Ana döngüde şunu yazıyoruz:

char_24_32(m,35,2); //sembol çıkış fonksiyonu 24*32
gecikme_ms(1000); // 1 saniye bekle
m++; // m değişkenine 1 ekleyin
if(m>9)m=0; // Durum. M değişkeni 9'dan büyükse m 0'a eşittir.

Programın çalışmasını gösteren kısa bir video hazırladım

Sizlere nasıl resim çizileceğini ve ekranda nasıl görüntüleneceğini anlatmaya çalışacağım. Bunların çıktısını almak için diziler ve işlevler nasıl oluşturulur ve bir görüntünün nasıl tersine çevrileceği. Kütüphaneler cxem.net sitesinden ödünç alınmıştır. Hazırlanan materyal İçki.

BİR EKRANIN MİKRO DENETLEYİCİYE BAĞLANMASI makalesini tartışın

Çok sayıda elektronik cihazın ayrılmaz bir parçası nedir? Tabii ki, verilerin gösterge ve grafiksel çıktısı anlamına gelir. “Akıllı kutu” sonucunun görsel olarak görülebilmesi kullanıcı için her zaman daha kullanışlı ve keyiflidir. Bu nedenle bugün STM32'ye metin ve sayıları görüntülemek için bir ekran bağlayacağız. Deneylerimizin kahramanı Winstar'ın oldukça popüler bir sergisi olacak. Bu arada yorumlarda metodolojinin temel olarak tüm ekranlar için aynı olduğu yönünde önemli bir açıklama ortaya çıktı. HD44780.Önemli ekleme için JekaKey'e teşekkürler)

Öncelikle ekranın denetleyiciye bağlanması gerekir. Veri sayfasını indirin ve WH1602 pin çıkışını arayın. Buraya bak:

Bildiğiniz gibi, WH1602'yi görüntüle 16 pin bulunmaktadır. Her birine ayrı ayrı bakalım...

Vss, Vdd ve K pinlerinin toprağa ve güce bağlanması gerekiyor, yani tam olarak tabloda belirtildiği gibi, sürpriz yok ve tartışılacak bir şey yok)

Kontrastı ayarlamak için 3 numaralı pin kullanılıyor - oraya +5V uygularsak kesinlikle hiçbir şey görmeyeceğiz, pini toprağa kısa devre yaparsak iki sıra siyah kareye hayran kalacağız 😉 Doğal olarak bu bize yakışmıyor kontrastı ayarlamak için oraya değişken dirençli bir potansiyometre (direnç) asmamız gerekiyor. Karakterlerin en iyi görünürlüğü, bu ekran pinindeki 0,5-0,7 V voltajla sağlanır.

RS pini zaten mikrodenetleyici kullanarak kontrol edeceğimiz bir pin. Bu pinin düşük voltaj seviyesi (0) artık bir komutun takip edeceği, yüksek seviye (1) ise ekran belleğine yazılacak verinin olacağı anlamına gelir.

Pin R/W - burada belli, ya veriyi okuruz (örneğin meşgul bayrağını gösteririz), bu durumda bu pinte 1 olur, ya da komutu/veriyi ekrana yazarız, sonra burada 0 olur.

DB7 – DB0 – veri yolu ve bu her şeyi anlatıyor)

Pin E, sözde Etkinleştirme sinyalidir. Bunun için ona ihtiyaç var. Ekranla çalışmak - verileri kaydetmek veya bir komut vermek - için bu pime pozitif bir darbe vermemiz gerekir. Yani prosedür şöyle görünecek:

  1. RS, R/W, DB7 - DB0 pinlerinde komutumuza karşılık gelen gerekli sinyaller.
  2. E pinine bir tane sağlıyoruz.
  3. Zhdems (veri sayfasına göre – en az 150 ns)
  4. E pinine düşük seviye (0) uyguluyoruz.

Ekran arka ışığını çalıştırmak için A/Vee ayağına 4,2 V uygulamanız gerekir.

WH1602 ekranıyla iletişim bu şekilde gerçekleşir.

WH1602'yi bağlamayı çözdük ancak örneğe geçmeden önce ekranımızın genel olarak hangi komutları anladığına bakalım. Bunu yapmak için veri sayfasına gidiyoruz ve ilginç bir tablo buluyoruz:

Her özel komut için WH1602'nin ilgili pinlerinde olması gereken tüm komutlar ve sinyaller burada açıklanmaktadır. Örneğin ekranı temizlemek istiyoruz, tabloya bakıyoruz ve işte ihtiyacımız olan komut! Ekranı Temizle!

RS, R/W, DB7, DB6, DB5, DB4, DB3, DB2, DB1 pinlerine sıfır ve DB0 pinine bir uyguluyoruz. Bitti! Sırada ne var? Aynen öyle, bir tanesi E pinine, sonra bir süre bekleyin ve E'yi tekrar sıfıra indirin. İşte bu, ekran temizlendi 😉 Bir sonraki komutu çalıştırmadan hemen önce, her komutun veri sayfasında belirtilen şekilde duraklatmanız gerekir. Meşgul bayrağını yoklamak daha etkili olacaktır; 0'a sıfırlandıktan sonra çalışmaya devam edebilirsiniz. Bu bayrağın okunması için de özel bir komut var, yani bununla ilgili her şey açık) Devam edelim...

Ve aslında her şey teoride, zaten bir şeyler yazmayı deneyebilirsiniz. Ekranla çalışmayı kolaylaştırmak için küçük bir kitaplık yaptım, şimdi bunun nasıl kullanılabileceğini görelim. Öncelikle indirin

Elimizde 2 dosya var, MT_WH1602.c ve MT_WH1602.h. İkincisini yırtıyoruz, burada kullanılan pinleri ve kontrol cihazını seçmemiz gerekiyor.

Bu arada ekranım şu şekilde bağlı:

RS-PC2
Oku/Yaz – PB10
E–PB14
DB7–PD2
DB6–PC12
DB5–PA8
DB4–PA10
DB3–PA15
DB2–PD11
DB1–PA3
DB0–PA5

MT_WH1602.h dosyasını açın:

#define PLATFORM (STM32F10x)

Daha sonra ekranın bağlı olduğu mikro denetleyici pinlerini seçin. Öncelikle hangi portları kullandığımızı ayarlayalım. Bağlandığımda GPIOA, GPIOB, GPIOC ve GPIOD kullanıyorum, şunu yazıyoruz:

Benzer şekilde diğer mikrodenetleyici ayakları için.

Kurulumu tamamladık, devam edelim) Yazının başında verilen komutları çağırmak için MT_WH1602.c dosyasında aşağıdaki fonksiyonlar bulunmaktadır (bunlar komutların isimlerinden sonra isimlendirilmiştir, dolayısıyla her şey anlaşılmıştır diye düşünüyorum) :

void MT_WH1602_ClearDisplay(geçersiz) ; void MT_WH1602_ReturnHome(geçersiz) ; void MT_WH1602_EntryModeSet (bool IDaddress, bool kaydırma) ; void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ; void MT_WH1602_CursorOrDisplayShift (bool SCbit, bool RLbit) ; void MT_WH1602_FunctionSet (bool DLbit, bool Nbit, bool Fbit) ; void MT_WH1602_SetCGRAMAddress (uint8_t adresi) ; void MT_WH1602_SetDDRAMAddress (uint8_t adresi) ; bool MT_WH1602_ReadBusy(geçersiz) ; void MT_WH1602_WriteData(uint8_t veri) ;

Bazı komutlar için fonksiyona parametre aktarmamız gerekir, örneğin:

void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ;

Komut tablosuna bakalım:

Display ON/OFF komutunun sadece ekranı açıp kapatmakla kalmayıp aynı zamanda imleç ve imleç yanıp sönmesini de etkinleştirip/devre dışı bıraktığını görüyoruz. Veri sayfasında bu komut bitleri D, C ve B olarak belirtilir ve bunları fonksiyona parametre olarak aktarırız. Ekranı ve imleci açmamız ancak imlecin yanıp sönmesini devre dışı bırakmamız gerekiyorsa komutu şu şekilde çağırırız:

MT_WH1602_DisplayOnOff(1, 1, 0);

Genel olarak her şey basit 😉

Kısacası yeni bir proje oluşturuyoruz, WH1602 ekranıyla çalışmak için bir kütüphane ekliyoruz, boş bir .c dosyası oluşturuyoruz ve onu kodla doldurmaya başlıyoruz:

// Kütüphane dosyasını dahil et#include "MT_WH1602.h" /*******************************************************************/ int ana(geçersiz) ( // Başlatma fonksiyonunu çağırın, onsuz yapamayız =)() ; // Şimdi ilk ekran konfigürasyonunu yapmamız gerekiyor // Dokümantasyon ve İnternet bunu yapmanızı önerir;) MT_WH1602_FunctionSet(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_FunctionSet(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_FunctionSet(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_FunctionSet(1, 1, 1); MT_WH1602_Delay(1000) ; MT_WH1602_DisplayOnOff(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_ClearDisplay() ; MT_WH1602_Delay(2000) ; // Mesela aklıma ilk gelen gecikme değerlerini aldım) // Genel olarak ekran meşgul bayrağını kontrol etmeniz gerekir // Şimdi sitemizin adı gibi bir şeyi görüntüleyelim MT_WH1602_WriteData(0x6D) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x69) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x72) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x6F) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x74) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x65) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x68) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x6E) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x69) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x73) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x2E) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x72) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x75) ; MT_WH1602_Delay(100) ; while (1 ) ( __NOP() ; )) /*******************************************************************/

Bitti, kontrol edelim)


Gördüğünüz gibi her şey doğru çalışıyor)

Bu arada, şu veya bu karakteri görüntülemek için ekrana ne yazmam gerektiği sorusunu bir şekilde gözden kaçırdım. İşte veri sayfasındaki plaka:

Yani ekran hafızasına hangi değerin yazılacağını belirlemek için belirli bir sembol için bu tabloda üstte ve solda yazılan sayıları almanız gerekir. Örneğin “A” sembolü. Bakalım - bu sembol 0100 sütununa (0x4) ve 0001 (0x1) satırına karşılık geliyor. “A” sembolünü görüntülemek için ekrana 0x41 değerini yazmanız gerektiği ortaya çıktı.

İşte bu kadar =) WH1602 ekranın bağlantısını ve çalışmasını çözdük, yakında görüşürüz!

Not: Kütüphaneyle çalışırken meşgul bayrağını okuma işlevini test etmedim, bu nedenle aniden bir şey olması gerektiği gibi çalışmazsa yazın, çözeceğiz)

  • 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 et;
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 lcd.printByte(3); // 3. hücrede bulunan "kalp" sembolünü yazdır 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 veri yolu

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).