i2c bağlantısı. LCD ekran LCM1602'yi I2C ile Arduino'ya bağlama

  • FC-113 modülü, I2C seri veri yolu için bir G/Ç genişleticisi olan 8 bitlik bir kaydırma yazmacı olan PCF8574T yongasını temel alır. Şekilde, mikro devre DD1 olarak belirlenmiştir.
  • R1 - LCD ekranın kontrastını ayarlamak için düzeltici.
  • Jumper J1, ekranın arka ışığını açmak için kullanılır.
  • 1…16 pinleri modülü LCD ekranın pinlerine bağlamak için kullanılır.
  • Cihazın I2C adresini değiştirmek için A1 ... A3 kontak pedleri gereklidir. Uygun jumperları lehimleyerek cihazın adresini değiştirebilirsiniz. Tablo, adresler ve jumper'lar arasındaki yazışmayı göstermektedir: "0", bir açık devreye karşılık gelir, "1" - bir jumper takılıdır. Varsayılan olarak, 3 jumper'ın tümü açıktır ve cihaz adresi 0x27.

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

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


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

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

indirilen arşiv LiquidCrystal_I2Cv1-1.rar bir klasöre sıkıştırmayı aç \kütüphaneler\ Arduino IDE dizininde bulunan .

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

İşlevAmaç
Likit kristal() LiquidCrystal türünde 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 ve sembol sayısı);
açık() ekranı temizlemek ve imleci orijinal konumuna döndürmek;
ev() imlecin başlangıç ​​konumuna dönmesi;
setİmleç() imleci belirli bir konuma ayarlamak;
yazmak() karakteri LCD ekranda görüntüler;
Yazdır() LCD ekranda metni görüntüler;
imleç() imleci gösterir, yani sonraki karakterin altını çizerek;
noCursor() imleci gizler;
Göz kırpmak() imleç yanıp sönüyor;
noBlink() yanıp sönmeyi iptal et;
görüntü yok() görüntülenen tüm bilgileri kaydederken ekranı kapatma;
Görüntüle() görüntülenen tüm bilgileri kaydederken ekranı açmak;
kaydırmaDisplaySol() ekran içeriğinin 1 pozisyonu sola kaydırılması;
scrollDisplayRight() ekran içeriğinin 1 konumu sağa kaydırılması;
Otomatik kaydırma() otomatik kaydırmayı etkinleştir;
noAutoscroll() otomatik kaydırmayı kapatın;
soldan sağa() metin yönünü soldan sağa ayarlar;
sağdan sola() sağdan sola metin yönü;
karakter oluştur() LCD ekran için özel bir sembol oluşturur.

4 Metin çıktısı için eskiz I2C veri yolu üzerinden LCD ekrana

Örneği açalım: Dosya Örnekleri LiquidCrystal_I2C Özel Karakterler ve biraz değiştirelim. Sonunda yanıp sönen bir karakter olacak bir mesaj gösterelim. Çizimin tüm nüansları, kodun yorumlarında yorumlanmıştır.

#Dahil etmek // Wire kitaplığını dahil et #include // LCD kitaplığını bağla #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 ayarla geçersiz kurulum()( lcd.init(); // LCD başlatma lcd.backlight(); // ekran arka ışığını aç lcd.createChar(3, kalp); // hafıza konumunda bir kalp sembolü oluştur 3 lcd.home(); // imleci sol üst köşeye, (0,0) lcd pozisyonuna getirin!"); // bir metin satırı lcd.setCursor(0, 1); // imleci satır 2, karaktere taşı 1 lcd.print( "i"); // 2. satırdaki mesajı yazdır lcd.printByte(3); // 3. hücrede bulunan kalp karakterini yazdır lcd.print("Arduino"); } boşluk döngüsü() (// son karakter lcd'yi yanıp söner setCursor(13, 1); // imleci satır 2'ye taşıyın, karakter 1 lcd.print("\t"); gecikme(500); lcd.setCursor(13, 1); // imleci satır 2'ye taşıyın, karakter 1 lcd.print(" "); gecikme(500); }

Bu arada, komut tarafından yazılan karakterler lcd.createChar(); güç kapatıldıktan sonra bile ekran belleğinde kalır. 1602 ekranının ROM'una yazılır.

