LCD
Disusun Oleh:
Putri Shafa Salsabella Helmi / 3.34.18.0.18
IK-3A
II. Peralatan
1. Sebuah Komputer
2. Satu set trainer mikrokontroler
Display karakter pada LCD diatur oleh pin EN, RS dan RW:
1. Jalur EN dinamakan Enable. Jalur ini digunakan untuk memberitahu LCD bahwa anda
sedang mengirimkan sebuah data. Untuk mengirimkan data ke LCD, maka melalui program
EN harus dibuat logika low “0” dan set pada dua jalur kontrol yang lain RS dan RW. Ketika
dua jalur yang lain telah siap, set EN dengan logika “1” dan tunggu untuk sejumlah waktu
tertentu (sesuai dengan datasheet dari LCD tersebut ) dan berikutnya set EN ke logika low
“0” lagi.
2. Jalur RS adalah jalur Register Select. Ketika RS berlogika low “0”, data akan dianggap
sebagai sebuah perintah atau instruksi khusus ( seperti clear screen, posisi kursor dll ).
Ketika RS berlogika high “1”, data yang dikirim adalah data text yang akan ditampilkan
pada display LCD. Sebagai contoh, untuk menampilkan huruf “T” pada layar LCD maka RS
harus diset logika high “1”.
3. Jalur RW adalah jalur kontrol Read/ Write. Ketika RW berlogika low (0), maka informasi
pada bus data akan dituliskan pada layar LCD. Ketika RW berlogika high ”1”, maka
program akan melakukan pembacaan memori dari LCD. Sedangkan pada aplikasi umum pin
RW selalu diberi logika low ”0”.
Pada percobaan dalam modul ini akan menggunakan modul Inter-Integrated Circuit
(I2C) sebagai perantara menangani perintah yang ada pada LCD. Sehingga posisi I2C ini
diantara LCD dan Arduino, dengan konsep menghemat pin yang digunakan arduino
untuk mengendalikan LCD. Pada umumnya LCD dikendalikan dengan menggunakan 6
jalur yang ada pada LCD : RS, EN, D7, D6, D5, dan D4. Jika diinginkan lebih simplekita
bisa menggunakan LCD shield yang bisa langsung integrated pada board. Tapi ketika kita
ingin menggunakan yang lebih simple dari segi ukuran I2C mungkin salah satu
jawabannya.
Gambar 4.2 Modul I2C
Hitachi 16 × 2 LCD menggunakan HD44780 sangat murah dan tersedia secara luas, dan
merupakan bagian penting untuk setiap proyek yang menampilkan informasi. Menggunakan
LCD, data yang diinginkan dapat ditampilkan pada LCD melalui bus I2C. Pada prinsipnya,
modul tersebut dibangun menggunakan PCF8574 (dari NXP) yang konsepnya adalah dua arah 8
bit I/O port expander yang menggunakan protokol I2C. PCF8574 adalah silikon CMOS sirkuit
sebagai pengendali I/O ekspansi (8-bit dua arah) bagi sebagian besar keluarga mikrokontroler
melalui dua jalur dua arah bus (I2C-bus). Perhatikan bahwa kebanyakan modul dibuat dari varian
PCF8574T (SO16 paket PCF8574 dalam paket DIP16) dengan alamat default slave 0x27. Jika
modul tertanam chip PCF8574AT(bisa dilihat dibagian belakangcipI2C), maka alamat slave
default akan berubah ke 0x3F. Singkatnya, ransel Anda didasarkan pada PCF8574T dan koneksi
alamat (A0-A1-A2) tidak dijembatani dengan solder akan memiliki 0x27 alamat slave.
Berikut merupakan rangkaian yang bisa dijadikan referensi untuk menghubungkan arduino
dengan LCD melalui modul I2C.
Gambar 4.4 Rangkaian I2C ke LCD
Berikut merupakan komponen I2C yang terpasang pada LCD dengan Pin yang dimiliki dan
fungsi tiap masing Pin.
Pada kebanyakan papan Arduino, SDA (data line) adalah dihubungkan pada input analog pin 4,
dan SCL (clock line) pada input analog pin 5. Pada Arduino Mega SDA adalah digital pin 20 dan
SCL adalah 21. Pada baru Arduino UNO (The "V3" pinout), pin SCL dan SDA juga pada dua
paling kiri baru pin atas.
CATATAN: The Blue Potentiometer (Foto) menyesuaikan Kontras. Jika Anda tidak melihat
karakter apapun, sesuaikan. Mulai searah jarum jam dan kembali ke tempat karakter yang cerah
dan background tidak memiliki kotak di belakang karakter.
Gambar 4.6 Konfigurasi Kabel Jumper
Untuk membuat program yang nantinya akan memanfaatkan I2C yang berkomunikasi dengan
LCD, maka dibutuhkan alamat yang tepat dari modul I2C. Alamat ini akan berbeda-beda untuk
tiap device tergantung pada IC yang dipakai oleh modul I2C.
Melihat alamat yang dipakai untuk modul I2C dapat menggunakan program scanner yang
nantinya menghasilkan alamat yang dipakai pada modul I2C yang digunakan saat pengiriman
perintah pada LCD.
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if // a
device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
Hasil bisa dilihat dengan menggunakan menu Serial Monitor yang beradapada kanan atas
Arduino IDE.
// Wait and then tell user they can start the Serial Monitor and type in
characters to
// Display. (Set Serial Monitor option to "No Line Ending")
lcd.clear();
lcd.setCursor(0,0); //Start at character 0 on line 0
lcd.print("D3TI INFORMATIKA");
lcd.setCursor(0,1);
lcd.print("Type to display");
}/*(end setup )*/
1. Memanggil library, lokasi fisik library biasanya berada pada lokasi dimana Arduino IDE
diinstall. Untuk menambhakan library kita tinggal masukkan folder library baru kitake folder
library. Lokasi yangmemungkinkan untuk menyimpan library lainnya adalah di samping
tempat penyimpanan skecth.
2. Inisialisasi class yang ada pada header library yang nantinya object yang dihasilkan dariproses
inisialisasi digunakan untuk pemrograman selanjutnya.
Menginstrusikan kursor pada posisi sesuai dengan parameter,dimulai dari 0 untuk baris
pertama, dan increment 1 untuk baris berikutnya.
lcd.setCursor(0,0);
Menuliskan karakter pada LCD pada posisi kursor yang berarti mereplace/mengganti karakter
lama dengan karakter yang baru.
lcd.print("D3 TEKNIK INFORMATIKA");
lcd.setCursor(0,1);
lcd.print("POLINES");
}/*(end setup )*/
Jika serial port menerima masukkan yang akan dirubah menjadi karakter setiap yang
diterima serial akan ditampilkan pada LCD.
Jadi jika dibandingkan dengan pemanfaatan I2C pada bahasan sebelumnya, LCD shield ini
berbeda, pin LCD akan seolah-olah seperti tertancap secara langsung pada Arduino tanpa
menggunakan modul I2C.
Tombol keypad yang berada pada bagian bawah akan langsung terhubung dengan AnalogInput
Pin 0.
void setup()
{
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);
lcd.print("Push the buttons"); // print a simple message
}
void loop()
{
lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
lcd.print(millis()/1000);// display seconds elapsed since powerup
Pada dasarnya LCD hanya untuk menampilkan tampilan yang dihasilkan dari kode
program saja, karena shield mempunyai keypad yang tujuannya untuk memilih tampilan
yang sekaligus akan menentukan aksi yang akan dilakukan setelahnya.
Pada kasus tertentu kita membutuhkan tampilan sebagai kontrol dari aktivitas yang kita
lakukan sebagai pengganti mouse atau touchscreen yang kita sering pakai dalam layar
smartphone atau touchScreen Monitor.
Fungsi pemilihan ini digambarkan sebagai menu navigasi yang ada pada sebuah website,
yang akan memberikan informasi yang berbeda untuk tiap menu yang terpilih dengan
memanfaatkan tombol keypad yang ada pada LCD Shield.
Keypad pada shield akan mempunyai nilai range analog pada 8 bit jalur data, yang
kisaran nilainya antara 0 – 1023. Nilai ini akan bisa didapatkan dengan menggunakan
fungsi analogRead() pada arduino.
adc_key_in = analogRead(0);
RIGHT = 0
UP = 144
DOWN = 329
LEFT = 504 SELECT = 741
sehingga kita bisa membuat range untuk menangkap setiap inputan keypad yang dilakukan oleh
user. Untuk mendekatkan nilai yang dihasilkan Analog Digital Converter kita berikan tambahan
nilai 50 untuk tiap nilai default.
Dengan kode program diatas akan menentukan aksi, dengan menyesuaikan tombol yang
ditekan dengan nilai tombol tersebut.
Contoh kasus :
Bisnis proses :
Pada LCD shield akan ditampilkan Sejumlah menu dengan level yang sama kita sebut
MainMenu.
1. Ketika keypad up ditekan pada LCD akan ditampilkan menu selanjutnya, dan jika
keypad Down ditekan akan ditampilkan menu terakhir (pada urutan terbalik dari keypad
Up).
2. Ketika keypad Select ditekan pada main menu, pada LCD akan menampilkan
submenu yang ada dalam tiap main menu. Atau jika tidak mempunyai submenu maka
akan melakukan aksi sesuai dengan menu terpilih.
Kode Program :
/*+++++++++++++++++++++++++++++++++++++++++++++++++++
Description : Simple Menu function on LCD
Button Function:
Up/Down - change Menu Page
Select - enter page
Left - Exit ++++++++++++++++++++++++++++++++++++++++++++
+++++++*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);
void setup()
{
lcd.begin(16,2); //Initialize a 2x16 type LCD
MainMenuDisplay(); delay(1000);
} void loop()
{
btn_push = ReadKeypad();
MainMenuBtn();
MainMenuDisplay();
WaitBtnRelease();
}
delay(10);
while(ReadKeypad()!= 'L')
{
//Insert Task for Menu A here
}
} void MenuB()
{ lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu B");
while(ReadKeypad()!= 'L')
{
//Insert Task for Menu B here
}
} void MenuC()
{ lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu C");
while(ReadKeypad()!= 'L')
{
//Insert Task for Menu C here
}
} void MenuD()
{ lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu D");
while(ReadKeypad()!= 'L')
{
//Insert Task for Menu D here
}
}
void MainMenuDisplay()
{ lcd.clear();
lcd.setCursor(0,0); switch
(mainMenuPage) { case 1:
lcd.print("1. Menu A");
break; case 2:
lcd.print("2. Menu B");
break; case 3:
lcd.print("3. Menu C");
break;
case 4:
lcd.print("4. Menu D");
break;
}
}
void MainMenuBtn()
{
WaitBtnRelease(); if(btn_push
== 'U')
{
mainMenuPage++;
if(mainMenuPage > mainMenuTotal)
mainMenuPage = 1;
}
else if(btn_push == 'D')
{
mainMenuPage--;
if(mainMenuPage == 0)
mainMenuPage = mainMenuTotal;
}
keypad_value = analogRead(keypad_pin);
void WaitBtnRelease()
{
while( analogRead(keypad_pin) < 800){}
}
//END Program
IV. Tugas
1. Buat running text geser kekiri pada LCD dengan I2C dan LCD Shield
Karakter : [NIM] – [NAMA] – D3TI POLINES
1) Buat konfigurasi rangkaian berikut pada Proteus
void setup(){
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("33418018 - Putri Shafa S H - D3TI POLINES");
delay(1000);
}
void loop(){
lcd.scrollDisplayLeft();
delay(200);
}
3) Jalankan rangkaian di Proteus
2. Gunakan fungsi untuk meletakkan karakter pada baris pertama dan kedua
sehingga posisi karakter yang ditampilkan berada ditengah. Jika jumlah
karakter lebih dari 16, maka karakter akan dipotong di karakter 16.
Baris Pertama : [NIM]
Baris Kedua : [NAMA]
void setup() {
lcd.begin(16,2);
}
void loop() {
panjangNim = nim.length();
CursorNim = (displayLength - panjangNim)/2;
lcd.setCursor(CursorNim,0);
lcd.print(nim);
panjangNama = nama.length();
if(panjangNama<=16){
CursorNama = (displayLength - panjangNama)/2;
lcd.setCursor(CursorNama,1);
lcd.print(nama);
}else{
lcd.setCursor(0,1);
lcd.print(nama);
}
}
3) Jalankan rangkaian di Proteus
3. Gunakan Arduino dengan LCD Shield. Manfaatkan keypad pada LCD
Shield untuk memasukkan kombinasi password jika pasword benar akan
tertampil “Selamat Datang” dan Lampu Led Hijau akan menyala, jika
inputan kombinasi salah Led Merah menyala tampilan LCD “Password
Salah”.
1) Buat konfigurasi rangkaian berikut pada Proteus
LiquidCrystal_I2C lcd(0x27,20,4);
char Data[Password_Lenght];
// 6 is the number of chars it can hold + the null char = 7
char Master[Password_Lenght] = "123456";
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'} };
void setup() {
lcd.init();
pinMode(led_hijau, OUTPUT);
pinMode(led_merah , OUTPUT);
}
void loop() {
digitalWrite(led_hijau, LOW);
digitalWrite(led_merah, LOW);
lcd.setCursor(0,0);
lcd.print("Enter Password");
customKey = customKeypad.getKey();
if (customKey == '1' || customKey == '2' || customKey == '3' ||
customKey == '4' || customKey == '5' || customKey == '6' || customKey
== '7' || customKey == '8' || customKey == '9' || customKey == '0') {
Data[data_count] = customKey;
lcd.setCursor(data_count,1 );
lcd.print(Data[data_count] ); data_count++;
}
if (customKey == '#'){
lcd.clear();
if(data_count == Password_Lenght-1) {
lcd.setCursor(0, 0);
if(!strcmp(Data, Master)){
lcd.print("Selamat Datang");
digitalWrite(led_hijau, HIGH);
digitalWrite(led_merah, LOW);
}else{
lcd.print("Password Salah" );
digitalWrite(led_hijau, LOW);
digitalWrite(led_merah, HIGH);}
}else{
lcd.print("Password Salah");
digitalWrite(led_hijau, LOW);
digitalWrite(led_merah, HIGH);
}
delay(5000) ;
lcd.clear() ; clearData() ;
}
}
void clearData() {
while(data_count !=0) {
Data[data_count--] = 0;
}
return;
}
3) Jalankan rangkaian di Proteus