A. NGOBROL DIKIT DULU GAN..
Pada perancangan alat elektronika berbasis mikrokontroler kadang dibutuhkan HMI (Human to Machine Interface) berupa display dan yang sangat lazim digunakan salah satunya adalah dengan menggunakan LCD.
Pada alat elektronika portable atau peralatan elektronika dengan sistem kecil LCD yang digunakan kebanyakan adalah jenis LCD yang berbasis HD44780 Controller. Jenis LCD ini banyak digunakan karena harganya murah dan dimensi yang cukup kecil sehingga sangat pas digunakan untuk aplikasi elektronika portable (battery powered) atau sistem dengan lingkup kecil. LCD jenis ini hanya bisa menampilkan text / character dalam koridor ASCII (American Standard Code for Information Interchange) yang terdiri dari angka simbol dan huruf Alphabetic.

Tetapi LCD dengan basis HD44780 controller juga bisa menampilkan custom character dengan memanfaatkan CG RAM internal pada controller tersebut. CG RAM bisa ditulisi dengan perintah khusus yang dikontrol oleh mikrokontroler host (mikrokontroler aplikasi).

Untuk memudahkan pemrograman dan mempersingkat development time, designer bisa menggunakan library untuk LCD HD44780 yang sangat banyak tersedia di Internet dan juga kadang dalam beberapa jenis compiler default menyediakan library tersebut. Dengan menggunakan Library LCD HD44780, designer hanya perlu memanggil fungsi2 yang tersedia pada library tersebut misal fungsi untuk menulis karakter ke LCD, fungsi untuk menghapus karakter yang tertampil pada LCD, fungsi untuk meletakkan kursor pada posisi baris dan kolom tertentu pada LCD dll tanpa harus menulis program sampai pada komunikasi IO antara mikrokontroler host dan controller LCD.

B. INTI TOPIK :)
Nubielab (www.nubielab.com) mencoba untuk menawarkan library LCD HD44780 dengan konsep yang sedikit berbeda dan dengan fasilitas fungsi tambahan seperti fungsi running text, progress bar, custom character dll. Kelebihan library ini adalah dikembangkan oleh anak Indonesia dan disebarluaskan secara gratis dengan lisensi GNU GPL. Karena ditulis oleh anak bangsa, dokumentasi juga sebagian besar berbahasa Indonesia dan sangat mudah dipelajari dan dimodifikasi. Bila ada kesulitan, pertanyaan, kritik, perbaikan, saran atau informasi bugs silahkan kirim lewat email ke herlambang @nubielab.com atau buka www.nubielab.com dan cari post artikel yang terkait.

Berikut adalah screenshot simulasi library LCD ini pada ISIS Proteus:


Nubielab LCD library animated screenshot


C. PEMBAHASAN SINGKAT

Pada Nubielab HD44780 LCD Library terdapat 2 file utama yaitu nubielab_lcdlib.c dan nubielab_lcdlib.h; nubielab_lcdlib.c berisi fungsi- fungsi pendukung untuk operasi IO dan komunikasi antara mikrokontroler host dengan kontroler LCD (HDD44780). Berikut adalah fungsi- yang terdapat pada nubielab_lcdlib.c beserta keterangan fungsi dan cara penggunaanya.
Pada file “nubielab_lcdlib.c” terdapat syntax berikut:

#include <mega8535.h>  //untuk ATmega8535, ubah sesuai kebutuhan
#include <delay.h>         
#include <string.h>

Syntax

#include <mega8535.h>”

berfungi untuk memilih jenis mikrokontroler AVR yang akan digunakan. Mega8535.h berisi pendefinisian alamat IO dan SFR yang terdapat pada mikrokontroler AVR jenis ATmega8535. Bila anda menngunakan jenis mikrokontroler yang lain, silahkan ganti sesuai dengan mikrokontroler yang digunakan.

#include <delay.h>“

berfungsi untuk memasukkan fungsi delay default CodeVisionAVR kedalam program sedangkan

#include <string.h>“

berfungsi untuk memasukkan fungsi string default CodeVisionAVR kedalam program, misal fungsi

unsigned int strlen(char *str);

yang berfungsi untuk mengetahui panjang data dalam suatu array.

#define __PORTLCD_  PORTC //silahkan diganti sesuai kebutuhan..	
#define DDR_CONTROL DDRC  //jangan lupa ini juga diganti :D

Syntax diatas berfungsi untuk mengganti port LCD bila diperlukan. Nilai default LCD menggunakan PORTC. Ganti sesuai dengan kebutuhan misal ingin memindah port LCD ke PORTD maka __PORTLCD_ PORTD, DDR_CONTROL DDRD.

#define lcd_number  16    //diganti sesuai kebutuhan misal pake yg 2x20 
             //lcd_number 20 (untuk perhitungan kolom LCD) running text     
#define PROGRESSPIXELS_PER_CHAR	6
#define buffer_lcd_length 97 //total karakter buffer_lcd_length - 17 = 80