5 Kendi sembollerinizi oluşturma 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 (altı çizgi için +1 yedek 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ık sayıları ikiliye çevirelim: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Bu sayılar, karakterin 7 satırının her biri için bit maskelerinden başka bir şey değildir; burada "0" bir açık noktayı ve "1" karanlık bir noktayı belirtir. Örneğin bitmask olarak verilen bir kalp sembolü şekildeki gibi ekranda belirecektir.

6 LCD kontrol I2C veri yolu aracılığıyla

Krokiyi Arduino'ya yükleyin. Belirttiğimiz yazı, sonunda yanıp sönen bir imleç ile ekranda görünecektir.


7 arkasında ne var I2C veri yolu

Bir bonus olarak, LCD ekranda "A", "B" ve "C" Latin karakterlerinin çıktısının zamanlama şemasını düşünün. Bu karakterler ekranın ROM'unda saklanır ve adresleri ekrana iletilerek ekranda görüntülenir. Diyagram, ekranın RS, RW, E, D4, D5, D6 ve D7 çıkışlarından alınmıştır, yani. FC-113 "I2C paralel veri yolu" dönüştürücüsünden sonra. "Demir"in biraz "derine" daldığımızı söyleyebiliriz.


1602 LCD ekranda "A", "B" ve "C" Latin karakterlerini görüntülemek için zamanlama şeması

Diyagram, ekran ROM'unda bulunan karakterlerin (veri sayfasının 11. sayfasına bakın, aşağıdaki bağlantı) iki nibble 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ı boyunca "mandallanır". E(Etkinleştir) ve satırı RS(Kayıt seçimi, kayıt seçimi) mantıksal bir durumda, yani veri aktarımı. RS satırının düşük durumu, her karakterin iletilmesinden önce gördüğümüz talimatların iletilmesi anlamına gelir. Bu durumda, LCD ekranın (0, 0) konumuna satır başı talimatının kodu iletilir ve bu, ekranın teknik açıklaması incelenerek de bulunabilir.

Ve bir örnek daha. Bu zamanlama şeması, LCD'deki Kalp sembolünün görüntüsünü gösterir.


Yine, ilk iki dürtü etkinleştirme talimatlara uymak Ev()(0000 0010 2) - satır (0; 0) konumuna dönüş ve ikinci iki - bellek hücresi 3'te saklanan LCD ekrana çıktı 10 (0000 0011 2) "Kalp" sembolü (talimat lcd.createChar(3, kalp); kroki).

Belki de piyasadaki en popüler ekranlardan biri. Popüler HD44780U denetleyicisi üzerine inşa edilmiştir. Modelin adından, ekranın 16 karakterlik iki satırdan oluştuğunu takip ediyor. Bu özel modelde Rus dili için destek yoktur.

sh2s veri yolu, iki kablo üzerinden ve aynı anda 127 adede kadar cihazı bağlamanıza izin verir. Bu I2C, PCF8574T çipinde uygulanmaktadır.

Bağlantı şeması:

Mavi şey - değişken direnç, ekranın kontrastını ayarlamanıza izin verir.

Soldaki jumper, ekranın arka ışığından sorumludur.

4 pinli bir blok arduino'ya şu şekilde bağlanır:

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

Kütüphane

Kroki

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

#Dahil etmek #Dahil etmek //LCD ekran adresini ayarla 0x27, 16 karakter, 2 satır LiquidCrystal_I2C lcd (0x27, 16, 2); geçersiz kurulum() ( lcd.init(); // Ekranı başlat // arka ışığı aç lcd.backlight(); // Metnin görüntüleneceği konumu ayarlayın. lcd.setCursor(2, 0); // çıkış satırı 1 lcd.print("Merhaba Dünya!"); // benzer şekilde ikinci satırı göster lcd.setCursor(1, 1); lcd.print("www.site"); ) boşluk döngüsü () ( )

LCD I2C modülü, sadece iki sinyal kablosuyla Arduino kartına bir karakter ekranı bağlamanıza izin verir.

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

. kontrol Paneli

. Bağlantı telleri

Ana teknik özellikler:

Ekran: Karakter 16x02 veya 20x04
. Aydınlatma: Beyaz karakterlerle mavi
. Kontrast: potansiyometre ile ayarlanabilir
. Besleme gerilimi: 5V
. arayüz: I2C
. I2C adresi: 0x27
. Boyutlar: 82mm x 35mm x 18mm

Arduino'ya bağlanma

Modül, dört pimli 2.54 mm konektör ile donatılmıştır

SCL: seri saat hattı (Seri SAAT)

SDA: seri veri hattı (Seri Veri)

VCC: "+" güç

GND: "-" güç

Arduino kartlarındaki I2C arayüzünden sorumlu pinler, farklı kontrolörlere göre değişiklik gösterir.

Bu modülle çalışmak için LiquidCrystal_I2C1602V1 kitaplığını kurmanız gerekir.

Arduino klasöründeki kitaplıklar klasörüne indirin, paketini açın ve bırakın. Kütüphane ekleme sırasında Arduino IDE açıksa, ortamı yeniden başlatın.

Direk krokiye geçelim. Bu örnekte, "Merhaba dünya!" standardını görüntüleyeceğiz. ve topluluğumuzun adresi için.

kod örneği:

#Dahil etmek #Dahil etmek LiquidCrystal_I2C lcd(0x27,16,2); /* Ekranın adresini ve boyutunu ayarlayın. 20x04 ekranlı bir LCD I2C modülü kullanırken, kodda hiçbir şeyin değiştirilmesi gerekmez, sadece doğru boyutu ayarlamanız gerekir */ geçersiz kurmak() (lcd.init(); // lcd'yi başlat lcd.backlight(); // arka ışığı aç // İmleç 1. satırın başında lcd.print("Merhaba dünya!"); // Metin lcd'yi göster setCursor (0, 1); // İmleci 2. satırın başına getirin lcd.print("site"); // Metni görüntüle ) geçersiz döngü () { }

Kendi sembollerinizi oluşturma

Metin çıktısını anladık, İngiliz alfabesinin harfleri ekranın içindeki denetleyicinin hafızasına dikildi ve bunlarla ilgili herhangi bir sorun yok. Ancak, istenen karakter denetleyicinin belleğinde değilse ne yapmalı?

Önemli değil, gerekli karakter manuel olarak yapılabilir. Kısmen 7 karakterle sınırlanan bu yöntem, çıktı sorununun çözülmesine yardımcı olacaktır.

Düşündüğümüz ekranlardaki hücre, 5x8 piksel çözünürlüğe sahip. Bir sembol yaratmanın tüm görevi, bir bit maskesi yazmak ve içine noktaların yanması gereken yerlere, yanmaması gereken yerlere sıfırlar koymaktır.

Aşağıdaki örnekte bir gülen yüz çizelim.

kod örneği:

//Arduino IDE 1.0.5 üzerinde test edildi // Gerekli kütüphaneleri ekleyin#Dahil etmek #Dahil etmek // Gülümseme Sembolü Bit Maskesi bayt gülümseme = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal_I2C lcd (0x27,20,4); // Ekranın adresini ve boyutunu ayarlayın. geçersiz kurmak() (lcd.init(); // lcd'yi başlat lcd.backlight(); // arka ışığı aç // 0 numaralı sembol oluştur lcd.createChar(1, gülümse); lcd.setCursor(0, 0); // İmleci 1. satırın başına getirin lcd.print("\1"); // Gülen yüzü göster (karakter numarası 1) - "\1") geçersiz döngü () { }

Sembollerin kolay oluşturulması için program

Yorumlarda, bir topluluk üyesi bir karakter oluşturucunun bağlantısını bıraktı

Buraya iyi bir Chip Rezistor mağazasından başka bir cihazı incelemek ve faydalı cihazlarda kullanmak için aldım. Bu cihaz, 4 bit modunda HD44780 denetleyicisinin kontrolü altındaki LCD ekranı kontrol etmek için keskinleştirildi. Bu amaçla, I2C veri yolunun paralel 8 bitlik bir bağlantı noktasına dönüştürücüsü olan karta bir mikro devre kurulur.

Kart, LCD ekran ile hemen geçilebilecek şekilde boşanmıştır. Girişe güç verilir ve I2C hatları. Kartın hemen SCL ve SDA hatlarında pull-up dirençleri, kontrastı ayarlamak ve ekranın kendisini çalıştırmak için bir potansiyometre vardır.

Sağdaki jumper, arka ışığı açar/kapatır. Ardından, bir test cihazı ile donanmış aşağıdaki plaka derlendi. Modülü inceledikten sonra, bulundu P3 arka ışığı kontrol eder. Jumper ayarlanmışsa, 1 arka ışığı açar ve 0 kapatır. Jumper kaldırıldığında, arka ışık her zaman kapalıdır. Ayrıca, axlib kitaplığının I2C veri yolu ile çalışma işlevleri (yazılım uygulaması) ve PCF8574 yongasını kontrol etme işlevleri ile desteklenmesine karar verildi. Özetle, modülün nasıl çalıştığı. Bayt çıkışını paralel olarak yapmak için bunun için mikro devrenin adresini I2C veriyoluna göndermeniz gerekir (varsayılan olarak 0x4E'dir. Adresi, kart üzerindeki jumperları lehimleyerek ve en az üçünün değerini değiştirerek de değiştirebilirsiniz. adresin önemli basamakları), ardından ACK alındıktan sonra bir veri baytı gönderilir. Çip, ACK ile yanıt verdikten sonra, çipin paralel bağlantı noktasında bayt görünür. LCD'yi kontrol etmek için fonksiyonları axlib kitaplığından aldım ve I2C veri yolu ile çalışmak için biraz elden geçirdim. #Dahil etmek #Dahil etmek #Dahil etmek #Dahil etmek #define 0x4E EKLE // Çip adresi /* LCD Çip RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 Arka ışık P3 pinine bağlı. 1 açık, 0 kapalı */ // Veri çıkışı com |= 0x04; // E'den bire pcf8574_byte_out(com, ADD); // Veri çıkışı com &= 0xFB; // E'den sıfıra pcf8574_byte_out(com, ADD); // Veri çıkışı) geçersiz init(void) ( _delay_ms(30); com(0x30); _delay_us(40); com(0x30); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x30); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x20); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x20); // Seçenekleri ayarla com(0x80); // Seçenekleri ayarla com(0x00); // Ekranı kapat com(0x80); // Ekranı kapat com(0x00); // Ekranı temizle com(0x10); // Ekranı temizle com(0x00); com(0x60); // Giriş modunu ayarla com(0x00); com(0xC0); // Seçilen imleç ile ekranı aç) void char_out(BYTE verisi) ( BYTE data_h = ((veri & 0xF0) + 0x09); BYTE data_l = ((veri // yüksek 4 bit veri_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Yüksek 4 bit iletin // Yüksek 4 bit iletin // Düşük 4 bit iletin // Düşük 4 bit iletin // Düşük 4 bit iletin) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" ); süre(1) ( ) ) Burada tam olarak ne oluyor. İlk olarak, I2C ve PCF8574 için kitaplıkları dahil ediyoruz. I2C hakkında zaten yazdım, bu yüzden bir daha çarmıha germeyeceğim, ancak size PCF8574.h'de ne olduğunu anlatacağım. Kütüphane sadece üç fonksiyon 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, bir cihazın veri yolunda olup olmadığını kontrol etmek için yazılmıştır. Prensip olarak, veri yolunda bulunan herhangi bir cihazı aramak için kullanılabilir. Fonksiyon istenilen cihazın adresini alır ve cevap verirse sıfır döndürür. Bu adrese sahip cihaz bus'ta değilse bir tane döndürür.
BYTE pcf8574_byte_out(BYTE verisi, BYTE ekle) ( BYTE ask = ACK; ekle &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(veri); i2c_stop(); dönüş sor; ) Bu işlev, yalnızca bu çip için zaten keskinleştirilmiştir. Argüman olarak, veri yoluna ve mikro devrenin adresine iletilmek üzere bir bayt iletilir. İşlev önce adresteki çipi sorgulayacak ve ardından bir bayt gönderecektir. Çip baytı aldı ve bir ACK ile yanıt verdiyse, işlev çipi sonlandıracak ve başarılı bir bayt olarak sıfır döndürecektir. Ve şu anda mikro devre bu baytı paralel portuna çıkaracaktır. Aksi takdirde, NACK alırız ve bir tane döndürürüz, transfer başarısız olur.
BYTE pcf8574_str_out(BYTE *veri, BYTE sütunu, BYTE ekle) ( BYTE ask = ACK; ekle &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Bu özellik deneme amaçlı oluşturulmuştur. Bir baytlık veri dizisine, bu baytların sayısına ve çip adresine bir işaretçi alır. Aslında, oturum başına bir bayt değil, tüm verileri tek bir oturumda aktarma girişimi. İşlev çalışıyor, ancak LCD ekrana sığmadı. Şimdi ana programa dönelim. Kütüphaneleri bağladıktan sonra, mikro devrenin adresini yazıyoruz. Daha sonra lcd.h ile benzetme yaparak üç fonksiyon oluşturuyoruz. Fark sadece veri iletimi ilkesindedir.
void com(BYTE com) ( com |= 0x08; // P3'ten bire, böylece arka ışık açık pcf8574_byte_out(com, ADD); // Veri çıkışı com |= 0x04; // E'den bire pcf8574_byte_out(com, ADD); // Veri çıkışı com &= 0xFB; // E'den sıfıra pcf8574_byte_out(com, ADD); // Veri çıkışı } Bu fonksiyon sadece ekrana komutlar gönderir. Bu nedenle, 0x08'den gelen komutun mantıksal olarak eklenmesiyle ilk satır ortaya çıktı. Bu byaka, baytları doğrudan LCD portuna değil, tekrarlayıcımız aracılığıyla iletmemiz nedeniyle gereklidir. Yani bir bayt gönderdiysek ve ardından sadece bir bit çıktı almamız gerekiyorsa, dilerseniz gerekli biti önceki bayta atayıp tekrar porta gönderin. Bu öyle bir donma. Üçüncü basamakta kalıcı olarak tutmak için 0x08 ile toplama gereklidir. Arka ışığı hatırlıyor musun? Arka ışığı açan bu ektir. Bir baytın veriyoluna aktarılması işlevini çağırdıktan sonra. Yukarıda hakkında yazılmıştır. Ardından baytı bus üzerinden mikro devreye aktarıyoruz. Ardından, 0x04 ile bir baytın mantıksal olarak eklenmesinin gerçekte yaptığı şey olan E birimine ayarlamalısınız. E'yi sıfırladıktan sonra, herhangi bir komutu ekrana yalnızca komutun kendisini argüman olarak ileterek gönderebilirsiniz. geçersiz init(void) ( _delay_ms(30); // Güç açıldıktan sonra duraklat com(0x30); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x30); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x30); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x20); // 4 bit moduna geç _delay_us(40); // Komut yürütme gecikmesi com(0x20); // Seçenekleri ayarla com(0x80); // Seçenekleri ayarla com(0x00); // Ekranı kapat com(0x80); // Ekranı kapat com(0x00); // Ekranı temizle com(0x10); // Ekranı temizle com(0x00); // Giriş modunu ayarla com(0x60); // Giriş modunu ayarla com(0x00); // Seçilen imleç ile ekranı aç com(0xC0); // Seçilen imleç ile ekranı aç } Bu işlev yalnızca ekranın başlatılmasıyla ilgilidir. Komutların sırası, LCD ekrandaki veri sayfasından alınır. void char_out(BYTE verisi) ( BYTE data_h = ((veri & 0xF0) + 0x09); BYTE data_l = ((veri // yüksek 4 bit veri_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Yüksek 4 bit iletin data_h &= 0xF9; pcf8574_byte_out(veri_h, ADD); // Yüksek 4 bit iletin pcf8574_byte_out(veri_l, ADD); // Düşük 4 bit iletin data_l |= 0x04; pcf8574_byte_out(veri_l, ADD); // Düşük 4 bit iletin data_l &= 0xF9; pcf8574_byte_out(veri_l, ADD); // Düşük 4 bit iletin } Bu işlev, verileri LCD'ye gönderir. Komutlarla aynı şekilde gerçekleştirilir, ancak bir bayt iletiminin önce yüksek, sonra da düşük olanla gitmesi dışında. Ve geri kalanı aynı. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) Eh, bu işlev yalnızca ekrana bir dize geçirmek içindir. Aslında konumuzla alakası yok.

AtmelStudio 6.2 için Proje

Yetkili 01.08.15 17:11

Virgül eksik. Doğru: "MERHABA DÜNYA!" Ve bu cihaz sadece HD44780 için keskinleştirilmemiştir. Pull-up dirençleri master'ın yanına yerleştirilmiştir. Spesifikasyona göre, veriler LCD kontrol cihazına azalan E ile yazılır. Buradan 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 ) Evet ve geri kalanı da önemli ölçüde daha az olabilir. Örneğin, void char_out(BYTE data) yalnızca iki çağrı olacaktır ve dahası ek değişkenler olmadan olacaktır. LCD başlatma, zamanlama spesifikasyonunun ihlaliyle gerçekleştirildi.

Alexey 02.08.15 19:11

Virgül olmaması nedeniyle, ekran zarar görmez. Bu cihaz, özellikle bu veya benzeri bir denetleyiciye sahip ekranlar için tasarlanmıştır. Ama gerçekten basit bir port genişletici olan mikro devredir. E konusunda katılıyorum Ek değişkenlere ihtiyaç vardır. Bir fonksiyona bir argüman iletirseniz ve mantık ile bazı işlemler gerçekleştirirseniz, aksaklıklar meydana gelebilir. Bununla zaten karşılaştım. Başlatma, zamanlama ihlalleri olmadan gerçekleştirilir. Belgeler, komutlar arasında 40 µs'lik bir duraklama olduğunu söylüyor. Aktarımın, sırasıyla yazılım ve yavaş olan i2c veriyolu üzerinden gerçekleşmesi nedeniyle, süreler gereğinden fazla yerine getirilir. Çok tembel değilseniz, kendi versiyonunuzu yazıp bana gönderin. yayınlayacağım. Neticede bu site amatör bir izleyici kitlesine ve MK'nin hayatı için görüş ve vizyonunu ifade etmek isteyen herkese yöneliktir.

Alexey 06.08.15 09:14

Saygın "Yetkili" nin açıklamasıyla ekranı başlatırken zamanlamalar eklendi

Dmitry 14.06.16 21:57

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

Aleksey 14.06.16 22:32

Düşüneceğim.))

ruslan 21.12.16 19:54
Alexey 21.12.16 21:53

Ah evet. Özellikle asma'daki kod. Arduiners bunu sonuna kadar takdir edecek)))

Py.sy.
Asm'ye bakmasanız bile, orada program PIC kontrolörünün altına yazılır. Bu, AVR kullanıcıları için "çok" yararlı bilgiler mi? özellikle yeni başlayanlar için))) PIC'e karşı hiçbir şeyim yok, ancak PIC ve AVR'nin bile farklı asmları var. Ve LCD ekranın detaylarına gelince, bakabilirsiniz))) Doğru, CVAVR altında da yazdım, ancak tüm komutlar sıralandı ve sıralandı. Ancak her durumda, nerede daha net yazıldığına kendiniz karar verin))) Yazar yazar, okuyucu seçer.

GeK 04.01.17 12:52

"I2C çip adresi (varsayılan 0x4E'dir"

Adresin üst 4 biti sabittir,
PCF8574 öneki 0100 ve PCF8574A 0111'dir
Alttaki 3 bit, A2-A0 mikro devresinin girişlerinin durumuna bağlıdır. Varsayılan olarak, 3 atlama telinin tümü sırasıyla açıktır, mikro devrenin adresi 0111111'dir.
// 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 04.01.17 14:27

Bir şeyi karıştırdın.
Mikro devre için belgelerden alıntı

0b01001110 0x4E'dir
Yani her şey burada. Ve adresi değiştirmeniz gerekiyorsa, tanımlamada değiştirmeniz yeterlidir.

Yuri 14.12.17 21:26

İyi günler! Ayrıca PCF8574'teki adaptörle çalışmak için lcdgotoxy ve lcdclear fonksiyon kodunu da kullanabilirsiniz.

İskender 20.05.18 18:14

İyi günler! Rusça metni nasıl görüntülersiniz.

Alexey 20/05/18 23:04

Bu, MELT'in yerel bir ekranıdır. Hafızasına Kiril alfabesini dikti.

İskender 21.05.18 04:55

İyi günler! AtmelStudio 6.2 için Projede olduğu gibi yazıyorum "ЁPҐBET MҐP!" iyi çıktı
ve "HELLO DÜNYA!" yazarsanız her türlü saçmalığı ortaya çıkarır. iki taneye sahibim
birinde ekran varyantı Kiril dilinde dikilmiştir. ikinci Çinli.

Alexey 21/05/18 09:22

Önce bir test programı yazardım. Karakterlerin ve adreslerinin görüntülenmesiyle tüm belleğin numaralandırılması. Ve sonra sorunun ne olduğunu anlayın. Büyük olasılıkla karakter tablosu ascii tablosuyla eşleşmiyor.

Andrey 03.09.18 08:32

Tünaydın!

Proteus için bir şema yükleyemez misiniz?

Andrey 03.09.18 10:22

Yoksa Proteuse'da kimse kontrol etmedi mi?

Andrey 03.09.18 10:56

main_init'i çözdüm

Pavel 30.05.19 23:35

Merak edilen bir şey, ekran adresi 0x4E ve aynı ekran bir arduinoya bağlıysa, adres 0x27'dir.

Pavel 31/05/19 11:04

Çalışmanız için çok teşekkür ederim! İnternetin her yerine baktım ve yukarıdaki örneklerin hiçbiri sizinki dışında çalışmıyor. Tek şey, _delay_ gecikmelerinin, ekran başlatma işlevinde proje arşivinde kayıtlı olmaması ve buna göre çalışmamasıdır.

Alexey 01/06/19 09:52

Bu daha çok bir demo projesi. Temel olarak, axlib kitaplığını yeniden yazmanız gerekir, ancak STM32 ve STM8'in sıçramalar ve sınırlarla hareket ettiği gerçeği göz önüne alındığında, AVR'nin hiçbir anlamı yoktur.

Pavel 05.06.19 12:57

STM'de DIP paketleri yoktur, baskılı devre kartları yapmak daha zordur. Projelerim için AVR yetenekleri bir marjla yeterli, bir Atmega 8'e çok şey sığabilir

Alexey 05.06.19 15:20

Evet, ancak Atmega8 ve stm8s003'ün maliyeti nedir)))

Dmitry 06/07/19 00:41

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

Dmitry 07.06.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 adres)
{
uint8_t sor = ACK;
adres |= 0b01; //OKUMAN
uint8_tdata=0;
i2c_start();
sor = i2c_send_byte(addr);
if(!ask) veri = i2c_read_byte(NACK);
i2c_stop();

dönüş verileri;
}

Pavel 06/07/19 20:37

Genel olarak bir rölenin fiyatı için 150 rubleye mal olur), ancak STM için panoları nasıl üretirsiniz? LUT güvenilmez, CNC router ne alacağından emin değil (denemedi)

