05/02/10

Pemrograman LCD 16X2



Pemrograman LCD 16X2


Yogyakarta-- Setelah sekitar 1Thn LCD 16X2 saya tinggalkan karena berbagai faktor untuk beralih ke 7'Segment Display. Salah satunya pengurangan beberapa fitur pada weighing bed. Ternyata keadaan membuat saya harus mengunakan LCD lagi untuk produk rancangan baru perusahaan. Dan karena managemenfile yang kurang baik saya semua catatan revisi hilang. Mau tak mau saya harus membuka memory lebih dalam untuk memprogram. Karena alasan itulah saya mencoba membagi pengetahuan saya tentang LCD. Disamping mempermudah saya mencari data tentang LCD juga ingin membagi kepada para teman-teman tentang LCD 16X2 ini.

Pengertian

LCD (Liquid Crystal Display)
LCD yang saya gunakan M1632 produksi seiko instrument inc. Yang memiliki Beberapa Fitur:
16 karakter, 2 Line, 5X7 dot matrik.
Duti rasio:1/16
konsumsi daya rendah
pilihan interface 4bit/8bit data
mempunyai beberapa fungsi tambahan: display clear, cursor on/off, blink karakter,cursor shift, display shift.
5V DC Supply
reset otomatis pada saat power on
oscilator tertanam didalam.

Ada 2 cara utk berkomunikasi dengan LCD, yaitu 8 bit dan 4 bit jalur data. Selain 8 atau 4 jalur yang terhubung dengan kontroler, dibutuhkan 3 jalur lagi untuk kontrol, yaitu RS, RW dan EN. Namun jika kita hanya ingin menuliskan data tanpa membaca data hubungkan saja RW ke Ground.
Sedangkan untuk pemrograman kita dapat memilih beberapa jenis a/l: AVR Studio, Win AVR, Bascom AVR, Codevision. Dengan catatan jika mengunakan Bascom AVR port Data LCD telah disesuaikan oleh Compiler. Jadi jika kita membutuhkan beberapa interup pada port tertentu pada Chipkita tidak begitu leluasa. Sementara ini untuk keluesan dalam memprogram saya anjurkan mengunakan AVR Studio yang tersedia secara gratis.

Berikut contoh pengunaan program LCD 16X2 dalam Bahasa Assembly AVR Studio:

;---------------------------------------------------
;---------------------------------------------------
;*****************nYOBA_MANING**********************
; LATIHAN NULIS di LCD
; BASIL
; * LCD_4wire_Data=PORTD
; * Data_4 : 0,Data_5 : 1,Data_6 : 2,Data_7 : 3
; * E : 4,RS : 5,B_light : 6
;---------------------------------------------------
;---------------------------------------------------
.cseg

.include "m8def.inc" ;AVR-AT Mega8**********

rjmp reset ;00.reset vector
reti ;01.INT0 External Interrupt Request 0
reti ;02.INT1 External Interrupt Request 1
reti ;03.TIMER2 COMP Timer/Counter2 Compare Match
reti ;04.TIMER2 OVF Timer/Counter2 Overflow
reti ;05.TIMER1 CAPT Timer/Counter1 Capture Event
reti ;06.TIMER1 COMPA Timer/Counter1 Compare Match A
reti ;07.TIMER1 COMPB Timer/Counter1 Compare Match B
reti ;08.TIMER1 OVF Timer/Counter1 Overflow
reti ;09.TIMER0 OVF Timer/Counter0 Overflow
reti ;10.SPI, STC Serial Transfer Complete
reti ;11.USART, RXC USART, Rx Complete
reti ;12.USART, UDRE USART Data Register Empty
reti ;13.USART, TXC USART, Tx Complete
reti ;14.ADC Conversion Complete
reti ;15.EE_RDY EEPROM Ready
reti ;16.ANA_COMP Analog Comparator
reti ;17.TWI Two-wire Serial Interface
reti ;18.SPM_RDY Store Program Memory Ready
rjmp reset

reset: ldi r16,high(ramend) ; space RAM
out SPH,r16 ;
ldi r16,low(ramend) ;
out spl,r16 ;

ldi r18,1 ; 1cycle
rcall d100ms ; 4cycle

;definisi portd sbg output

; ldi r16,0b00111111
ser r16
out ddrd,r16
; ldi r16,0b11000000
clr r16
out portd,r16

rcall inisLCD

ldi r18,1 ; 1cycle
rcall d100ms ; 4cycle
A:
rcall lcdclr
ldi r18,10
rcall d100ms

