Kali ini akan saya bahas tentang bagaimana memanfaatkan LCD 2×16 (berbasis HD44780). Yang dibutuhkan adalah board Arduino UNO atau yang kompatibel, atau menggunakan mikrokontroler AVR apa saja (pengin tahu caranya? klik disini) serta rangkaian LCD sebagaimana digunakan pada LCD Shield produksi DFRobot.com. Oiya Arduino IDE-nya tetap digunakan (pake saja versi terbaru juga oke).
LCD Shield produk DFRobot.com
Rangkaian yang digunakan merujuk LCD Shield (klik PDF). Ada 2 hal yang saya coba cantumkan gambarnya disini.
- Gambar 1 merupakan gambar antarmuka LCD 2×16 menggunakan jalur data 4-bit (bisa juga 8-bit, tapi 4-bit lebih ngirit dan jalurnya bisa digunakan untuk keperluan lainnya).
- Gambar 2 merupakan antarmuka pushbutton yang menggunakan konsep pembagi tegangan. Maksudnya? Jika selama ini tombol atau pushbutton disambung ke pin mikrokontroler langsung nah yang ini beda! Kita gunakan rangkaian pembagi tegangan yang dihubungkan ke AD0 (masukan analog pertama) dari board Arduino-nya.
Gambar 1. Antarmuka LCD 4-bit
Gambar 2. Antarmuka tombol ke masukan A0
Ringkasan Cara Kerja
- Cara kerja LCD 2×16 menggunakan antarmuka 4-bit bisa dibaca maupun diperlajari melalui datasheet PDF-nya;
- Unduh pustaka LCD untuk Arduino disini;
- Cara kerja tombol menggunakan rangkaian 5 (lima) tingkat pembagi tegangan, yang intinya adalah penggunaan resistor (perhatikan Gambar 2). Jika tidak ada satupun tombol yang ditekan maka A0 tersambung ke Vcc melalui R2 (22K).
- Jika tombol SELECT ditekan maka terjadi penjumlahan resistor secara seri (R2+R3+R4+R5+R6) kemudian menuju GND. Demikian juga dengan masing-masing tombol yang ditekan akan menghasilkan nilai tegangan yang berbeda-beda, menyesuaikan R totaslnya, hal inilah yang digunakan untuk mendeteksi tombol mana yang ditekan (lihat pada penjelasan program).
Listing Program
#include <LCD4Bit_mod.h>
//create object to control an LCD.
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);
//Key message
char msgs[5][15] = {"Right Key OK ",
"Up Key OK ",
"Down Key OK ",
"Left Key OK ",
"Select Key OK" };
int adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
Cantumkan pustaka yang digunakan (dengan instruksi include). Lakukan pembuatan objek LCD (menggunakan pernyataan LCD4bit_mod) kemudian deklarasikan kalimat-kalimat yang nantinya akan ditempilkan pada LCD (pada variabel msgs). Nilai tegangan terbaca pada masing-masing tombol juga disimpan sekalian dalam sebuah variabel larik (adc_key_val[5]), yaitu angka tegangan 30, 150, 360, 535 dan 760. Angka-angka tersebut diperoleh dari hasil dari percobaan sebelumnya. Variabel-variabel lainnya juga sekalian disiapkan (NUM_KEYS, adc_key_in, key dan oldkey).
void setup() {
pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat
lcd.init();
//optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
//lcd.commandWrite(0x0F);//cursor on, display on, blink on. (nasty!)
lcd.clear();
lcd.printIn("KEYPAD testing...");
}
Selanjutnya melengkapi fungsi setup() pada Arduino. LED pada pin 13 tetap bisa kita gunakan (pinMode(13, OUTPUT)), inisialisasi LCD harus dilakukan, sebagaimana tercantum caranya di datasheet LCD berbasis penggerak HD44780, menggunakan lcd.init(). Anda bisa menambahkan beberapa pengaturan LCD tingkat lanjut seperti menghidupkan kursor, blink dan lain sebagainya.
Selanjutnya layar LCD dibersihkan (lcd.clear()) serta menuliskan kalimat pertama di baris pertama LCD (lcd.println(“KEYPAD testing…“)).
void loop()
{
adc_key_in = analogRead(0); // read the value from the sensor
digitalWrite(13, HIGH);
key = get_key(adc_key_in); // convert into key press
if (key != oldkey) // if keypress is detected
{
delay(50); // wait for debounce time
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey)
{
oldkey = key;
if (key >=0){
lcd.cursorTo(2, 0); //line=2, x=0
lcd.printIn(msgs[key]);
}
}
}
digitalWrite(13, LOW);
}
Fungsi loop() kita isikan dengan rutin ON/OFF LED pada pin 13 dan melakukan pemantauan tombol yang ditekan, yang selanjutnya akan menampilkan kalimat sesuai dengan tombol yang ditekan. Pertama kali dibaca nilai ADC-0 nya, kemudian LED di pin 13 di-ON-kan, baca nilai ADC, jika nilainya tidak sama dengan nilai sebelumnya berarti ada tombol yang ditekan (if (key != oldkey)). Tunggu hingga tidak bouncing, sekitar 50 milidetik (delay(50)). Kemudian dibaca lagi ADC-0 nya seperti semula untuk menentukan tombol mana yang ditekan, diterjemahkan melalui fungsi get_key(). Apa yang ditampilkan pada LCD menyesuaikan dengan tombol yang ditekan.
// Convert ADC value to key number
int get_key(unsigned int input)
{ int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{ return k; }
}
if (k >= NUM_KEYS)
k = -1; // No valid key pressed
return k;
}
Fungsi get_key() digunakan untuk menerjemahkan tombol mana yang ditekan (dari 5 tombol). Diperiksa satu persatu (for (k=0; k<NUM_KEYS; k++)), jika ADC-0 terbaca nilai kurang dari nilai konstan ADC yang telah tersimpan pada larik adc_key_val, maka dikembalikan nilai tombolnya (apakah 0, 1, 2, 3 atau 4). Jika tidak ada tombol ditekan maka dikembalikan nilai -1, demikian seterusnya.
Hasil tampilan pada LCD Shield menggunakan DFRDuino Uno
Program selengkapnya…
#include <LCD4Bit_mod.h>
//create object to control an LCD.
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);
//Key message
char msgs[5][15] = {"Right Key OK ",
"Up Key OK ",
"Down Key OK ",
"Left Key OK ",
"Select Key OK" };
int adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
void setup() { pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat lcd.init(); //optionally, now set up our application-specific display settings, //overriding whatever the lcd did in lcd.init() //lcd.commandWrite(0x0F);//cursor on, display on, blink on. (nasty!) lcd.clear(); lcd.printIn("KEYPAD testing..."); }
void loop() { adc_key_in = analogRead(0); // read the value from the sensor digitalWrite(13, HIGH); key = get_key(adc_key_in); // convert into key press if (key != oldkey) // if keypress is detected { delay(50); // wait for debounce time adc_key_in = analogRead(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key != oldkey) { oldkey = key; if (key >=0){ lcd.cursorTo(2, 0); //line=2, x=0 lcd.printIn(msgs[key]); } } } digitalWrite(13, LOW); }
// Convert ADC value to key number int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) k = -1; // No valid key pressed return k; }
Ada pertanyaan? Silahkan berkomentar dan semoga bermanfaat..