LCD ekran- arduino projelerinde sık sık misafir olur. Ancak karmaşık devrelerde, çok sayıda pimi olan bir kalkan bağlama ihtiyacından dolayı Arduino portlarının eksikliği sorunu yaşayabiliriz. Bu durumda çıkış yolu olabilir I2C/IIC Neredeyse standart bir Arduino 1602 kalkanını sadece 4 pinli Uno, Nano veya Mega kartlara bağlayan bir adaptör. Bu yazımızda, bir I2C arayüzü ile bir LCD ekranı nasıl bağlayabileceğinizi, hangi kütüphaneleri kullanabileceğinizi, kısa bir eskiz örneği yazacağınızı ve tipik hataları analiz edeceğiz.

Sıvı kristal ekran LCD 1602çeşitli projelerde karakter dizilerinin çıktısını almak için iyi bir seçimdir. Ucuzdur, farklı arka ışık renkleri ile çeşitli modifikasyonlar vardır, Arduino eskizleri için hazır kütüphaneleri kolayca indirebilirsiniz. Ancak bu ekranın en büyük dezavantajı, ekranın en az 6 tanesinin gerekli olduğu 16 dijital pime sahip olmasıdır.Dolayısıyla bu LCD ekranın i2c olmadan kullanılması Arduino Uno veya Nano kartlar için ciddi sınırlamalar getirir. Yeterli kişi yoksa, bir Arduino Mega kartı satın almanız veya ekranı i2c üzerinden bağlamak da dahil olmak üzere kişileri kaydetmeniz gerekecektir.