;Meletakan Kata1
ldi r16,0x80 ;80=lcd baris#1
rcall lcdcmd
ldi r16,'A'
rcall lcddata
ldi r18,10
rcall d100ms
ldi r16,0x81 ;80=lcd baris#1
rcall lcdcmd
;Menampilkan Kata1
ldi zl,low(2*basil)
ldi zh,high(2*basil)
rcall lcd_word
ldi r18,10
rcall d100ms
;Meletakan Kata2
ldi r16,0xc0 ;c0= lcd baris#2
rcall lcdcmd
nop
;Menampilkan Kata2
ldi zl,low(2*div)
ldi zh,high(2*div)
rcall lcd_word

ldi r18,10
rcall d100ms
rjmp A
xxx: rjmp xxx

lcdclr:
ldi r16,1 ;Clear LCD command
rcall lcdcmd
ldi r18,1
rcall d100ms
ret
;---------------------------------------------------
;address prog memory= Zreg(ZH&ZL)
;---------------------------------------------------
;menentukan jmlh character
;---------------------------------------------------
LCD_Word:
ldi r17,16 ;16 character
LCD_Word1:
lpm r16,Z+
rcall LCDdata
dec r17
brne LCD_Word1
ret

;---------------------------------------------------
;inisialisasi lcd
;---------------------------------------------------
inisLCD:
;delay power on
; ldi r17,200 ; 1cycle
; rcall d100us ; 4cycle
;inisialisasi_1
cbi portd,5
nop
sbi portd,4
nop
ldi r16,0b00000011
ori r16,0b00010000
out portd,r16
rcall LCD_Clk
rcall dLCD
;inisialisasi_2
cbi portd,5
nop
sbi portd,4
nop
ldi r16,0b00000011
ori r16,0b00010000
out portd,r16
rcall LCD_Clk
rcall dLCD
;inisialisasi_3
cbi portd,5
nop
sbi portd,4
nop
ldi r16,0b00000011
ori r16,0b00010000
out portd,r16
rcall LCD_Clk
rcall dLCD
;inisialisasi_4
cbi portd,5
nop
sbi portd,4
nop
ldi r16,0b00000010
ori r16,0b00010000
out portd,r16
rcall LCD_Clk
rcall dLCD
;inisialisasi_5
ldi r16,0b00101000
rcall lcdcmd
rcall dlcd
;inisialisasi_6
ldi r16,0b00001000
rcall lcdcmd
rcall dlcd
;inisialisasi_7
ldi r16,0b00000001
rcall lcdcmd
rcall dlcd
;inisialisasi_8
ldi r16,0b00000110
rcall lcdcmd
rcall dlcd
;inisialisasi_9
ldi r16,0b00001100
rcall lcdcmd
rcall dlcd
ret

;---------------------------------------------------
lcdcmd:
push r17

cbi portD,5
nop
sbi portd,4
mov r17,r16
swap r17 ;msb-lsb
andi r17,0b00001111 ;hapus nible atas
ori r17,0b00010000
out portd,r17
rcall LCD_Clk

sbi portd,4
mov r17,r16
andi r17,0b00001111 ;hapus nible atas
ori r17,0b00010000
out portd,r17
rcall LCD_Clk

pop r17
ret

;---------------------------------------------------
lcddata:
push r17

sbi portd,5
nop
sbi portd,4
mov r17,r16
swap r17 ;<<<>>>
andi r17,0b00001111 ;hapus nible atas
ori r17,0b00110000
out portd,r17
rcall LCD_Clk

sbi portd,4
mov r17,r16
andi r17,0b00001111 ;hapus nible atas
ori r17,0b00110000
out portd,r17
rcall LCD_Clk

pop r17
ret

;---------------------------------------------------
LCD_Clk:
sbi portd,4
rcall dclk
cbi portd,4
rcall dclk
ret
dLCD:
push r17
ldi r17,50 ; 1cycle
rcall d100us ; 4cycle
pop r17
ret
dclk:
push r17
ldi r17,20
dclk_loop:
dec r17
brne dclk_loop
pop r17
ret
;---------------------------------------------------
;****************************************
; Delay for 8MHz Clock/=<8mips regfile = "m8def.dat" crystal =" 4000000" portd =" Output" lcd =" 16" lcdpin =" Pin" rs =" Portd.4" e =" Portd.5" db4 =" Portd.0" lcdpin =" Pin" db5 =" Portd.1" db6 =" Portd.2" db7 =" Portd.3" date =" Mdy" separator =" /" clock =" Soft">

2 komentar:

Iwan FX mengatakan...

aq nyoba programnya kok ga bs ya bos?mohon pencerahan,aq pake atmega8532

Sarana Solusi Otomasi mengatakan...

gan itu vcc untuk lcd drive nya langsung sambung ke gnd tanpa pake vr gpp ya ?