Silahkan ganti nilai lcd_number sesuai dengan jumlah karakter maksimal pada LCD, nilai default adalah 16 yang bisa digunakan untuk LCD 16x… misalkan anda menggunakan LCD dengan jumlah baris karakter 20x… anda bisa ganti nilai 16 menjadi 20. PROGRESSBPIXELS_PER_CHAR berfungsi untuk menentukan jumlah step pixel (progress bar) dalam satu blok karakter. Konstanta buffer_lcd_length berfungsi untuk buffer runnning text, nilai yang sesungguhnya adalah buffer_lcd_length – 17 misal definisi buffer_lcd_length adalah 97, maka jumlah karakter maksimal untuk dimasukkan ke buffer running text adalah 80 character.

Nilai lebih berjumlah 17 berfungsi untuk marquee fading yaitu karakter kosong (dalam aplikasi menggunakan karakter spasi 0x20) setelah program melakukan marquee (running text) dan selesai pada karakter terakhir, program akan menampilkan karakter kosong pada LCD sehingga akan terlihat efek fading atau karakter hilang kekiri disertai dengan tampilan kosong pada sebelah kanan. Program akan menambah karakter spasi setelah karakter terakhir secara otomatis.
Konfigurasi koneksi pin LCD ke mikrokontroler sama dengan library default CodeVisionAVR .. tinggal pilih aja portnya dan ganti definisi DDR_CONTROL dan __PORTLCD_. Berikut adalah konfigurasi koneksi antara port mikrokontroler dengan port LCD, PORTX…. X mengindikasikan port yang dipilih A/B/C/D.
Table koneksi mikrokontroler ke LCD.


Konfigurasi port mikrokontroler AVR ke LCD HD44780

D. PREVIEW CODE DOLOOO….
Berikut adalah Code contoh penggunaan dalam demo:

1.Contoh penggunaan (LCD_RUNNING_TEXT.c)

Spoiler for LCD_RUNNING_TEXT.c:
/*__ ___        __  __ ___  ___ ___  ___ _  _
|_ _|   \  ___ |  \/  |_ _|/ __| _ \/ _ \ \| | - eMBEDDED Design &
 | || |) ||___|| |\/| || |  (__|   / (_)| .` | - System Development
|___|___/      |_|  |_|___|\___|_|_\\___/_|\_|______________________+
 
;Homepage   : http://www.nubielab.com 
;Programmer : Herlambang Aribowo.
;Email      : herlambang@nubielab.com
;Mobile     : +62-85883289911
;------------------------------------
About Program:
Contoh penggunaan nubielab LCD library :D
library dilengkapi dengan fungsi moving message / running text, progress bar
user defined char, dan fungsi2 standar LCD. library ini tidak menggunakan fungsi
pembacaan data dari LCD termasuk fungsi wait busy dll..
tidak adanya perintah baca data dari LCD karena pertimbangan pengalaman pribadi
.. LCD RUSAK APLIKASI HANG!!! ____________ :D hal ini disebabkan
loop library bawaan CodeVisionAVR dibuat untuk menunggu jawaban dari LCD. hehe loop
tersebut tidak disertai fungsi timeout, ya jadinya fail dah.
 
mungkin kedepan akan saya tambahkan fungsi baca LCD dan busy wait serta fitur2
lain.. dan tentu saja dengan fungsi timeout :D
 
Satu lagi yang antik.. nama fungsi seperti lcd_puts, lcd_putsf, lcd_putchar
lcd_gotoxy, lcd_clear, lcd_control ..ane buat sama dengan nama fungsi pada 
LCD library default CodeVisionAVR hehe.. jadi fungsi dasar sama, misal agan
pake library default CodeVisionAVR sebelumnya, library ini bisa digunakan
tanpa perubahan  program yang significant :D
 
keterangan lebih lanjut tentang fungsi2 pada library ini dan kegunaanya serta
cara penggunaanya bisa dilihat langsung pada file nubielab_lcdlib.h
 
So... last but not least, library ini masih dalam tahap beta testing.. dan tentu
saja pasti ada bugsnya.. terutama masalah timing :) dan optimasi program..
tapi sudah usable koq hehe..
 
OPEN CRITICS and SUGGESTIONS.. send to the address above!
 
Happy Programming^^"
 
Compiler: CodeVisionAVR V2.03.9
Chip    : ATmega8535 X-tall 4Mhz
FUSE: H:C9    L:2F    Brownout@4.5V,WDT ON,BOD ON,SPI EN,X-tall High Freq. 
FUSE: H:C9    L:AF    Brownout@2.7V,WDT ON,BOD ON,SPI EN,X-tall High Freq.  
############################################################################
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
This code is distributed under the GNU Public License
which can be found at http://www.gnu.org/licenses/gpl.txt
 
Copyright 2009, 2010 Herlambang Aribowo
############################################################################
Ing ngarso sung tulodo; Ing madyo mangun karso; Tut wuri handayani.
________________________________"ODJO DUMEH"________________________________
*/
 
#include <mega8535.h>
//bila ingin menggunakan library ini, dalam program harus di include
//header library #include "nubielab_lcdlib.h"
//buka "nubielab_lcdlib.h" untuk pengaturan IO dan port yang digunakan
//default library ini menggunakan PORTC untuk port LCD
//konfigurasi PIN sama dengan library bawaan CVAVR (4bit mode)
#include "nubielab_lcdlib.h"  //pengaturan IO LCD buka disini
#include <stdio.h>           
#include <delay.h>                                                          
 
// Global variables
 