LCD 1602 pinlerinin kısa açıklaması

LCD1602 pinlerine daha yakından bakalım:

Sonuçların her birinin amacı vardır:

  1. Zemin GND;
  2. Güç kaynağı 5 V;
  3. Monitör kontrastını ayarlama;
  4. Komut, veri;
  5. Veri yazma ve okuma;
  6. etkinleştirme;

7-14. Veri hatları;

  1. Artı arka ışık;
  2. Eksi arka ışık.

Ekran özellikleri:

  • Sembolik gösterim tipi, sembol yüklemek mümkündür;
  • LED ışıklar;
  • Denetleyici HD44780;
  • Besleme gerilimi 5V;
  • 16x2 karakterleri biçimlendirin;
  • -20C ile +70C arasında çalışma sıcaklığı aralığı, -30C ile +80C arasında depolama sıcaklığı aralığı;
  • Görüş açısı 180 derece.

i2C'siz LCD'den Arduino kartına bağlantı şeması

Bir monitörü doğrudan I2C'siz bir Arduino mikro denetleyicisine bağlamak için standart şema aşağıdaki gibidir.

Bağlanacak kontakların çok sayıda olması nedeniyle gerekli elemanları bağlamak için yeterli alan olmayabilir. I2C kullanmak, kablo sayısını 4'e ve meşgul pin sayısını 2'ye düşürür.

