Bu, PIC Eğitim Serimizdeki altıncı öğreticimizdir, bu öğreticide 16x2 LCD'nin PIC Mikrodenetleyici ile Arabirimini öğreniyoruz. Önceki eğitimlerimizde, bazı LED yanıp sönen Programları kullanarak PIC'in temellerini öğrendik ve ayrıca PIC Mikrodenetleyicide Zamanlayıcıların Nasıl Kullanılacağını öğrendik. MPLABX ve XC8 derleyicisini kullanarak PIC Mikrodenetleyicilerini Öğrenme hakkındaki tüm öğreticileri buradan kontrol edebilirsiniz.
Bu öğretici ilginç olacak çünkü PIC16F877A ile 16 × 2 LCD Arabirim Nasıl Yapılır öğreneceğiz, bu eğitimin sonunda ayrıntılı Videoya bakın. Kullanıcı göstergeleri için LED kullandığımız eski günler geride kaldı. LCD ekranları kullanarak projelerimizi nasıl daha havalı ve kullanışlı hale getirebileceğimize bir bakalım. Ayrıca 8051 ile Arduino, Raspberry Pi ile AVR ile LCD Arayüzüne ilişkin önceki makalelerimize de göz atın.
PIC Mikrodenetleyiciyle LCD Arayüzünün İşlevleri:
İşleri kolaylaştırmak için, bu LCD'yi PIC16F877A ile kullanırken işleri kolaylaştıracak küçük bir kitaplık yaptık. PIC MCU kullanarak LCD'yi çalıştırmak için gerekli tüm fonksiyonları içeren "MyLCD.h" başlık dosyası burada indirilmek üzere verilmiştir. Kütüphane kodu, yorum satırlarıyla iyi bir şekilde açıklanmıştır, ancak yine de şüpheleriniz varsa, yorum bölümünden bize ulaşın. Ayrıca Temel LCD çalışması ve Pinout'ları için bu makaleye bakın.
Not: Başlık dosyanızın içinde gerçekte ne olduğunu bilmeniz her zaman önerilir çünkü hata ayıklamada veya MCU’yu değiştirirken size yardımcı olacaktır.
Şimdi, bu kodu programınıza eklemenin iki yolu vardır. Ya yukarıdaki tüm kod satırlarını MyLCD.h içinde kopyalayabilir ve void main () 'in önüne yapıştırabilirsiniz. Veya bağlantıyı kullanarak başlık dosyasını indirebilir ve bunları projenizin başlık dosyasına ekleyebilirsiniz ( #include "MyLCD.h "; ). Bu, başlık dosyasına sağ tıklayıp Mevcut Öğeyi Ekle'yi seçerek ve bu başlık dosyasına göz atarak yapılabilir.
Burada başlık dosyası kodunu kopyalayıp ana C dosyama yapıştırdım. Dolayısıyla, kodumuzu kullanıyorsanız, başlık dosyasını indirip programınıza eklemenize gerek yoktur, sadece bu Eğitimin sonunda verilen Kodun tamamını kullanın. Ayrıca bu kitaplığın yalnızca PIC16F serisi PIC Mikroişlemciyi destekleyeceğini unutmayın.
Burada, aşağıdaki başlık dosyamızdaki her bir işlevi açıklıyorum:
void Lcd_Start (): Bu işlev, LCD ile çalışmaya başlamak için çağrılması gereken ilk işlev olmalıdır. Programda gecikmeyi önlemek için bu işlevi yalnızca bir kez çağırmalıyız.
void Lcd_Start () {Lcd_SetBit (0x00); için (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __delay_ms (5); Lcd_Cmd (0x03); __delay_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H, Eve Dönüş için kullanılır -> RAM'i temizler ve LCD'yi Lcd_Cmd (0x02) başlatır; // 02H, Eve Dönüş için kullanılır -> RAM'i temizler ve LCD Lcd_Cmd'yi (0x08) başlatır; // 1. Satırı Seç Lcd_Cmd (0x00); // Satır 1'i Temizle Görüntü Lcd_Cmd (0x0C); // 2. Satırı Seç Lcd_Cmd (0x00); // 2. Satır Görüntüsünü Temizle Lcd_Cmd (0x06); }
Lcd_Clear (): Bu işlev, LCD ekranı temizler ve önceki verilerin görünümünü temizlemek için döngülerin içinde kullanılabilir.
Lcd_Clear () {Lcd_Cmd (0); // LCD'yi temizleyin Lcd_Cmd (1); // İmleci ilk konuma taşıyın}
void Lcd_Set_Cursor (x konum, y konum): Başladıktan sonra , LCD'miz komut almaya hazırdır, bu işlevi kullanarak imlecini tercih ettiğiniz konuma getirmesi için LCD'ye talimat verebiliriz. Farz edelim ki 1. satırın 5. karakterinde imlece ihtiyacımız var. Daha sonra işlev geçersiz olacaktır Lcd_Set_Cursor (1, 5)
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; eğer (a == 1) {temp = 0x80 + b - 1; // 80H imleci hareket ettirmek için kullanılır z = temp >> 4; // 8 bitin altında y = temp & 0x0F; // Üst 8 bit Lcd_Cmd (z); // Satırı Ayarla Lcd_Cmd (y); // Sütunu Ayarla}, if (a == 2) {temp = 0xC0 + b - 1; z = sıcaklık >> 4; // 8 bitin altında y = temp & 0x0F; // Üst 8 bit Lcd_Cmd (z); // Satırı Ayarla Lcd_Cmd (y); // Sütunu Ayarla}}
void Lcd_Print_Char (karakter verisi): İmleç ayarlandıktan sonra, bu işlevi basitçe çağırarak bir karakteri konumuna yazabiliriz.
void Lcd_Print_Char (karakter verileri) // 8-bitleri 4-bit kipte gönder {char Lower_Nibble, Upper_Nibble; Lower_Nibble = veri & 0x0F; Upper_Nibble = veri & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Üst yarıyı 4 EN = 1 kaydırarak gönder; için (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Alt yarıyı gönder EN = 1; için (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Bir karakter grubu gösterilecekse, dizge işlevi kullanılabilir.
void Lcd_Print_String (karakter * a) {int i; için (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // İşaretçileri kullanarak dizeyi bölün ve Char işlevini çağırın}
Her Lcd_Print_Char (char veri) olarak adlandırılır, ilgili karakter değerleri LCD veri hatları gönderilir. Bu karakterler HD44780U'ya bit biçiminde ulaşır. Şimdi bu IC, aşağıdaki tabloda gösterildiği gibi ROM belleğini kullanarak görüntülenecek karakterle bitleri ilişkilendirir. HD44780U LCD Denetleyicinin veri sayfasında tüm karakterlerin bitlerini bulabilirsiniz .
Şimdi, başlık dosyamızdan memnun olduğumuza göre, devreyi oluşturalım ve programı test edelim. Ayrıca yukarıda verilen bağlantıda verilen başlık dosyasının tamamını kontrol edin.
Devre Şeması ve Test:
Aşağıda 16x2 LCD ile PIC Mikrodenetleyiciyi Arayüz için devre şeması verilmiştir.
Yukarıdaki devrede Güç kaynağını veya ICSP bağlantısını göstermedim, önceki eğitimde kullandığımız aynı kartı kullandığımız için burayı kontrol edin.
Programda dikkat edilmesi gereken önemli bir nokta, LCD'nin pin tanımlarıdır:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Bu pin tanımları, programcı donanım kurulumuna göre değiştirilebilir. Burada değiştirirseniz ana işlevdeki ilgili bağlantı noktası yapılandırmasını değiştirmeyi unutmayın.
Bu projenin donanımı çok basit. En son kullandığımız PIC modülünü tekrar kullanacağız ve LCD modülünü jumper kabloları kullanarak PIC'imize bağlayacağız.
Bağlantı aşağıdaki tablodan anlaşılabilir:
LCD Pin No. |
LCD Pin Adı |
MCU Pin Adı |
MCU Pin No. |
1 |
Zemin |
Zemin |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Zemin |
12 |
4 |
Kayıt Seç |
RD2 |
21 |
5 |
Okuma yazma |
Zemin |
12 |
6 |
etkinleştirme |
RD3 |
22 |
7 |
Veri Bit 0 |
NC |
- |
8 |
Veri Bit 1 |
NC |
- |
9 |
Veri Bit 2 |
NC |
- |
10 |
Veri Bit 3 |
NC |
- |
11 |
Veri Bit 4 |
RD4 |
27 |
12 |
Veri Bit 5 |
RD5 |
28 |
13 |
Veri Bit 6 |
RD6 |
29 |
14 |
Veri Bit 7 |
RD7 |
30 |
15 |
LED Pozitif |
+ 5V |
11 |
16 |
LED Negatif |
Zemin |
12 |
Şimdi sadece bağlantıları yapalım, kodu MCU'muza aktaralım ve çıktıyı doğrulayalım.
Herhangi bir sorununuz veya şüpheniz varsa, lütfen yorum bölümünü kullanın. Ayrıca aşağıda verilen Demo Videoyu da kontrol edin.