Ekranımızda test desenini başarıyla gördükten sonra, şimdi projelerimizin en önemli kısmına geçiyoruz: Ekrana yazı ve metin yazdırmak! HX1230 gibi grafik LCD ekranların kendi hafızalarında hazır harfler bulunmaz; tüm harfleri piksel piksel bizim tanımlamamız gerekir. Bu rehberde, koda entegre ettiğimiz hafif bir font haritası sayesinde hiçbir harici kütüphane kullanmadan ekranda istediğimiz satır ve sütuna nasıl yazı yazdırabileceğimizi öğreneceğiz.

D0'dan başlayan ters pin dizilimini tamamen koruyarak, içerisine popüler ASCII karakterlerini (harfler, rakamlar ve semboller) barındıran 5x7 boyutlarında bir yazı matrisi ekledik. Kodu doğrudan kopyalayıp Arduino'nuza yükleyebilirsiniz:
// HX1230 Ekran D0'dan Başlayan Ters Pin Tanımlamaları
int pin_RESET = 0; // 8. Pin: Sıfırlama Pini
int pin_CE = 1; // 7. Pin: Çip Seçimi
int pin_NC = 2; // 6. Pin: Boş Pin (Kullanılmıyor)
int pin_DIN = 3; // 5. Pin: Veri Girişi
int pin_CLK = 4; // 4. Pin: Saat Sinyali
int pin_VCC = 5; // 3. Pin: Ekran Güç Beslemesi
int pin_BL = 6; // 2. Pin: Arka Işık Kontrolü
int pin_GND = 7; // 1. Pin: Sanal Toprak Hattı
// 5x7 Standart ASCII Font Tablosu (Harfler, Rakamlar ve Temel Semboller)
const uint8_t PROGMEM font_haritasi[][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00}, // Boşluk (Space)
{0x00, 0x00, 0x5f, 0x00, 0x00}, // !
{0x00, 0x07, 0x00, 0x07, 0x00}, // "
{0x14, 0x7f, 0x14, 0x7f, 0x14}, // #
{0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $
{0x23, 0x13, 0x08, 0x64, 0x62}, // %
{0x36, 0x49, 0x55, 0x22, 0x50}, // &
{0x00, 0x05, 0x03, 0x00, 0x00}, // '
{0x00, 0x1c, 0x22, 0x41, 0x00}, // (
{0x00, 0x41, 0x22, 0x1c, 0x00}, // )
{0x14, 0x08, 0x3e, 0x08, 0x14}, // *
{0x08, 0x08, 0x3e, 0x08, 0x08}, // +
{0x00, 0x50, 0x30, 0x00, 0x00}, // ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // -
{0x00, 0x60, 0x60, 0x00, 0x00}, // .
{0x20, 0x10, 0x08, 0x04, 0x02}, // /
{0x3e, 0x51, 0x49, 0x45, 0x3e}, // 0
{0x00, 0x42, 0x7f, 0x40, 0x00}, // 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // 2
{0x21, 0x41, 0x45, 0x4b, 0x31}, // 3
{0x18, 0x14, 0x12, 0x7f, 0x10}, // 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // 5
{0x3c, 0x4a, 0x49, 0x49, 0x30}, // 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // 8
{0x06, 0x49, 0x49, 0x29, 0x1e}, // 9
{0x00, 0x36, 0x36, 0x00, 0x00}, // :
{0x00, 0x56, 0x36, 0x00, 0x00}, // ;
{0x08, 0x14, 0x22, 0x41, 0x00}, // <
{0x14, 0x14, 0x14, 0x14, 0x14}, // =
{0x00, 0x41, 0x22, 0x14, 0x08}, // >
{0x02, 0x01, 0x51, 0x09, 0x06}, // ?
{0x32, 0x49, 0x79, 0x41, 0x3e}, // @
{0x7e, 0x11, 0x11, 0x11, 0x7e}, // A
{0x7f, 0x49, 0x49, 0x49, 0x36}, // B
{0x3e, 0x41, 0x41, 0x41, 0x22}, // C
{0x7f, 0x41, 0x41, 0x22, 0x1c}, // D
{0x7f, 0x49, 0x49, 0x49, 0x41}, // E
{0x7f, 0x09, 0x09, 0x09, 0x01}, // F
{0x3e, 0x41, 0x49, 0x49, 0x7a}, // G
{0x7f, 0x08, 0x08, 0x08, 0x7f}, // H
{0x00, 0x41, 0x7f, 0x41, 0x00}, // I
{0x20, 0x40, 0x41, 0x3f, 0x01}, // J
{0x7f, 0x08, 0x14, 0x22, 0x41}, // K
{0x7f, 0x40, 0x40, 0x40, 0x40}, // L
{0x7f, 0x02, 0x0c, 0x02, 0x7f}, // M
{0x7f, 0x04, 0x08, 0x10, 0x7f}, // N
{0x3e, 0x41, 0x41, 0x41, 0x3e}, // O
{0x7f, 0x09, 0x09, 0x09, 0x06}, // P
{0x3e, 0x41, 0x51, 0x21, 0x5e}, // Q
{0x7f, 0x09, 0x19, 0x29, 0x46}, // R
{0x46, 0x49, 0x49, 0x49, 0x31}, // S
{0x01, 0x01, 0x7f, 0x01, 0x01}, // T
{0x3f, 0x40, 0x40, 0x40, 0x3f}, // U
{0x1f, 0x20, 0x40, 0x20, 0x1f}, // V
{0x3f, 0x40, 0x38, 0x40, 0x3f}, // W
{0x63, 0x14, 0x08, 0x14, 0x63}, // X
{0x07, 0x08, 0x70, 0x08, 0x07}, // Y
{0x61, 0x51, 0x49, 0x45, 0x43} // Z
};
void hx1230_komutYaz(uint8_t komut) {
digitalWrite(pin_CE, LOW);
digitalWrite(pin_CLK, LOW);
digitalWrite(pin_DIN, LOW);
digitalWrite(pin_CLK, HIGH);
for (int i = 7; i >= 0; i--) {
digitalWrite(pin_CLK, LOW);
digitalWrite(pin_DIN, (komut >> i) & 0x01);
digitalWrite(pin_CLK, HIGH);
}
digitalWrite(pin_CE, HIGH);
}
void hx1230_veriYaz(uint8_t veri) {
digitalWrite(pin_CE, LOW);
digitalWrite(pin_CLK, LOW);
digitalWrite(pin_DIN, HIGH);
digitalWrite(pin_CLK, HIGH);
for (int i = 7; i >= 0; i--) {
digitalWrite(pin_CLK, LOW);
digitalWrite(pin_DIN, (veri >> i) & 0x01);
digitalWrite(pin_CLK, HIGH);
}
digitalWrite(pin_CE, HIGH);
}
void hx1230_init() {
digitalWrite(pin_RESET, LOW);
digitalWrite(pin_RESET, HIGH);
hx1230_komutYaz(0xE2); // Software Reset
delay(2);
hx1230_komutYaz(0x2F); // Power Control ON
hx1230_komutYaz(0xA4); // Normal RAM Modu
hx1230_komutYaz(0xA6); // Normal Renk Modu
hx1230_komutYaz(0xA0); // Çalışan kararlı sütun yönü
hx1230_komutYaz(0xC0); // Çalışan kararlı satır yönü
hx1230_komutYaz(0x40);
hx1230_komutYaz(0x8B); // Kontrast Ayarı
hx1230_komutYaz(0xAF); // Display ON
delay(10);
}
void hx1230_ekranTemizle() {
for (int sayfa = 0; sayfa < 9; sayfa++) {
hx1230_komutYaz(0xB0 + sayfa);
hx1230_komutYaz(0x00);
hx1230_komutYaz(0x10);
for (int sutun = 0; sutun < 96; sutun++) {
hx1230_veriYaz(0x00);
}
}
}
// Yeni Eklenen Dinamik Metin Yazdırma Fonksiyonu
void hx1230_yaziYaz(int satir, int sutun, const char* metin) {
hx1230_komutYaz(0xB0 + satir); // Yazının yazılacağı satır (0-8 arası)
hx1230_komutYaz(sutun & 0x0F); // Sütun başlangıç alt adresi
hx1230_komutYaz(0x10 | ((sutun >> 4) & 0x0F)); // Sütun başlangıç üst adresi
while (*metin) {
char karakter = *metin;
// Küçük harfleri font haritasına uydurmak için büyük harfe çeviriyoruz
if (karakter >= 'a' && karakter <= 'z') {
karakter -= 32;
}
// Karakterin ASCII tablosundaki yerini hesaplıyoruz (Boşluk karakterinden başlatıyoruz)
int idx = karakter - 32;
// Eğer karakter tanımlı font aralığındaysa ekrana çiz
if (idx >= 0 && idx < (sizeof(font_haritasi) / 5)) {
for (int i = 0; i < 5; i++) {
uint8_t piksel_kolonu = pgm_read_byte(&(font_haritasi[idx][i]));
hx1230_veriYaz(piksel_kolonu);
}
hx1230_veriYaz(0x00); // Harfler arasında 1 piksel boşluk bırak (Okunurluk için)
}
metin++;
}
}
void setup() {
pinMode(pin_RESET, OUTPUT);
pinMode(pin_CE, OUTPUT);
pinMode(pin_NC, OUTPUT);
pinMode(pin_DIN, OUTPUT);
pinMode(pin_CLK, OUTPUT);
pinMode(pin_VCC, OUTPUT);
pinMode(pin_BL, OUTPUT);
pinMode(pin_GND, OUTPUT);
// Güç hatlarını ayağa kaldırıyoruz
digitalWrite(pin_GND, LOW); // Toprak hattı
digitalWrite(pin_VCC, HIGH); // 5V Güç
digitalWrite(pin_BL, HIGH); // Arka Işık
digitalWrite(pin_NC, LOW);
delay(100);
hx1230_init();
hx1230_ekranTemizle();
// METİN YAZDIRMA TESTLERİ
// hx1230_yaziYaz(satir, sutun, "YAZI");
hx1230_yaziYaz(1, 10, "ARDUINO UNO");
hx1230_yaziYaz(3, 16, "HX1230 LCD");
hx1230_yaziYaz(5, 8, "SIFIR KABLO!");
hx1230_yaziYaz(7, 24, "PROJESI");
}
void loop() {
// Ana döngü
}
PROGMEM ifadesi sayesinde harf piksellerini Arduino'nun devasa flash hafızasına (kod alanına) saklıyor, ihtiyaç duyduğumuzda ise pgm_read_byte fonksiyonuyla çekiyoruz. Bu sayede RAM neredeyse tamamen boş kalır.hx1230_yaziYaz(satir, sutun, "METIN") fonksiyonundaki satir parametresi 0 ile 8 arasında bir değer alır (Ekran dikeyde 9 satıra bölünmüştür). sutun parametresi ise 0 ile 95 piksel arasında yazının tam olarak nereden başlayacağını ayarlar.Henüz yorum yapılmamış. İlk yorumu siz yapın!