Arduino için LCD ekranlar ve kalkanlar nereden satın alınır?

LCD ekran 1602 (ve 2004 versiyonu) oldukça popülerdir, bu nedenle hem yerel çevrimiçi mağazalarda hem de yabancı sitelerde kolayca bulabilirsiniz. İşte en uygun seçeneklere bazı bağlantılar:

Arduino ile uyumlu LCD1602+I2C mavi ekran modülü Basit LCD1602 ekran (yeşil arka ışık) 80 rubleden daha ucuz Arduino için I2C HD44780 ile geniş ekran LCD2004 (mavi ve yeşil arka ışık)
1602'yi IIC adaptörü ve mavi arka aydınlatmalı ekran LCD1602'nin lehimli bir I2C modülüne sahip başka bir versiyonu Arduino ile Uyumlu 1602 Shield için Port IIC/I2C/TWI/SPI Adaptör Modülü
RGB arkadan aydınlatmalı ekran! Arduino için LCD 16×2 + tuş takımı + Buzzer Shield Arduino için butonlu ve ekranlı kalkan LCD1602 LCD 1602 3D yazıcı için LCD ekran (RAMPS 1.4 için Smart Controller, Text LCD 20×4), SD ve MicroSD kart okuyucu modülü

I2C protokolünün açıklaması

