Arduino ve HX1230 LCD Ekran ile Ekrana Yazı Yazdırma (Font Kütüphaneli)

👤 Yazar: ozcan 📅 Tarih: 12.07.2026 18:28 👁️ Görüntüleme: 31

Arduino ve HX1230 LCD Ekran ile Ekrana Yazı Yazdırma (Font Kütüphaneli)

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.

arduino hx1230 font yazı


1. Geliştirilmiş Arduino Kod Bloğu (Yazı Yazma Fonksiyonlu)

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ü
}

Bu Fonksiyon Nasıl Çalışır? (Teknik Altyapı)

  • PROGMEM Bellek Optimizasyonu: Harf matrislerini (Font Haritasını) normal RAM belleğine kaydetmek Arduino'nun hafızasını çok çabuk tüketir. Kodda kullandığımız 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.
  • Dinamik Koordinatlama: 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.

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
↑ Sayfa Başı
📞 İletişim ✉ E-Posta Gönder 🟥 YouTube
© 2026 Yenidir.com
Yenidir CMS V0.1