HX1230 grafik ekranlarda sıkça karşılaşılan problemlerden biri, görüntünün bazen çok soluk (silik) olması ya da ekranın tamamen siyah karelerle dolup okunamaz hale gelmesidir. Bu durum ekranın besleme voltajı ve dahili sürücüsünün kontrast seviyesiyle ilgilidir. Bu rehberde, koda ekleyeceğimiz dinamik kontrast fonksiyonu sayesinde, hiçbir fiziksel potansiyometre kullanmadan ekranımızın netliğini kod üzerinden nasıl mükemmel hale getireceğimizi öğreneceğiz.
D0'dan başlayan ters pin dizilimini ve yazı font haritasını koruyarak, içerisine ekranın iç kayıtçılarına (register) doğrudan müdahale eden hx1230_kontrastAyarla fonksiyonunu entegre ettik. Kodu doğrudan kopyalayıp kullanabilirsiniz:
// 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
const uint8_t PROGMEM font_haritasi[][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00}, // Boşluk
{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);
}
// Yeni Eklenen Yazılımsal Kontrast Ayar Fonksiyonu
void hx1230_kontrastAyarla(uint8_t deger) {
// Değer en fazla 31 (0x1F) olabilir, taşmayı önlemek için filtreliyoruz
if (deger > 31) deger = 31;
// 0x80 komutu ekran sürücüsüne kontrast ayarı yapılacağını bildirir
// Yanına eklenen 5 bitlik değer (0-31 arası) koyuluğu belirler
hx1230_komutYaz(0x80 | deger);
}
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);
}
}
}
void hx1230_yaziYaz(int satir, int sutun, const char* metin) {
hx1230_komutYaz(0xB0 + satir);
hx1230_komutYaz(sutun & 0x0F);
hx1230_komutYaz(0x10 | ((sutun >> 4) & 0x0F));
while (*metin) {
char karakter = *metin;
if (karakter >= 'a' && karakter <= 'z') karakter -= 32;
int idx = karakter - 32;
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);
}
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üç sağlama
digitalWrite(pin_GND, LOW);
digitalWrite(pin_VCC, HIGH);
digitalWrite(pin_BL, HIGH);
digitalWrite(pin_NC, LOW);
delay(100);
hx1230_init();
hx1230_ekranTemizle();
// MÜKEMMEL NETLİK İÇİN KONTRAST AYARI
// 0 (En açık/soluk) ile 31 (En koyu) arasında bir değer seçebilirsiniz.
// Genelde 5V/3.3V çakışmalarında 15 ile 22 arası değerler en net sonucu verir.
hx1230_kontrastAyarla(18);
// Test Yazısı
hx1230_yaziYaz(3, 12, "KONTRAST OK!");
}
void loop() {
// Ana döngü
}
Eğer kod yüklendikten sonra ekranda yazılar silik çıkarsa setup içerisindeki hx1230_kontrastAyarla(18); satırındaki değeri adım adım artırarak (örn: 22, 25, 28) ekranı koyulaştırabilirsiniz. Eğer ekranınız tamamen siyah bloklarla kaplanırsa bu değeri düşürerek (örn: 12, 10, 8) yazıları görünür kılabilirsiniz.
Henüz yorum yapılmamış. İlk yorumu siz yapın!