Bir ekranı bir i2c adaptörü aracılığıyla bir arduinoya bağlamayı tartışmadan önce, kısaca i2C protokolünün kendisinden bahsedelim.

I2C / IIC(Inter-Integrated Circuit), orijinal olarak bir elektronik cihaz içindeki tümleşik devreleri birbirine bağlamak için oluşturulmuş bir protokoldür. Geliştirme Philips'e aittir. i2c protokolü, kontrol elektroniğindeki blokları bağlamak için gerekli olan 8 bitlik bir bus ve aynı kablolar üzerinden birkaç cihazla iletişim kurabileceğiniz bir adresleme sisteminin kullanımına dayanmaktadır. Veri paketlerine istenen öğenin tanımlayıcısını ekleyerek verileri bir veya başka bir cihaza aktarıyoruz.

En basit I2C devresi, bir ana (çoğunlukla bir Arduino mikro denetleyicisi) ve birkaç bağımlı (örneğin bir LCD ekran) içerebilir. Her cihazın 7 ila 127 aralığında bir adresi vardır. Aynı şemada aynı adrese sahip iki cihaz olmamalıdır.

Arduino kartı, donanımda i2c'yi destekler. Bu protokolü kullanarak cihazları bağlamak için A4 ve A5 pinlerini kullanabilirsiniz.

