74HC595 ile karakter LCD kontrolünü, nasıl yapabiliriz?
Bu entegre zaten 7 segment displaylerde çok kullanılır. Bu entegre ile 3 kablo kullanarak 8 bitlik bir çıkış elde edilir. Bu çıkışlar bir LCD ye bağlanırsa basit bir şekilde LCD kontrolü de yapılabiliyor.
Basit bir şekilde yapılmış programlara rastladım. Tabii ki Kütüphanesiz olarak. Ayrıca kütüphaneli olan 1 çalışma daha var. Linkini yazının sonuna ekledim.
Fakat kütüphane sadece Arduino için. Şayet kütüphanesiz olarak kullanırsanız, hem çalışmasını anlamış olursunuz, hem de tüm mikrokontrolcülerle kullanabilirsiniz.
Nereden aklına geldi derseniz. İhtiyaçtan diyebilirim.
ESP01 ve 8 bacaklı entegreler ile LCD display kullanmak için bunu yapabilir miyim diye düşündüm ve gerçekleştirmeye başladım.
EASYLCD seri port üzerinden tek kablo ile zaten bu işi yapıyor. DOĞRUDUR.
Fakat EASYLCD bu işi programlı entegre ile yaptığından PAHALI oluyor.
Tabii ki bunun için I2C kullanan modüller de var. 74HC595 entegresi 2-3TL iken I2C modüller bu zamanda 13TL den başlayıp yükseliyor.
Bir de entegre devrenin arkaya monte edilmesi daha kolay olacaktır. Bununla birlikte I2C haberleşme özelliği olmayan bir entegre ile çalışıyorsanız, bir de yazılımsal I2C kullanmak gerekecektir. Bu da zor olacaktır. Dijital olarak pimlerle çalışmak KOLAYDIR.
Bütün bunların yanı sıra pratik olması açısından I2C lcd modüller çok kullanılmakta. Sadece kütüphanede bize sunulan komutları kullanarak çalışabiliyoruz. Tabii ki bazı işler için yeterli olacaktır.
Fakat LCD çalışmasını öğrenerek kendi programlarımızı KÜTÜPHANE olmadan yazabiliriz.
Öncelikle HD44780 uyumlu LCD display modüllerinin nasıl çalıştığına bakalım.
LCD modül 8 data biti ve 3 kontrol biti ile dijital haberleşme kullanır. Yani DATA bilgisini 8 data pimine verirsiniz. Bu data bilgisi girişinde dururken RS ucunu LOW, RW ucunu LOW ve Enable ucunu önce HIGH sonra LOW yaparak bilgiyi modülün içine alırsınız. (4 Bitlik çalışma da yapılmaktadır. Ben de bu programda 4 Bit olarak çalışmayı kullandım.
Burada 2 seçeneğiniz var. Ya işlemin bitmesi için verilen gecikme süresi kadar beklersiniz.(Programda komut gönderdikten sonra delay komutu kullanırsınız. Bu gecikme 40us ile 1.64ms arasında değişir. Genelde 70us yeterli olacaktır. Özel durumlar hariç. )
Ya da BUSY flag denilen D7 bitini kontrol edersiniz. (I2C ve diğer LCD Kütüphanelerini incelemediğim için busy flag kontrol ediliyor mu bilemem.)
Fakat ben sadece EASYLCD modülünü programlarken kullandım. Çoğu zaman sadece gecikme vererek bunu hallettim. LCD 8 bit çalışabildiği gibi 4 bit modunda da çalışıyor. Bilgiler 1 byte=8 bit olarak geldiğinden 4 Bit modda 2 kere 4 bit verilerek daha az pim kullanılarak çalışma sağlanır.
Benim yaptığım program da 4 Bit modda yapılmıştır.
Modül içerisinde 2 adet hafıza mevcut. Bir tanesi DDRAM bir tanesi ise CGRAM
DDRAM anlık olarak seçilebilen 80 karakterlik bir yerdir. Toplam 80 karakteriniz var. Bu 80 karakteri 4 satıra kadar kullanabilirsiniz.
LCD ler 1 x16, 1×20, 2×16, 2×20, 4×16 ve 4×20 gibi isimlerle anılır. Bu demek değildir ki 1×16 ekran 16 karakter alıyor.
DDRAM 80 karakterlik adrese sahiptir. 80 karakter yazabilirsiniz. Fakat ilk etapta 16 karakterlik ekranı görebilirsiniz. Ekranı sola ve sağa kaydırarak tüm DDRAM adresindeki bilgileri 16 karakterlik alanda görebilirsiniz. ( LCD DDRAM adresleri için bu sayfaya bakabilirsiniz. )
Şöyle düşünebilirsiniz.
Bu resimdeki gibi 16 ya da 20 karakterlik pencereyi sola ve sağa kaydırarak görünen kısmı değiştirebilirsiniz. LCD modülde bu şekilde bir çalışma vardır.
Bir de CGRAM dan bahsedelim. Bu bölümde hazır karakterler tutuluyor. ASCII karakter kodlamasına uygun bir şekilde dizilmiştir. Bu karakterleri direkt ASCII kodu vererek DDRAM üzerine yazıyorsunuz ve bu ascii kodlar, ekrana CGRAM üzerinden çağrılarak gelir. Bizler CGRAM da kısıtlı hareketler yapabiliyoruz. Sadece yeni karakter için ayrılan 8 karakterlik bölüme yeni karakterlerimizi yerleştirebiliriz. Bu karakterleri ise 0-7 olarak DDRAM üzerine yerleştirdiğimizde ekrana yansırken CGRAM üzerindeki ilgili yeni karakter yazılır.
Burada kriter şudur. 5×8 font kullanılırsa 8 yeni karakter yazılabilir. 5×10 font kullanılırsa 4 yeni karakter yazılabilir.
DDRAM adreslemesi 80h adresinden başlar. CGRAM adresi ise 40h tan başlar.
Yeni karakter yazmak istediğinizde başlangıç adresi tabloda 00h olarak gösterilen yer 40h olarak değerlendirilir. Bu şekilde bir font oluşturulduğunda 8 byte lık yer kaplar.
40h,41h,42h,43h,44h,45h,46h,47h olarak 1 tane karakteri kapsar. Bir sonraki karakter ise 48h tan başlar ve 8 byte lık yer ayrılır.
Bu düzen içerisinde başlangıç adresi ve 8 byte bilgiyi verdiğimizde yeni karakteri oluştururuz.
Bu 8 byte bilgi, resmin sağ tarafındaki HEX sayılardır. Yukarıdan aşağı doğru parametre olarak verilecektir. Bazı programlar HEX sayılar ve Decimal sayı olarak verir. Decimal sayılarıda kullanabilirsiniz.
Bu 8 byte bilgiyi internette çok kullanılan karakter jeneratör programları size verebilir.
Bu adresten faydalanabilirsiniz. https://maxpromer.github.io/LCD-Character-Creator/
Yukarıdaki A00 ve A02 modellerinin farkı, ASCII 128 ve sonrası karakterleri gösteren yerde A00’ın Çin karakterlerine yer vermesi. Piyasada daha çok Çin üretimi LCD ler olduğundan Çin karakterli A00 modeli vardır. Şayet A02 modelini bulabilirseniz bazı faydalı karakterlerin hazır olduğunu görebilirsiniz.
DDRAM adresi 80h tan başlar ve bir yere kadar düzenli artarak gider. Buna dikkat etmeniz gerekir.
Sebep ise DDRAM düzenlenirken 2×40 olarak dizayn edilmiş. Aşağıdaki resimde olduğu gibi 00h ve 40h tan başlar. Bu adresler 7 bitlik adreslemedir. Yüksek taraftaki 8. bit 1 olduğundan ilk başlangıç
B0000000 7 bit olarak 00h adresine karşılık gelir. Fakat DDRAM adresinde en soldaki bit 1 olduğundan B10000000 8 bit =1 byte olarak yazmamız gerekiyor. Bu da 80h adresine karşılık gelir.
2. Satır ise 40h adresi olmasına rağmen 8. Bit 1 olduğundan C0h adresine karşılık gelir.
4×20 olarak bakarsak da, 1. Satır 80h, 2. Satır C0h, 3. Satır 94h 4. Satır ise D4 adresinden başlar.
Yaptığım programda SENDSTRING alt programında bunu görebilirsiniz.
4 x 20 satır LCD lerde 1. satır ve 3. satır birbirinin devamıdır. 2 ve 4. satırlar birbirinin devamıdır. Ekran sağa ve sola kaydırıldığında, 4. satırda kaybolan karakter, 2. satırda görünmeye başlar.
3. satırda kaybolan karakter, 1. satırda görünmeye başlar.
Zaten adreslemeye bakarsanız da bunu birbirinin devamı olarak görebilirsiniz. Videoda bunu görebilirsiniz.
Yukarıdaki tabloda komutların ayrılması için her komutun başlangıç yerine 1 verildiğini görebilirsiniz.
DDRAM adreslemesi de 1+7 bit olarak verilir. Bu sadece adreslemedir. İçerisine yazacağınız ASCII kodu ise 8 bitlik yani 1 byte lık bilgidir ve 255 karaktere kadar yazılabilir. CGRAM tablosundaki 128. Karakter ve sonrası da bu şekilde kullanılabilir.
Gelelim bu adreslemeyi nasıl vereceğimize.
Öncelikle hangi adrese vereceğimiz bildiririz. DDRAM içerisindeki adres olarak bakmadan satır ve sütun olarak belirtip bu adreslemeyi yapacağız. Program içerisinde sat ve sut değişkenleri bu satır ve sütun bilgisini tutar. Bu değerlere göre program hangi DDRAM adresini kast ettiğimizi anlar ve o DDRAM adresine bilgi yazacağımızı bildirir. Burada SENDCODE alt programı kullanılır.
Mantık şudur.
DDRAM adres bilgisini yolla. SENDCODE ile (cursor bu adrese otomatik olarak konumlanır. )
Yazmak istediğimiz karakterin ASCII kodunu WRITECHAR ile göndeririz. ( LCD modül bu ascii karaktere karşılık gelen karakteri CGRAM içerisinden bulur ve ekrana yazar.)
Bu kadar basit bir işlemdir. Bu kadar adres bilgisini aklımda nasıl tutarım demenize gerek yok. Siz sadece istediğiniz satır ve sütun numarasını seçtikten sonra, basit bir hesaplama kısmıyla istediğiniz DDRAM adresi hesaplanacaktır.
Bir de ASCİİ kodunu bulup da bunu mu yollayacağım derseniz. Buna gerek yok. Siz “A” karakterini yazdığınızda o zaten karşı tarafa “A” olarak gitmez. 1 byte lık karşılığı gideceğinden, özel bir hesap yapmanıza gerek kalmaz. “A” yazdığınızda karşılık B01000001 olarak yazılır.
LCD modül başlatılırken INITIALIZE denilen başlangıç hazırlıkları yapılmalıdır.
Bu hazırlıklar SETUP alt programında INITIALIZE bölümünde mevcuttur.
temp1=0x30;timesay=5000;sendcode(0);// 8 bit 5×8 font 1 satır seçimi yapılır. (Normalde 4 bit ile çalışacağız ama bunu göndermemiz gerek ve sonrasında 4 bit kısmını seçeceğiz.
temp1=0x30;timesay=200;sendcode(0); // 8 bit 5×8 font 1 satır seçildi.
temp1=0x30;timesay=200;sendcode(0);// 8 bit 5×8 font 1 satır seçildi
temp1=0x20;timesay=200;sendcode(0); // 4 bit 5×8 1 satır seçildi
temp1=0x28;timesay=200;sendcode(1); //4 bit 5×8 font 2 satır seçildi.
temp1=0x08;timesay=200;sendcode(1);// Disp on off control hepsi OFF
temp1=0x01;timesay=200;sendcode(1);// Disp clear
temp1=0x06;timesay=200;sendcode(1);// Display shift OFF İncrement adres counter ***
temp1=0x0F;timesay=200;sendcode(1);// Display ON OFF kontrol= Display ON,CURSOR ON, BLINK ON. ( Cursor BLINK on olduğunda Cursor şekli kutu şeklindedir. BLINK OFF yapıldığında cursor alt çizgi şeklinde görünür. C=1 olduğunda cursor görünür. 0 olduğunda CURSOR görünmez. D=1 display ON demektir. D=0 olduğunda Display OFF olur. Ekran kapatıldığında ekrandaki karakterler görünmez hale gelir. Fakat silinmez. ON duruma geldiğinde karakterlerin yerlerinde olduğunu görürsünüz. )
INITIALIZE bitmiştir. Artık ekranda 1. Satır ve 1. Sütunda cursorun yandığını görebilirsiniz.
*** işaretli yerde increment kelimesi kullanıldı. Bunun anlamı ise bir karakter yaz. Cursoru sağda bir sonraki sütuna götür demektir. Şayet satır ve sütun belirtmezseniz karakter cursorun bulunduğu yere yazılır ve bir sonraki sütuna geçilir.
Bunun tam tersi de DECREMENT vardır. Bunu pek kullanmayız. Fakat gerekli olduğu yerde bunu da kullanabilirsiniz. Bu da ters yazı yazma işlemidir. Aşağıdaki ekran görüntüleri increment ve decrement örnekleridir.
Not: Animasyon alt programı bu komutların nasıl uygulandığını gösteriyor.
INIT yaparken 2 lines ( satır olarak seçtim.) Fakat bu sadece 1 ya da 2 seçilebildiği içindir. Biz 4 satırlık ekrana sahibiz. Diye düşünüyorsanız, 2×40 olan satır sayısını 1×20,1×20,1×20,1×20 olarak paylaştırıyoruz. Yukarıda DDRAM satır adreslerini vermiştim. Bu şekilde başlangıç satırlarını ayarlayıp yazdırabiliyorsunuz. Aynı zamanda 5×8 font istedim. 5×10 olsaydı 2 satır 1 karakter alacaktı. Bu şekilde olduğunda 2 satır seçmemiz mümkün olmayacaktı.
Size örnek verdiğim programda 74HC595 ile bilgi okumak mümkün olmadığı için, READ kısmına değinmedim. Fakat Arduino ile direkt LCD kontrol etmek isterseniz, Busy flag denilen D7 bitini okuma işlemini programa ekleyebilirsiniz.
SETTING tablosunda, cursor or display shift bölümünde S/C ve R/L kısımlarını ayarlayarak, isterseniz ekran kaydırma, isterseniz Cursor kaydırma yapabilirsiniz. S/C = Screen/Cursor olarak düşünün. 1 olduğunda ekran, 0 olduğunda cursor kaydırılacaktır.
R/L= right/Left olarak düşünüyoruz. 1 olduğunda Sağa, 0 olduğunda sola kayma sağlanacaktır.
Tabii ki kullanmak için öncesinde D4 bitini de 1 yapmanız gerek. ( Animasyon alt programında var)
Buraya kadar LCD modülün çalışmasını anlatmaya çalıştım.
Şimdi de 74HC595 entegresine bakalım.
Bu entegreye ait DATASHEET buradadır.
Bu resimdeki gibi çalışması vardır. LATCH sinyali geldiğinde Giriş bilgisi çıkışa yansır.
Bu entegre 8 bit seri bilgiyi, 8 bit paralel çıkışa aktarır. Aynı zamanda 9. Pim deki Q7S çıkışı ile kaskat bağlama yapılabilir. Yani 8+8 bit olarak 2 entegreyi peşi sıra bağlayarak 16 bit işlem yapabilirsiniz.
Programda 74HC595 entegresine 1 byte lık seri bilgi aşağıdaki gibi gönderilir.
digitalWrite(LATCH, LOW); // ST_CP ucu LOW yapılır
shiftOut(DATA, CLOCK, MSBFIRST, temp2); // DATA ve CLOCK bilgisi seri olarak gönderilir ve 8 bit olarak 74HC595 tarafından alınır. DATA= DS pimidir. CLOCK=SH_CP pimidir.
digitalWrite(LATCH, HIGH); // ST_CP ucu HIGH yapılarak gelen bilginin paralel çıkışa yansıması sağlanır.
74HC595 ile LCD kontrolü, KÜTÜPHANESİZ olarak programda gösteriliyor.
Zaten benim yaptığım devre şemasına bakarsanız aynı anda hem UNO ile KÜTÜPHANESİZ, LCD kontrol ediliyor. Hem de KÜTÜPHANESİZ, 74HC595 ile LCD kontrol ediliyor.
Bundan dolayı program biraz uzun gibi görünse de, sadece gönderme alt programlarında fark var. Diğer program bölümleri ortaktır. Hangi kontrolü kullanmak isterseniz, diğerini silersiniz. Biraz daha sadeleşecektir.
Ayrıca program içerisinde Animasyon satırları da var. Bunlar da gerektiğinde silinecektir. Program daha da kısalacaktır. Animasyon kısmı komutları nasıl kullanabileceğinizi gösteriyor.
ESP01 modülü ile Arduino ide üzerinden programlayarak 74HC595 ile LCD kontrol programını kullanabilirsiniz. 3 adet pim gerekiyor. Bu pimler Tx, Rx, GPIO2 pimleri olacaktır. 1 tane GPIO-0 pimi boşta kalacak. Gerektiğinde kullanılabilir. Bu pim, aynı zamanda programlamada kullanıldığından, son çare olarak kullanmak istiyorum.
Bunun yanı sıra pim tasarrufu da yapabilirsiniz. 74HC595 ten gelen RW pimi, şayet LCD üzerinden bilgi okunmayacaksa, direkt olarak GND ye bağlanabilir. Zaten RW ucu ve LED aydınlatma dahil entegrenin 8 bitlik çıkışı ile rahatlıkla yapılıyor.
RW pimini GND ye bağlarsanız, geriye kalan 1 adet pimi başka işlerde kullanılabilir. Mesela alarm Led’i ya da rölesi için kullanılabilir.
Animasyon kısmında ise Normal LCD kütüphanesiyle yapabileceğiniz her şeyi nasıl yapabileceğinizi göstermeye çalıştım. Hangilerini isterseniz, programınızda kullanabilirsiniz. Hatta LCD aydınlatma Led’ini de kontrol edebiliyorsunuz.
Programın detaylarına bakalım.
Devre şemasından görüldüğü gibi sol tarafta 2, sağ tarafta 2 LCD var. Sağ taraftakiler direkt olarak Arduino uno tarafından kontrol edilen LCD lerdir.
Sol taraftakiler ise 74HC595 entegresiyle kullanılıyor. 74HC595 entegresinin girişleri ise, aynı UNO tarafından kontrol ediliyor. Sizler hangi çalışmayı, uygulamayı seçerseniz, diğerinin gönder kısmını silin yeter.
Ayrıca Arduino UNO programında direkt LCD kullanımında, PORT Manipulation özelliği kullanılıyor. Bu özellik port pimlerini, teker teker dijital çıkış olarak değil, PORT’a ait 8 bitin bir anda çıkışa ulaşmasını sağlar.
DDRD=B11111101; komutu PORT D çıkışı pimlerinin hangileri INPUT, hangileri OUTPUT olacak onu belirler. 1 olanlar OUTPUT, 0 olanlar ise INPUT olarak değerlendirilirler.
Bu setup alt programında ayarlandıktan sonra PORT D çıkışında OUTPUT olanlar hepsi birden çıkış portuna yansır. Digital Write komutu ile PİM bazında yapılan işlem, bu çalışmayla port bazında yapılır ve 8 bit hepsi birden çıkışa yansır. 0 olan bit Arduino UNO nun Rx girişidir. Bundan dolayı INPUT yapılmıştır.
Programda BİT olarak OR(VEYA) işlemi kullanılmıştır. Bu işlem ile çıkışta, HIGH olması gereken yere yere 1 verilir ve çıkış değişmeyecekse, 0 verilir.
PORTD|B00001000; // bu binary sayıda 3. bit 1 olmalı diye VEYA işlemi uygulanmıştır.
Bu VEYA işlemi, Lojik devre mantığından gelir. 2 girişten bir tanesi 1 ise çıkış 1 dir. Bundan dolayı 1 olması gereken yerde, VEYA işlemi kullanılır ve çıkış 1 yapılır. Diğer bitler değişmesin diyorsanız 0 verilecektir.
Bunun tam tersi. Bir çıkışın sıfır olmasını istiyorsak da, VE (AND) işlemi kullanılır. AND işlemi çarpma işlemi gibidir. Bir sayıyı 0 ile çarparsanız sonuç 0 olacaktır. Çarpma işleminde etkisiz eleman 1 dir. Şayet bir byte bilginin, bitlerinden herhangi biri durum değiştirmeyecekse onlara ise 1 veririz.
Bu şekilde düşünürsek de, çıkışı 0 yapmak için AND işlemini gerçekleştiririz.
PORTD&B11110111; // Burada 3. Bit sıfır olsun, diğer bitleri değiştirme diyoruz.
AND / OR işlemlerinin detayları için aşağıdaki linkleri kullanabilirsiniz.
https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitwiseand/
https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitwiseor/
Bu işaretin benzeri ise tek & ve tek | yerine && ve || işaretinin kullanılmasıdır. Bu şekilde 2 karakterli yazıldıysa mantıksal karşılaştırma yapmak içindir. Mesela IF cümlelerinde = işareti yerine == işareti kullanılıyor. Sizler de bu tip karşılaştırmalarda && ve || işaretlerini kullanabilirsiniz.
Fakat BIT işlemlerinde sadece tek & ve | yeterlidir.
Ben LCD de 4bit çalışmayı seçtim. Bu şekildeki çalışmada ise 8 bitlik sayının yüksek 4 bitini yazdırıyorum. Sonrasında düşük 4 bitini, yüksek 4 bitin yerine kaydırıp, tekrar yüksek 4 bit bilgi gibi yazdırıyorum.
Çalışma şekli şemadan da görebileceğiniz gibi, LCD lerin D4,D5,D6,D7 pimlerine, bilgi 2 ayrı zamanda veriliyor. Bunu sağlayan ise E (Enable girişinin HIGH ve LOW yapılmasıyla mümkün oluyor. )
4bit bilgiyi çıkışa veriyorum, E ucunu HIGH ve LOW yapınca birinci 4 bit LCD ye aktarılıyor. Sonrasında ise düşük değerli 4 biti, yüksek değerli 4 bit yerine kaydırıyorum ve PORT çıkışına aktarıyorum. Sonrasında tekrar E ucunu HIGH ve LOW yaparak bilgiyi LCD ye aktarıyorum.
İSTİSNA olan komutlar da var. Bunlar LCD nin İNİTİALİZE dediğimiz başlangıç ayarlarının yapılmasında 1 kez kullanılıyor. Bu komutlar da 4 bit olarak iletiliyor. Fakat 2 kademede değil tek kademede LCD ye aktarılıyor.
Bunun dışındaki komut ve karakter yazmalar hep 2 adet 4 bit şeklinde LCD ye aktarılır.
temp2=temp1&B11110000;// Burada temp1 değişkeninin içeriğindeki üst 4 biti temp2 ye aktarıyoruz. Bunu yaparken düşük 4 biti ise sıfırlıyoruz.
temp3=temp1&B00001111; //Burada ise temp1 in düşük 4 bitini temp3 değişkenine aktarıyoruz. Yüksek 4 bitini ise sıfırlıyoruz.
temp3=temp3<<4; // Burada ise temp3 teki düşük 4 biti sola kaydırarak yüksek 4 bit olmasını sağlıyoruz.
Sonrasında önce temp2 yi sonrasında ise temp3 değişkenini LCD ye aktarıyoruz.
Aşağıdaki satırlarla bilgiyi Arduinodan LCD ye gönderiyoruz. Buna dikkat ederseniz sadece temp2 gönderiliyor. Önce temp2 LCD ye gidiyor sonrasında temp2=temp3 komutuyla temp2 değerini temp3 değişkenine eşitliyoruz ve yine aynı satırları kullanarak temp3 sayısını göndermiş oluyoruz.
( Bunu böyle yapmak yerine, aynı satırları kopyalayarak hem temp2 hem de temp3 ayrı ayrı gönderilebilir. Program satırından tasaruf yapmak için bu şekilde yapıldı. )
digitalWrite(RS, RSS); // RSS LOW ve HIGH olarak gelebilir. Bir değişkendir.
delayMicroseconds(200);
digitalWrite(RW, LOW);
delayMicroseconds(200);
digitalWrite(EN, HIGH);
delayMicroseconds(200);
PORTD=temp2;
digitalWrite(EN, LOW);
delayMicroseconds(timesay);
Şayet 74HC595 e gönderiyorsak, mantık yine aynı fakat komutlar biraz farklı. 74HC595 ile seri haberleşme kullanıldığından SHIFTOUT komutunu kullanıyoruz.
Shiftout ayrıntılı bilgi için buraya bakınız.
https://www.arduino.cc/reference/en/language/functions/advanced-io/shiftout/
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, temp2);
digitalWrite(LATCH, HIGH);
delayMicroseconds(200);
temp2=temp2&B11111011;// E=0
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, temp2);
digitalWrite(LATCH, HIGH);
delayMicroseconds(timesay);// timesay genelde, tüm komut ve karakterlerde aynıdır. Fakat bazı initialize komutlarında değişebileceğinden bir değişkene bağlanmıştır.
LCD bazı komutları alıp işlerken bir zaman geçiyor. Bu zaman birçok yazma işleminde aynı olsa da bazı durumlarda farklı işleme zamanı olabiliyor.
Program içerisindeki ALT PROGRAMLAR:
Arduino programı olduğu için SETUP ve LOOP bölümleri vardır.
SENDCODE() : LCD ye komut yollamak için bu alt program kullanılır. Parametre 0 ise initialize komutu gibi tek 4 bit bilgi yollanır. 1 ise 1 byte bilgi 2 x 4 bit olarak yollanır.
STRINGSEND (3,1);: Yazılacak karakter dizesini karakter olarak gönderir. Bu parametreler yazmaya başlanılacak olan satır ve sütun numaralarıdır.
WRITECHAR: Karakterin LCD ye gönderilmesini sağlar.
SENDER: Arduino uno dan LCD ye gönderilen bilgiler. Karakterin LCD ye 4 bit olarak gitmesini sağlar.
SENDER1: Arduino uno dan 74HC595 e gönderilen bilgilerdir.
LEDONOFF: Aydınlatma ledinin açılmasını kapanmasını sağlamak için arduino pimine ve 74HC595 entegresine bilgi gönderir.
NEWCHAR(1,12,18,18,12,0,0,0,0);// Bu parametreli bir alt programdır. Parametrelerden birincisi 0-7 arasında hangi yeni karakterse onun numarasıdır. Diğerleri ise karakter jeneratöründen aldığınız bilgilerdir.
Not: Yeni karakter oluştururken, çok gerekmedikçe, en alt satırı boş bırakmamız gerekir. Çünkü en alt kısım Çizgi cursor işaretinin görüldüğü alandır ve karakterin en alt kısmı görünmez olacaktır. Ya da cursor işaretçisini gizlemeniz gerekir. CURSOR = İMLEÇ olarak da söylenebilir.
Tüm program ve dokümanlara buradan ulaşabilirsiniz.
Proteus dosyası videoda 8.6 versiyonuyla yapıldı. Proteus 8.6 yoksa sorun değil.
Proteus 7.10 ile yapılmış örneği ise tüm versiyonlarla çalıştırabilirsiniz. 74hc595_lcd_yeni2.DSN dosyası proteus 7.10 ile yapıldı.
Karakter LCD kontrol etmek istiyorsanız, çeşitli kullanımlar var.
Mesela EASYLCD. Seri port üzerinden, tek kablo ile karakter LCD yi kullanmanızı sağlar. Bu konuda detaylı bilgi ve çeşitli uygulamalar için
bu link’i kullanabilirsiniz.
Bu çalışma da ESKİ TELEFONLARINIZI, LCD ekran olarak kullanmanızı sağlar.
Bu konudaki detaylara ise bu linkten ulaşabilirsiniz.
Kaynak olarak http://www.dinceraydin.com/lcd/commands.htm sayfasından bazı bilgi ve resimler alınmıştır.
Ayrıca bu sayfada da kütüphaneli olarak Arduino için yapılmış 74HC595 ile lcd kullanımına bakabilirsiniz.
Başarılı bir çalışma emeğinize sağlık
Hocam öncelikle emeğinize sağlık. 8 bitlik toplama çıkartma ve çarpma olaca şekilde hesap makinası yapıyoruz sayısal tasarım dersi için. Sonuçlardan aldığım 8 bit ıle 8 tane ufak ledi bread boardda yakarak işlemi görebiliyorum. benim amacım ledlere gelen bınary kodunu dısplay olarak aktarmak istiyorum. Nasıl yapabilirm. Cevabınız için şimdiden teşekkür ederim
Hangi mikrokontrolcüyü kullanıyorsun. arduino mu kullanıyorsun. bu 8 bitlik sayı 255 e kadar gider. bunu yazdırmak için bir kaç yol var ama arduino kullanıyorsan orada modüler aritmetik yapabilirsin. sonucu 2 5 5 olarak bulabilirsin bunu da display de yazdırabilirsin. mesela 234 geldi. 2 3 4 şeklinde modüler artimetik ile bulabilirsin.
Ya da aşağıdaki yazılarımdaki çözümlere bakabilirsin.
https://www.mikrobotik.com/wp2/2023/05/12/sayisal-devre-tasarimi_2_adc/
https://www.mikrobotik.com/wp2/2023/07/22/sayisal-devre-tasarimi_5-plds_fpga/