Facebook RSS Feed
 

.NET Micro Framework: Character LCD Kullanımı

Character LCD'ler harf, rakam ve işaretleri göstermek için kullanılır. Çoğunlukla 1, 2 yada 4 satır, 16, 20, 32 yada 40 sütündan oluşurlar. Düşük maliyetleri ve kolay kullanımları, basit uygulamalarda bu ekranları tercih sebebi yapmaktadır. Örnek uygulamamızda mikrodenetleyiciye LCD bağlantısı, çalışma mantığı ve uygulama kodları üzerinde duracağız.

Bağlantı Şeması

4-bitlik veri aktarımında toplamda 6 pin ile bağlantı yapılır. Bu pinlerin 4 tanesi veri aktarımında, 2 tanesi ise E (Enable) ve RS (Reset) komutları için kullanılır. LCD üzerindeki VSS -'ye, VDD +5Volt'a, Vo kontrast ayarı için potansiyometreye, RW -'ye, BL A +5Volt'a, BL K ise -'ye bağlanır. Geride kalan 4 uç açık bırakılabilir. Bağlantı şekli LCD modeline göre değişebilir, bağlantı yapmadan cihazınızın datasheet'ine bakın.

-

Çalışma Mantığı

LCD'ye karakter yazdırmadan önce ekranın işleme hazırlanması gerekir. Uygulamamıza ekleyeceğimiz CharLCD sınıfı bu işi bizim yerimize yapacaktır. Daha sonra uygulama kodları içerisinden imleci istenilen satır ve sütuna getirip, Print metodu ile o pozisyondan itibaren yazdırmak istediğimiz karakterleri yazdırabiliriz.

Uygulama Kodları

Visual Studio üzerinden oluşturacağımız Micro Framework Console Application'ımızın proje referansları arasına "Microsoft.SPOT.Hardware.dll" kütüphanesini ekleyelim. Ardından "CharLCD.cs" sınıfını oluşturup içeriğini aşağıdaki gibi değiştirelim:

CharLCD.cs

/*
Copyright 2010 GHI Electronics LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing permissions and limitations under the
License. 
*/

using System;
using System.Threading;
using Microsoft.SPOT.Hardware;
 
namespace MF_Char_LCD
{
    public class CharLCD : IDisposable
    {
        static OutputPort LCD_RS;
        static OutputPort LCD_E;
        static OutputPort LCD_D4;
        static OutputPort LCD_D5;
        static OutputPort LCD_D6;
        static OutputPort LCD_D7;
 
        const byte DISP_ON = 0xC;     // LCD'yi aç
        const byte CLR_DISP = 1;      // Ekranı temizle
        const byte CUR_HOME = 2;      // İmleci başa getir ve ekran hafızasını temizle
        const byte SET_CURSOR = 0x80; // SET_CURSOR + X : imleç posizyonunu X'e ayarla
 
        public void Dispose()
        {
            LCD_D4.Dispose();
            LCD_D5.Dispose();
            LCD_D6.Dispose();
            LCD_D7.Dispose();
            LCD_RS.Dispose();
            LCD_E.Dispose();
        }
 
        public CharLCD(Cpu.Pin D4, Cpu.Pin D5, Cpu.Pin D6, Cpu.Pin D7, Cpu.Pin E, Cpu.Pin RS)
        {
            LCD_RS = new OutputPort((Cpu.Pin)RS, false);
            LCD_E = new OutputPort((Cpu.Pin)E, false);
            LCD_D4 = new OutputPort((Cpu.Pin)D4, false);
            LCD_D5 = new OutputPort((Cpu.Pin)D5, false);
            LCD_D6 = new OutputPort((Cpu.Pin)D6, false);
            LCD_D7 = new OutputPort((Cpu.Pin)D7, false);
 
	   LCD_RS.Write(false);
 
	   // 4 bit veri iletişimi
            Thread.Sleep(50);
				
            LCD_D7.Write(false);
            LCD_D6.Write(false);
            LCD_D5.Write(true);
            LCD_D4.Write(true);
				
            LCD_E.Write(true);
            LCD_E.Write(false);
 
            Thread.Sleep(50);
 
            LCD_D7.Write(false);
            LCD_D6.Write(false);
            LCD_D5.Write(true);
            LCD_D4.Write(true);
 
            LCD_E.Write(true);
            LCD_E.Write(false);
 
            Thread.Sleep(50);
 
            LCD_D7.Write(false);
            LCD_D6.Write(false);
            LCD_D5.Write(true);
            LCD_D4.Write(true);
 
            LCD_E.Write(true);
            LCD_E.Write(false);
 
            Thread.Sleep(50);
 
            LCD_D7.Write(false);
            LCD_D6.Write(false);
            LCD_D5.Write(true);
            LCD_D4.Write(false);
 
            LCD_E.Write(true);
            LCD_E.Write(false);
 
            SendCmd(DISP_ON);
            SendCmd(CLR_DISP);
        }
 
        // LCD'ye ASCII karakteri gönderir
        void Putc(byte c)
        {
            LCD_D7.Write((c & 0x80) != 0);
            LCD_D6.Write((c & 0x40) != 0);
            LCD_D5.Write((c & 0x20) != 0);
            LCD_D4.Write((c & 0x10) != 0);
            LCD_E.Write(true); LCD_E.Write(false); // Enable pinini açıp kapat
 
            LCD_D7.Write((c & 0x08) != 0);
            LCD_D6.Write((c & 0x04) != 0);
            LCD_D5.Write((c & 0x02) != 0);
            LCD_D4.Write((c & 0x01) != 0);
            LCD_E.Write(true); LCD_E.Write(false); // Enable pinini açıp kapat
            //Thread.Sleep(1);
        }
 