//berikut adalah contoh user defined chars :D
//bisa dibuat pendek dengan format hex,desimal atau oktal...
//pake biner biar mudah dipelajari... woookey digoyang gan"
__flash char arwl[]= 
{
0b00011,    //mata panah kiri
0b00111,
0b01111,
0b11111,
0b01111,
0b00111,
0b00011
};
__flash char arwr[]= 
{
0b11000,    //mata panah kanan
0b11100,
0b11110,
0b11111,
0b11110,
0b11100,
0b11000
};
__flash char arfl[]= 
{
0b11111,    //full block
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
__flash char pesan_1[]="HERLAMBANG ARIBOWO"; //isi pesan disini..
__flash char pesan_2[]="WWW.NUBIELAB.COM";   //masing2 pesan maks. 80 karakter
__flash char pesan_3[]="-DISCOVERING THE ART AND TECHNOLOGY-"; 
__flash char pesan_4[]="DEDICATED FOR WHO WANT TO REFRESHING ON THEIR KNOWLEDGE";
 
// Function prototype
void sett_regs(void);
 
// Main routine (super loop)
void main(void){
unsigned char i,dig[2]="";
char pesan_5[25]="";
char temperature = 100; //bwt nilai dummy aja..
 
sett_regs();
lcd_def_progressbar();  //panggil fungsi progressbar bila ingin digunakan
lcd_gotoxy(0,0);
lcd_putsf("LOADING..");
//dibawah adalah contoh penggunaan progress bar
for (i=0;i<100;i++){
    lcd_gotoxy(0,1);
    LCDprogressBar(i,100,16);
    lcd_gotoxy(10,0);
    dig[0] = (i/10)|0x30;
    dig[1] = (i%10)|0x30;   
    lcd_puts(dig);
    lcd_gotoxy(12,0);
    lcd_putchar('%');
    delay_ms(50);
    }
//karena sebelumnya sudah dipake oleh karakter progress bar,
//definisikan lagi user char yang lain kalo mo pake
lcd_defchar(arwl,0); //tulis user defined char ke CGRAM
lcd_defchar(arwr,1);  
lcd_defchar(arfl,2);
for(;;){
    //contoh pemanggilan pesan
    lcd_clear(); 
    lcd_gotoxy(2,0);
    lcd_putchar(0);  //user defined char pertamax
    lcd_gotoxy(13,0);
    lcd_putchar(1);  //user defined char keduax  ..kebawah sama                  
    __go_runf(0,3,12,pesan_1);
    lcd_clear(); 
    lcd_gotoxy(7,1);
    lcd_putchar(0);
    lcd_gotoxy(15,1);
    lcd_putchar(1); 
    __go_runf(1,8,14,pesan_2);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putchar(0);
    lcd_gotoxy(8,0);
    lcd_putchar(1);
    __go_runf(0,1,7,pesan_3);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("WWW.NUBIELAB.COM");
    for (i=0;i<=3;i++){
        lcd_gotoxy(i-1,1);
        lcd_putchar(2); 
        }
    for (i=12;i<16;i++){
        lcd_gotoxy(i,1);
        lcd_putchar(2);
        } 
    __go_runf(1,3,12,pesan_4);
    lcd_clear();
    //contoh pemakaian fungsi __go_runr(...) dengan formating char sprintf(...) 
    //untuk penggabungan sprintf dengan running tex mode, belum support nilai float
    sprintf(pesan_5,"SUHU: %2d%cC PUANAAAAS!",temperature,0xDF); 
    __go_runr(0,0,15,pesan_5);                 
    }
}
 
// Setting register
void sett_regs(void){
//Define I/O 
DDRA  = 0xFF;PORTA = 0x00;
DDRB  = 0xFF;PORTB = 0x00;
DDRC  = 0xFF;PORTC = 0x00;
DDRD  = 0xFF;PORTD = 0x00;
lcd_initmode(); //inisialisasi LCD pada waktu startup
}

2.Library (nubielab_lcdlib.c)

Spoiler for nubielab_lcdlib.c:
/*__ ___        __  __ ___  ___ ___  ___ _  _
|_ _|   \  ___ |  \/  |_ _|/ __| _ \/ _ \ \| | - eMBEDDED Design &
 | || |) ||___|| |\/| || |  (__|   / (_)| .` | - System Development
|___|___/      |_|  |_|___|\___|_|_\\___/_|\_|______________________+
 
;Homepage   : http://www.nubielab.com 
;Programmer : Herlambang Aribowo.
;Email      : herlambang@nubielab.com
;Mobile     : +62-85883289911
;------------------------------------
 
Prog. Name  : nubielab_lcdlib.c
Prog. Desc  : Library driver for lcd based on HD44780 controller
Prog. Vers  : V1.0 Beta 0 
Compiler    : CodeVisionAVR V2.03.9
Chip uC     : ATmega8535 - default (change as you need)
 
####################################################################
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 
This code is distributed under the GNU Public License
which can be found at http://www.gnu.org/licenses/gpl.txt
 
Copyright 2009, 2010 Herlambang Aribowo 
####################################################################
*/
 
#include <mega8535.h>  //untuk ATmega8535, ubah sesuai kebutuhan
#include <delay.h>         
#include <string.h>
 
#define __PORTLCD_  PORTC //silahkan diganti sesuai kebutuhan..	
#define DDR_CONTROL DDRC  //jangan lupa ini juga diganti :D
#define OUTPUT      0xFF  //bwt ngatur DDR port LCD sbg output
#define LCD_CMD__	0x00  //Command - buat select RS=0 (command)
#define LCD_DAT__	0x01  //Data    - buat select RS=1 (data)
#define LCD_CLRSCR  0x01  //Untuk perintah lain liat datasheet HD44780 
#define lcd_number  16    //diganti sesuai kebutuhan misal pake yg 2x20 
                          //lcd_number 20 (untuk perhitungan kolom LCD) running text     
#define PROGRESSPIXELS_PER_CHAR	6
#define buffer_lcd_length 97 //total karakter buffer_lcd_length - 17 = 80
 
/*untuk konfigurasi koneksi pin LCD ke mikrokontroler sama dengan library default
CodeVisionAVR .. tinggal pilih aja portnya dan ganti definisi DDR_CONTROL dan
__PORTLCD_.	
konfigurasi:
  uC_____     LCD_____________
  PORTX.0     PIN LCD No.4 RS	    
  PORTX.1     PIN LCD No.5 R/W	    
  PORTX.2     PIN LCD No.6 ENABLE
  PORTX.3     NC - NO CONNECTION	
  PORTX.4     PIN LCD No.11 D4	    
  PORTX.5     PIN LCD No.12 D5	    
  PORTX.6     PIN LCD No.13 D6	    
  PORTX.7     PIN LCD No.14 D7	    
*/
#pragma used+
//buffer untuk lcd running text dibatesin 80 karakter per pesan
unsigned char buffer_lcd[buffer_lcd_length]={NULL};
                                    //batasan char/pesan; buffer_lcd[x],x - 17
                                    //bisa diubah sesuai kebutuhan, tapi
                                    //sesuaikan dengan data stack dan kapasitas SRAM
                                    //disini lebih dari 80chars, pesan tidak ditampilkan.  
//Progress bar table adapted from "scienceprog.com" lcd library
__flash const unsigned char lcdbardisplay[]= //define 8 custom LCD chars
{	0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, // 0. 0/5 full progress block
	0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, // 1. 1/5 full progress block
	0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, // 2. 2/5 full progress block
	0x00, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x00, // 3. 3/5 full progress block
	0x00, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x00, // 4. 4/5 full progress block
	0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, // 5. 5/5 full progress block
};
#pragma used-
 
#pragma used+	
//_______________________________________________________________________________
//fungsi LCD enable dan disable (pulse) 
void lcd_enclk(void){
__PORTLCD_|=1<<2;
#asm("nop")
delay_us(100);	
__PORTLCD_|=1<<2;
#asm("nop")
delay_us(50); 
}
 
//_______________________________________________________________________________
//fungsi penulisan data dan perintah pada LCD
//mode 0 - menulis perintah
//mode 1 - menulis data   
void lcd_cmddat__(unsigned char mode,unsigned char isi){
__PORTLCD_ = (isi&0xF0)|mode<<0;		
#asm("nop")
lcd_enclk();
__PORTLCD_ = ((isi&0x0F)<<4)|mode<<0;	
#asm("nop")	
lcd_enclk();			
}    
 
//_______________________________________________________________________________
//membersihkan CGRAM pada LCD
/*
contoh cara penggunaannya:
    lcd_clear(); membersihkan karakter pada display LCD
*/
void lcd_clear(void){
lcd_cmddat__(LCD_CMD__,LCD_CLRSCR);
delay_ms(10);
}
 
//_______________________________________________________________________________
//menulis kontrol byte ke LCD
/*
contoh cara penggunaannya:
    lcd_control(0x01); perintah clear screen.. 
untuk referensi perintah lainnya silahkan liat HD44780 datasheet.
*/
void lcd_control(unsigned char __control){
lcd_cmddat__(LCD_CMD__,__control);
}
 
//_______________________________________________________________________________
//menempatkan cursor pada posisi kolom dan baris, xy
/*
contoh cara penggunaannya:
    lcd_gotoxy(0,0); LCD kolom karakter 0 line 0
*/
void lcd_gotoxy(unsigned char x, unsigned char y){
if(y == 0){
    lcd_cmddat__(LCD_CMD__,0x80+x); //untuk baris 0
    }
if(y == 1){
    lcd_cmddat__(LCD_CMD__,0xC0+x); //untuk baris 1 
    }
}
 
//_______________________________________________________________________________
//nulis satu karakter ke LCD
/*
contoh cara penggunaannya:
    lcd_gotoxy(0,0);
    lcd_putchar("A");
*/
void lcd_putchar(unsigned char __char){
lcd_cmddat__(LCD_DAT__,__char);
}
 
//_______________________________________________________________________________
//fungsi untuk menulis karakter ke LCD, pointer untuk data pada SRAM
/*
misal: char karaktersramku[]="WWW.NUBIELAB.COM";
terus contoh cara penggunaannya:
    lcd_gotoxy(0,0);
    lcd_puts(karaktersramku);
*/
void lcd_puts(unsigned char *strdat){ 
unsigned char i=0;                    
for(;;){
    if (strdat[i] != NULL){
        lcd_cmddat__(LCD_DAT__,strdat[i]);
        i++;
        }
    else break;
    if (i >= lcd_number) break;
    }
}
 
//_______________________________________________________________________________
//fungsi untuk menulis karakter ke LCD, pointer untuk data pada FLASH
/*
misal: __flash char karakterflashku[]="WWW.NUBIELAB.COM";
terus contoh cara penggunaannya:
    lcd_gotoxy(0,0);
    lcd_putsf(karakterflashku);
*/
void lcd_putsf(__flash unsigned char *strdat){ 
unsigned char i=0;                           
for(;;){
    if (strdat[i] != NULL){
        lcd_cmddat__(LCD_DAT__,strdat[i]);
        i++;
        }
    else break;
    if (i >= lcd_number) break;
    }
}
 
//_______________________________________________________________________________
//Fungsi dibawah berguna bila ingin mendefinisikan karakter sendiri
//karakter disimpan pada memory flash.
/*
__flash char karakterku[]={
0b11111,//karakter berjumlah 5x7
0b00100,
0b01010,
0b10001,
0b10010,
0b01100,
0b01100,
};
cara penulisan ke CGRAM LCD:
    lcd_defchar(karakterku,0);
contoh cara menampilkannya pada LCD:
    lcd_putchar(0);
*/
void lcd_defchar(__flash unsigned char *gawedewe, unsigned char location){
unsigned char i;                          
lcd_cmddat__(LCD_CMD__,0x40|(location*8));    
for(i=0; i<8; i++){
    lcd_cmddat__(LCD_DAT__,gawedewe[i]);
    }
}
 
//_______________________________________________________________________________
//masukin user defined (progress bar) character ke CGRAM LCD
//kalo mo pake progressbar, jangan lupa panggi dulu fungsi ini
void lcd_def_progressbar(void){
#pragma warn+
unsigned char i,j;
#pragma warn-
for (j=0;j<8;){                         
    lcd_cmddat__(LCD_CMD__,0x40|(j*8));    
    for(i=0; i<8; i++){
        lcd_cmddat__(LCD_DAT__,lcdbardisplay[i+(j*8)]);
        }
    j++;        
    }
}
 
//_______________________________________________________________________________
/*
FUNGSI RUNNING TEXT (MOVING MESSAGE) - parameter pesan ada pada memory FlASH!
Fungsi dibawah digunakan untuk menampilkan text bergeser kekiri (moving text)
atau running text. Parameter line berfungsi untuk menentukan line LCD yang akan
digunakan misal 0 adalah line 0 dan 1 adalah line 1. Parameter start dan stop
berfungsi untuk menentukan kolom start dan stop (range tulisan akan ditampilkan)
parameter pesan adalah pointer yang menunjuk pada text yang ada pada memory program
atau memory flash.
Contoh cara penggunaan:
difinisikan dulu array dalam format flash misal: 
    __flash char pesan_1[]="HERLAMBANG ARIBOWO";
 
cara pemanggilan pesan.. misalkan pada line 0 LCD, start pada kolom 3 sampai kolom 9
maka syntaxnya:
    __go_runf(0,3,9,pesan_1);
syntax diatas akan menampilkan text "HERLAMBANG ARIBOWO" pada line 0 dari kolom
karakter LCD 3 sampai dengan kolom karakter 9 variable kolom karakter dari 0-15 default
atau bisa diubah dengan merubah definisi lcd_number.
*/
void __go_runf(char line,char start,char stop,__flash char *pesan){
volatile unsigned int i,j;
volatile unsigned char k=0;
if (strlenf(pesan) > (buffer_lcd_length-17)){
    return;
    }     
for (i=0; i<=strlenf(pesan); i++){
    buffer_lcd[i] = pesan[i];
    }
j = strlen(buffer_lcd);      
for (i=0; i<=(stop-start); i++){
    buffer_lcd[j+i] = ' ';
    }
for (i=(stop|1); i>=start; --i){
    if (i > lcd_number){
        break;
        }
    lcd_gotoxy(i,line); 
    for (j=0; j< ((stop+1)-i); j++){
        lcd_putchar(buffer_lcd[j]); 
        }
    delay_ms(100); //delay bwt kecepatan pergeseran text 
    };        
for (i=0; i<=strlen(buffer_lcd); i++){
    k++;                             
    lcd_gotoxy(start,line);  
    for (j=0; j<((stop+1)-start); j++){
        if (buffer_lcd[k+j] == NULL){
            j = strlen(buffer_lcd);
            for (i=0; i<j; i++){
                buffer_lcd[i]=NULL;
                }
            return;
            }
        lcd_putchar(buffer_lcd[k+j]);
        }
    delay_ms(100); //delay bwt kecepatan pergeseran text
    };     
}
 
//_______________________________________________________________________________
/*FUNGSI RUNNING TEXT (MOVING MESSAGE) - parameter pesan ada pada memory SRAM!
Cara kerja sama dengan fungsi __go_runf(), tetapi pointer menunjuk pada data
yang berlokasi pada SRAM.
Contoh cara penggunaan:
definisikan dulu array dalam SRAM  misal: 
    char pesan_1[]="HERLAMBANG ARIBOWO";                 
cara pemanggilan pesan.. misalkan pada line 0 LCD, start pada kolom 3 sampai kolom 9
maka syntaxnya:
    __go_runr(0,3,9,pesan_1);
syntax diatas akan menampilkan text "HERLAMBANG ARIBOWO" pada line 0 dari kolom
karakter LCD 3 sampai dengan kolom karakter 9.
 
atau bisa juga dengan sprintf misalkan variabel buffer bernama pesan_1
definisikan dulu variabelnya:
    unsigned char pesan_1[25]="";
    char temperature = 100; //bwt nilai dummy aja..
isi pesan_1 dengan data menggunakan fungsi sprintf, misal menampilkan temperature
    sprintf(pesan_1,"SUHU: %2d%cC PUANAAAAS!",temperature,0xDF);
    _go_runr(0,0,15,pesan_1); //--tampilan FULL line 0 satu layar LCD 16chars
 
variable kolom karakter dari 0-15 default
atau bisa diubah dengan merubah definisi lcd_number.
*/
void __go_runr(char line,char start,char stop,char *pesan){
volatile unsigned int i,j;
volatile unsigned char k=0;
if (strlen(pesan) > (buffer_lcd_length-17)){
    return;
    }     
for (i=0; i<=strlen(pesan); i++){
    buffer_lcd[i] = pesan[i]; 
    }
j = strlen(buffer_lcd);      
for (i=0; i<=(stop-start); i++){
    buffer_lcd[j+i] = ' '; 
    }
for (i=(stop|1); i>=start; --i){
    if (i > lcd_number){
        break;
        }
    lcd_gotoxy(i,line); 
    for (j=0; j< ((stop+1)-i); j++){
        lcd_putchar(buffer_lcd[j]);
        } 
    delay_ms(100); //delay bwt kecepatan pergeseran text 
    };        
for (i=0; i<=strlen(buffer_lcd); i++){
    k++;                             
    lcd_gotoxy(start,line);  
    for (j=0; j<((stop+1)-start); j++){
        if (buffer_lcd[k+j] == NULL){
            j = strlen(buffer_lcd);
            for (i=0; i<j; i++){
                buffer_lcd[i]=NULL;
                }
            return;
            }
        lcd_putchar(buffer_lcd[k+j]);
        }
    delay_ms(100); //delay bwt kecepatan pergeseran text
    };   
}
 
//_______________________________________________________________________________
//inisialisasi lcd
/*
contoh cara penggunaannya:
    lcd_initmode(); cukup diawal program aja :D
*/                                                            
void lcd_initmode(void){// increment no cursor
DDR_CONTROL = OUTPUT;  
delay_ms(10);    
//thrice 8bit command (software reset) before 4bit command
__PORTLCD_ = 0x30; 		
lcd_enclk();
__PORTLCD_ = 0x30; 	
lcd_enclk();
__PORTLCD_ = 0x20;	
lcd_enclk();
//enter 4bit mode    
lcd_cmddat__(LCD_CMD__,0x28);  //4bit mode 2line font 5x7 
lcd_cmddat__(LCD_CMD__,0x06);  //Entry mode, Set increment
lcd_cmddat__(LCD_CMD__,0x0C);  //Display on, cursor off,cursor blink off
lcd_cmddat__(LCD_CMD__,0x02);  //Home
lcd_cmddat__(LCD_CMD__,0x01);  //Clear 
delay_ms(1);
}
 
//_______________________________________________________________________________
/*Fungsi LCD PROGRESS BAR
"adapted from mAVRLIB" quoted from scienceprog.com lcd_lib for use with AVRGCC (WINAVR)
ported to CodeVisionAVR by Herlambang A. - www.nubielab.com
fungsi tampilan display progress bar, hehe males mo nulis ndiri, udah ada tinggal
dipake aja :D
baca keterangan inline explanationnya dah komplit sekali gk usah ditambahin
contoh:
for (i=0;i<100;i++){            //loop sampai 100
    lcd_gotoxy(0,1);            //ditampilkan pada lcd line1 mulai kolom1
    LCDprogressBar(i,100,16);   //i= nilai progress bar, 100= nilai maksimal prgrs bar
    }                           //16 = adalah nilai alokasi jumlah kolom untuk prgrs bar
*/
void LCDprogressBar(unsigned char progress, unsigned char maxprogress, unsigned int length){
unsigned char i,c;
unsigned char pixelprogress;
 
// draw a progress bar displaying (progress / maxprogress)
// starting from the current cursor position
// with a total length of "length" characters
// ***note, LCD chars 0-5 must be programmed as the bar characters
// char 0 = empty ... char 5 = full
 
// total pixel length of bargraph equals length*PROGRESSPIXELS_PER_CHAR;
// pixel length of bar itself is
pixelprogress = ((progress*(length*PROGRESSPIXELS_PER_CHAR))/maxprogress);
 
// print exactly "length" characters
for(i=0; i<length; i++){
    // check if this is a full block, or partial or empty
    if( ((i*PROGRESSPIXELS_PER_CHAR)+5) > pixelprogress ){
        // this is a partial or empty block
        if( ((i*PROGRESSPIXELS_PER_CHAR)) > pixelprogress ){
            // this is an empty block
            // use space character?
            c = 0;
            }
        else{
            // this is a partial block
            c = pixelprogress % PROGRESSPIXELS_PER_CHAR;
            }
        }
    else{
        // this is a full block
        c = 5;
        }		
    // write character to display
    lcd_putchar(c);
    }
}
//_______________________________________________________________________________
#pragma used-
3.Header (nubielab_lcdlib.h)
Spoiler for nubielab_lcdlib.h:
/*__ ___        __  __ ___  ___ ___  ___ _  _
|_ _|   \  ___ |  \/  |_ _|/ __| _ \/ _ \ \| | - eMBEDDED Design &
 | || |) ||___|| |\/| || |  (__|   / (_)| .` | - System Development
|___|___/      |_|  |_|___|\___|_|_\\___/_|\_|______________________+
 
;Homepage   : http://www.nubielab.com 
;Programmer : Herlambang Aribowo.
;Email      : herlambang@nubielab.com
;Mobile     : +62-85883289911
;------------------------------------
 
Prog. Name  : nubielab_lcdlib.h
Prog. Desc  : Header library driver for lcd based on HD44780 controller
Prog. Vers  : V1.0 Beta 0 
Compiler    : CodeVisionAVR V2.03.9
Chip uC     : ATmega8535 - default (change as you need)
 
####################################################################
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 
This code is distributed under the GNU Public License
which can be found at http://www.gnu.org/licenses/gpl.txt
 
Copyright 2009, 2010 Herlambang Aribowo 
####################################################################
*/
 
#ifndef _NUBIELAB_LCDLIB_INCLUDED_
#define _NUBIELAB_LCDLIB_INCLUDED_
 
#include "nubielab_lcdlib.c"
 
/*untuk konfigurasi koneksi pin LCD ke mikrokontroler sama dengan library default
CodeVisionAVR .. tinggal pilih aja portnya dan ganti definisi DDR_CONTROL dan
__PORTLCD_ pada file nubielab_lcdlib.c.	
konfigurasi:
  uC_____     LCD_____________
  PORTX.0     PIN LCD No.4 RS	    
  PORTX.1     PIN LCD No.5 R/W	    
  PORTX.2     PIN LCD No.6 ENABLE
  PORTX.3     NC - NO CONNECTION	
  PORTX.4     PIN LCD No.11 D4	    
  PORTX.5     PIN LCD No.12 D5	    
  PORTX.6     PIN LCD No.13 D6	    
  PORTX.7     PIN LCD No.14 D7	
  default library ini menggunakan PORTC    
*/
 
#pragma used+
//_______________________________________________________________________________
//fungsi LCD enable dan disable (pulse) 
void lcd_enclk(void);
 
//_______________________________________________________________________________
//fungsi penulisan data dan perintah pada LCD
//mode 0 - menulis perintah
//mode 1 - menulis data   
void lcd_cmddat__(unsigned char mode,unsigned char isi);  
 
//_______________________________________________________________________________
//membersihkan CGRAM pada LCD
/*
contoh cara pemanggilannya:
    lcd_clear(); membersihkan karakter pada display LCD
*/
void lcd_clear(void);
 
//_______________________________________________________________________________
//menulis kontrol byte ke LCD
/*
contoh cara pemanggilannya:
    lcd_control(0x01); perintah clear screen.. 
untuk referensi perintah lainnya silahkan liat HD44780 datasheet.
*/
void lcd_control(unsigned char __control);
 
//_______________________________________________________________________________
//menempatkan cursor pada posisi kolom dan baris, xy
/*
contoh cara pemanggilannya:
    lcd_gotoxy(0,0); LCD kolom karakter 0 line 0
*/
void lcd_gotoxy(unsigned char x, unsigned char y);
 
//_______________________________________________________________________________
//nulis satu karakter ke LCD
/*
contoh cara pemanggilannya:
    lcd_gotoxy(0,0);
    lcd_putchar("A");
*/
void lcd_putchar(unsigned char __char);
 
//_______________________________________________________________________________
//fungsi untuk menulis karakter ke LCD, pointer untuk data pada SRAM
/*
misal: char karaktersramku[]="WWW.NUBIELAB.COM";
terus contoh cara pemanggilannya:
    lcd_gotoxy(0,0);
    lcd_puts(karaktersramku);
*/
void lcd_puts(unsigned char *strdat);
 
//_______________________________________________________________________________
//fungsi untuk menulis karakter ke LCD, pointer untuk data pada FLASH
/*
misal: __flash char karakterflashku[]="WWW.NUBIELAB.COM";
terus contoh cara pemanggilannya:
    lcd_gotoxy(0,0);
    lcd_putsf(karakterflashku);
*/
void lcd_putsf(__flash unsigned char *strdat);
 
//_______________________________________________________________________________
//Fungsi dibawah berguna bila ingin mendefinisikan karakter sendiri
//karakter disimpan pada memory flash.
/*
__flash char karakterku[]={
0b11111,//karakter berjumlah 5x7
0b00100,
0b01010,
0b10001,
0b10010,
0b01100,
0b01100,
};
cara penulisan ke CGRAM LCD:
    lcd_defchar(karakterku,0);
contoh cara menampilkannya pada LCD:
    lcd_putchar(0);
*/
void lcd_defchar(__flash unsigned char *gawedewe, unsigned char location);
 
//_______________________________________________________________________________
//masukin user defined (progress bar) character ke CGRAM LCD
//kalo mo pake progressbar, jangan lupa panggi dulu fungsi ini
void lcd_def_progressbar(void);
 
//_______________________________________________________________________________
/*
FUNGSI RUNNING TEXT (MOVING MESSAGE) - parameter pesan ada pada memory FlASH!
Fungsi dibawah digunakan untuk menampilkan text bergeser kekiri (moving text)
atau running text. Parameter line berfungsi untuk menentukan line LCD yang akan
digunakan misal 0 adalah line 0 dan 1 adalah line 1. Parameter start dan stop
berfungsi untuk menentukan kolom start dan stop (range tulisan akan ditampilkan)
parameter pesan adalah pointer yang menunjuk pada text yang ada pada memory program
atau memory flash.
Contoh cara penggunaan:
difinisikan dulu array dalam format flash misal: 
    __flash char pesan_1[]="HERLAMBANG ARIBOWO";
 
cara pemanggilan pesan.. misalkan pada line 0 LCD, start pada kolom 3 sampai kolom 9
maka syntaxnya:
    __go_runf(0,3,9,pesan_1);
syntax diatas akan menampilkan text "HERLAMBANG ARIBOWO" pada line 0 dari kolom
karakter LCD 3 sampai dengan kolom karakter 9 variable kolom karakter dari 0-15 default
atau bisa diubah dengan merubah definisi lcd_number.
*/
void __go_runf(char line,char start,char stop,__flash char *pesan);
 
//_______________________________________________________________________________
/*FUNGSI RUNNING TEXT (MOVING MESSAGE) - parameter pesan ada pada memory SRAM!
Cara kerja sama dengan fungsi __go_runf(), tetapi pointer menunjuk pada data
yang berlokasi pada SRAM.
Contoh cara penggunaan:
definisikan dulu array dalam SRAM  misal: 
    char pesan_1[]="HERLAMBANG ARIBOWO";   
 
cara pemanggilan pesan.. misalkan pada line 0 LCD, start pada kolom 3 sampai kolom 9
maka syntaxnya:
    __go_runr(0,3,9,pesan_1);
syntax diatas akan menampilkan text "HERLAMBANG ARIBOWO" pada line 0 dari kolom
karakter LCD 3 sampai dengan kolom karakter 9.
 
atau bisa juga dengan sprintf misalkan variabel buffer bernama pesan_1
definisikan dulu variabelnya:
    unsigned char pesan_1[25]="";
    char temperature = 100; //bwt nilai dummy aja..
isi pesan_1 dengan data menggunakan fungsi sprintf, misal menampilkan temperature
    sprintf(pesan_1,"SUHU: %2d%cC PUANAAAAS!",temperature,0xDF);
    _go_runr(0,0,15,pesan_1); //--tampilan FULL line 0 satu layar LCD 16chars
 
variable kolom karakter dari 0-15 default
atau bisa diubah dengan merubah definisi lcd_number.
*/
void __go_runr(char line,char start,char stop,char *pesan);
 
//_______________________________________________________________________________
//inisialisasi lcd
/*
contoh cara pemanggilannya:
    lcd_initmode(); cukup diawal program aja :D
*/                                                            
void lcd_initmode(void);
 
//_______________________________________________________________________________
/*Fungsi LCD PROGRESS BAR
"adapted from mAVRLIB" quoted from scienceprog.com lcd_lib for use with AVRGCC (WINAVR)
ported to CodeVisionAVR by Herlambang A. - www.nubielab.com
fungsi tampilan display progress bar, hehe males mo nulis ndiri, udah ada tinggal
dipake aja :D
baca keterangan inline explanationnya dah komplit sekali gk usah ditambahin
untuk keterangan lebih komplit silahkan buka nubielab_lcdlib.c
contoh:
for (i=0;i<100;i++){            //loop sampai 100
    lcd_gotoxy(0,1);            //ditampilkan pada lcd line1 mulai kolom1
    LCDprogressBar(i,100,16);   //i= nilai progress bar, 100= nilai maksimal prgrs bar
    }                           //16 = adalah nilai alokasi jumlah kolom untuk prgrs bar
*/
void LCDprogressBar(unsigned char progress, unsigned char maxprogress, unsigned int length);
//_______________________________________________________________________________
#pragma used-
 
#endif

E. LANGSUNG KE TKP SEDOOOT..
Sorry, untuk sementara dokumentasi masih minim dan belum dibuat dokumentasi secara terstruktur. Tapi perlu dicoba dulu siapa tau bisa jadi motivasi dan inspirasi untuk membuat library yang lebih baik..

Fungsi dan maksud program serta fungsi dari masing-masing (fungsi) program bisa dibaca pada inline explanation di sela baris kode.

Satu lagi yang antik.. nama fungsi seperti lcd_puts, lcd_putsf, lcd_putchar, lcd_gotoxy, lcd_clear, lcd_control ..ane buat sama dengan nama fungsi pada LCD library default CodeVisionAVR hehe.. jadi fungsi dasar sama, misal agan pake library default CodeVisionAVR sebelumnya, library ini bisa digunakan tanpa perubahan program yang significant :D

Sekali lagi kalo ada pertanyaan silahkan posting aja dikolom komentar yaw..

Ocreeeh, silahkan disedot gan… jangan lupa komeng dan cendolnya wkwkwkwk.. :ngacir:
File komplit Code + Simulasi bisa didownload disini: Nubielab_LCDLIB_V1.0beta.rar