I2C ile çalışmanın birkaç avantajı vardır:

  • Çalışma için sadece 2 hat gereklidir - SDA (veri hattı) ve SCL (saat hattı).
  • Çok sayıda önde gelen cihazın bağlantısı.
  • Geliştirme süresini azaltmak.
  • Tüm cihaz setini kontrol etmek için sadece bir mikrodenetleyici gereklidir.
  • Bir veriyoluna bağlı olası mikro devre sayısı yalnızca maksimum kapasite ile sınırlıdır.
  • Devrelere yerleştirilmiş özel bir aşırı gerilim bastırma filtresi sayesinde yüksek düzeyde veri güvenliği.
  • Ortaya çıkan arızaları teşhis etmek için basit prosedür, hızlı sorun giderme.
  • Veri yolu zaten Arduino'nun kendisine entegre edilmiştir, bu nedenle ek bir veri yolu arayüzü geliştirmeye gerek yoktur.

Kusurlar:

  • Hat üzerinde kapasitif bir sınır var - 400 pF.
  • Veri yolunda birkaç farklı cihaz varsa I2C kontrolörünü programlama zorluğu.
  • Çok sayıda cihazla, bunlardan biri yanlış bir şekilde düşük seviye durumu ayarlarsa bir arızanın yerini tespit etmek zorlaşır.

LCD 1602 Arduino için i2c modülü

Arduino'da bir i2c ekranı kullanmanın en hızlı ve en uygun yolu, yerleşik protokol desteğine sahip hazır bir ekran satın almaktır. Ama bu ekranlar çok fazla değil ve ucuz değiller. Ancak çok sayıda çeşitli standart ekran zaten piyasaya sürüldü. Bu nedenle, bugün en uygun fiyatlı ve popüler seçenek, şuna benzeyen bir adaptör olan ayrı bir I2C modülü satın almak ve kullanmaktır:

Modülün bir tarafında, veri aktarımı için toprak, güç ve 2 i2c pinlerini görüyoruz. Diğer adaptörde harici güç konektörlerini görüyoruz. Ve elbette, kartın üzerinde modülün standart ekran pimlerine lehimlendiği birçok pim var.


Arduino kartına bağlanmak için I2c çıkışları kullanılır. Gerekirse, aydınlatma için harici bir güç kaynağı bağlayın. Yerleşik düzeltici ile ayarlanabilir kontrast değerlerini ayarlayabiliriz J

Piyasada, önceden lehimlenmiş adaptörlere sahip LCD 1602 modüllerini bulabilirsiniz, kullanımları maksimum düzeyde basitleştirilmiştir. Ayrı bir adaptör satın aldıysanız, modüle önceden lehimlemeniz gerekecektir.

LCD ekranı I2C ile Arduino'ya bağlama

Bağlanmak için Arduino kartının kendisine, bir ekrana, bir devre tahtasına, bağlantı kablolarına ve bir potansiyometreye ihtiyacınız var.

Özel bir ayrı i2c adaptörü kullanıyorsanız, önce onu ekran modülüne lehimlemeniz gerekir. Orada bir hata yapmak zordur, böyle bir şema tarafından yönlendirilebilirsiniz.


i2c özellikli bir LCD monitör, dört kablo kullanılarak karta bağlanır - iki kablo veri için, iki kablo güç için.

  • GND pini kart üzerindeki GND'ye bağlanır.
  • VCC pini 5V'dir.
  • SCL, A5 pinine bağlanır.
  • SDA, A pinine bağlanır.

Ve hepsi bu! Kafanın karışması çok kolay olan tel örümcek ağı yok. Aynı zamanda, i2C protokolünün uygulanmasının tüm karmaşıklığını kütüphanelere emanet edebiliriz.

i2c LCD ekranla çalışmak için kitaplıklar

Arduino'yu LCD 1602 ile I2C veri yolu üzerinden arayüzlemek için en az iki kütüphaneye ihtiyacınız olacak:

  • I2C ile çalışmak için Wire.h kitaplığı, standart Arduino IDE programında zaten mevcuttur.
  • Monitörü I2C veri yolu üzerinden kontrol etmek için çok çeşitli komutlar içeren LiquidCrystal_I2C.h kitaplığı, çizimi daha kolay ve daha kısa yapmanızı sağlar. Ek olarak kitaplığı yüklemeniz gerekir Ekranı bağladıktan sonra, LiquidCrystal_I2C.h kitaplığını ek olarak kurmanız gerekir.

Gerekli tüm kütüphaneleri krokiye bağladıktan sonra bir nesne oluşturuyoruz ve tüm fonksiyonlarını kullanabiliyoruz. Test için örnekten aşağıdaki standart çizimi yükleyelim.

#Dahil etmek #Dahil etmek // Kitaplık bağlantısı //#include // LiquidCrystal_I2C alternatif kütüphanesini bağlama lcd(0x27,16,2); // I2C adresini (en yaygın değer) ve ekran parametrelerini (LCD 1602 durumunda - her biri 16 karakterlik 2 satır //LiquidCrystal_PCF8574 lcd(0x27); // PCF8574 kitaplığı void kurulumu için değişken( ) ( lcd.init (); // Ekranı başlat lcd.backlight(); // Arka ışığı bağlayın lcd.setCursor(0,0); // İmleci ilk satırın başına ayarlayın lcd.print(" Hello"); // Metni ilk satıra yazın lcd.setCursor(0,1); // İmleci ikinci satırın başına getirin lcd.print("ArduinoMaster"); // İkinci satıra metin yazın ) boşluk döngüsü() ( )

LiquidCrystal_I2C kitaplığının işlevlerinin ve yöntemlerinin açıklaması:

  • home() ve clear() - ilk işlev, imleci ekranın başına döndürmenize izin verir, ikincisi de, ancak aynı zamanda daha önce monitörde olan her şeyi siler.
  • write(ch) - ekrana tek bir ch karakteri yazdırmanıza izin verir.
  • imleç() ve noCursor() - imleci ekranda göster/gizle.
  • yanıp sönme() ve noBlink() - imleç yanıp söner/yanıp sönmez (eğer ekranı daha önce etkinleştirilmişse).
  • display() ve noDisplay() - ekranı etkinleştirmenizi/devre dışı bırakmanızı sağlar.
  • scrollDisplayLeft() ve scrollDisplayRight() - ekranı bir karakter sola/sağa kaydırır.
  • autoscroll() ve noAutoscroll() - otomatik kaydırma modunu etkinleştirmenizi/devre dışı bırakmanızı sağlar. Bu modda, her yeni karakter aynı yere yazılır ve ekranda daha önce yazılanların yerine yazılır.
  • leftToRight() ve rightToLeft() - Görüntülenen metnin yönünü ayarlar - soldan sağa veya sağdan sola.
  • createChar(ch, bitmap) - Siyah beyaz noktalar oluşturmak için bir dizi bitmap bitmap kullanarak ch (0 - 7) kodlu bir karakter oluşturur.

i2c ekranıyla çalışmak için alternatif kitaplık

Bazı durumlarda, belirtilen kitaplığı PCF8574 kontrolörleri ile donatılmış cihazlarla kullanırken hatalar meydana gelebilir. Bu durumda LiquidCrystal_PCF8574.h kitaplığı alternatif olarak sunulabilir. LiquidCrystal_I2C'yi genişletir, bu nedenle onu kullanırken herhangi bir sorun olmamalıdır.

i2c lcd ekran bağlantı sorunları

Krokiyi yükledikten sonra ekranda hiçbir şey görmüyorsanız aşağıdaki adımları deneyin.

İlk olarak, monitörün kontrastını artırabilir veya azaltabilirsiniz. Kontrast ve arka ışık modu nedeniyle karakterler genellikle görünmez.

Bu işe yaramazsa, arka ışığın açık olup olmadığını, kontakların doğru bağlantısını kontrol edin. Ayrı bir i2c adaptörü kullandıysanız, kontakların lehimleme kalitesini tekrar kontrol edin.

Ekranda yazı olmamasının bir diğer yaygın nedeni de yanlış i2c adresi olabilir. Önce çizimdeki cihaz adresini 0x27 0x20'den 0x3F'ye değiştirmeyi deneyin. Farklı üreticilerin farklı varsayılan adresleri olabilir. Bu işe yaramazsa, bağlı tüm cihazları tarayan ve adreslerini kaba kuvvetle belirleyen i2c tarayıcı taslağını çalıştırabilirsiniz. Bir i2c tarayıcının örnek bir taslağı.

Ekran hala çalışmıyorsa, adaptörü lehimlemeyi ve LCD'yi normal şekilde bağlamayı deneyin.

Çözüm

Bu yazıda, karta boş pin kaydetmemiz gerektiğinde, karmaşık Arduino projelerinde LCD ekranı kullanmanın ana konularını ele aldık. Basit ve ucuz bir i2c adaptörü, yalnızca 2 analog pin içeren bir 1602 LCD ekranı bağlamanıza izin verecektir. Birçok durumda bu çok önemli olabilir. Kolaylık için fiyat, ek bir modül kullanma ihtiyacıdır - bir dönüştürücü ve bir kitaplık. Kanaatimizce bu kolaylık olması açısından yüksek bir fiyat değil ve bu özelliğin projelerde kullanılmasını şiddetle tavsiye ediyoruz.