        // LCD komutu gönderir
        void SendCmd(byte c)
        {
            LCD_RS.Write(false); // LCD'yi Data moduna al
 
            LCD_D7.Write((c & 0x80) != 0);
            LCD_D6.Write((c & 0x40) != 0);
            LCD_D5.Write((c & 0x20) != 0);
            LCD_D4.Write((c & 0x10) != 0);
            LCD_E.Write(true); LCD_E.Write(false); // Enable pinini açıp kapat
 
            LCD_D7.Write((c & 0x08) != 0);
            LCD_D6.Write((c & 0x04) != 0);
            LCD_D5.Write((c & 0x02) != 0);
            LCD_D4.Write((c & 0x01) != 0);
            LCD_E.Write(true); LCD_E.Write(false); // Enable pinini açıp kapat
 
	   Thread.Sleep(1);
            LCD_RS.Write(true); // LCD'yi Data moduna al
        }
 
        public void Print(string str)
        {
            for (int i = 0; i < str.Length; i++)
                Putc((byte)str[i]);
        }
 
        public void Clear()
        {
            SendCmd(CLR_DISP);
        }
 
        public void CursorHome()
        {
            SendCmd(CUR_HOME);
        }
 
        public void SetCursor(byte row, byte col)
        {
            SendCmd((byte)(SET_CURSOR | row << 6 | col));
        }
    }
}

CharLCD sınıfı, uygulamamızın LCD ile haberleşmesi için gerekli komutları içerir. Program.cs içerisinden CharLCD'nin instance'ını alarak kullanabileceğimiz metodların kullanımı ise aşağıdaki gibidir:

Program.cs

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
 
namespace MF_Char_LCD
{
    public class Program
    {
        public static void Main()
        {
            CharLCD lcd = new CharLCD(
                Cpu.Pin.GPIO_Pin0,  // Data 4
                Cpu.Pin.GPIO_Pin1,  // Data 5
                Cpu.Pin.GPIO_Pin2,  // Data 6
                Cpu.Pin.GPIO_Pin3,  // Data 7
                Cpu.Pin.GPIO_Pin4,  // E
                Cpu.Pin.GPIO_Pin5); // RS Pinleri bağlanacak şekilde LCD instance'ı alır
 
            lcd.Clear(); // Ekranı siler
 
            lcd.CursorHome(); // İmleci ilk satırın başına taşır
 
            lcd.Print("Merhaba"); // İmleç pozisyonundan başlayarak yazı yazdırır
 
            lcd.SetCursor(1, 0); // İmleci istenilen satır ve kolona getirir, saymaya 0'dan başlar
 
            lcd.Print("Dunya"); // İmleç pozisyonundan başlayarak yazı yazdırır
 
            lcd.Dispose(); // LCD için ayrılan pinleri serbest bırakır
 
            Thread.Sleep(Timeout.Infinite); // Main thread'i uyutur
        }
    }
}

Bu uygulamayı çalıştırdığımızda, LCD üzerinde ilk satırda "Merhaba", ikinci satırda ise "Dunya" yazısını göreceğiz.

Örnek Uygulama

Örnek olması açısından tarih ve saati LCD üzerinde gösteren bir uygulama geliştirmeyi ele alalım. Her saniye tetiklenecek bir timer oluşturacağız ve her saniye güncel zaman bilgisini ekrana yazdıracağız.

Program.cs

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
 
namespace MF_Char_LCD
{
    public class Program
    {
        public static CharLCD lcd = new CharLCD(
                Cpu.Pin.GPIO_Pin0,  // Data 4
                Cpu.Pin.GPIO_Pin1,  // Data 5
                Cpu.Pin.GPIO_Pin2,  // Data 6
                Cpu.Pin.GPIO_Pin3,  // Data 7
                Cpu.Pin.GPIO_Pin4,  // E
                Cpu.Pin.GPIO_Pin5); // RS Pinleri bağlanacak şekilde LCD instance'ı alır
 
        public static void Main()
        {
            Utility.SetLocalTime(new DateTime(2011, 2, 17, 6, 36, 0)); // Saati ayarlar
 
            // LCD'yi hazırlayalım:
            lcd.Clear();      // Ekranı siler
            lcd.CursorHome(); // İmleci ilk satırın başına taşır
 
            // Her saniye tetiklenecek bir timer oluşturalım:
            Timer tmr =
                new Timer(new TimerCallback(Timer1Tick), // Timer tick eventinde tetiklenecek metod
                null// Gerekirse timer'a object göndermek göndermek için
                0, // İlk tick’in gecikmesi (1/1000 saniye)
                1000); // Diğer tick’lerin gecikmesi (1/1000 saniye)
 
            // Main thread'i uyutalım:
            Thread.Sleep(Timeout.Infinite);
        }
 
        private static void Timer1Tick(object state)
        {
            lcd.Clear();      // Ekranı siler
            lcd.CursorHome(); // İmleci ilk satırın başına taşır
            lcd.Print(DateTime.Now.Date.ToString("dd MM yyyy")); // İlk satıra tarihi yazdırır
            lcd.SetCursor(1, 0); // İmleci ikinci satırın başına taşır
            lcd.Print(DateTime.Now.ToString("hh:mm ss")); // İkinci satıra saati yazdırır
        }
    }
}

Bu uygulamayı çalıştırdığınızda ise her saniye güncel zamanın ekrana yazıldığını göreceksiniz.

Kaynak kodlarını buradan indirebilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi