1. ada yang punya contoh program pake bahasa C untuk LCD 2X16..
2. ic-nya pake at89c52 bisa ga?
3. ditunggu jwb dari yang bisa bantu. terima kasih
TOLONG DONG... dua minggu lagi, pengujian sistem, ada yg punya program LCD pake bahasa C ga?? + rangkaian nya + penjelasannya....
ada sih.. bekas ngerjain tugas kuliah dulu
tapi apa ga lebih baik kalau studi dulu, baru kalo ada masalah didiskusikan masalahnya
mungkin step-step nya:
pin-pin yg diperlukan <==> rangkaian
gimana caranya komunikasi sama lcd <==> instruksi lcd
baru ke implementasi programnya
saya juga agak lupa
Kutip dari: ksatriabajuhitam pada Mei 09, 2009, 05:17:46 PM
ada sih.. bekas ngerjain tugas kuliah dulu
tapi apa ga lebih baik kalau studi dulu, baru kalo ada masalah didiskusikan masalahnya
mungkin step-step nya:
pin-pin yg diperlukan <==> rangkaian
gimana caranya komunikasi sama lcd <==> instruksi lcd
baru ke implementasi programnya
saya juga agak lupa
kmaren da nyoba2 tp gagal terus + gosong,, yg terakhir nyoba lcd cm nyala tp gada tulisannya...
mungkin biar tambah PD kalo lcd ada tampilannya, tp cm ngblank doang + ada progrmnya heheh. ??? saya pake 4 bit buat datanya,( rs, rw, e) apa hrs ke port yg beda ya? soalnya 4 bitnya sy taro di p2.3 - p2.6 AT89S51
Wah.. ternyata ada juga pertanyaannya di sini yah?
Yawdah, berarti pembahasan tentang uC dan LCD kita bahas mendalam di sini ajah ya.
Sebelumnya, saya salin dulu yang pernah saya bahas di topik yang lain
(http://gedex.web.id/wp-content/uploads/2006/12/lcd_1602.jpg)
Konfigurasi pin LCD dan uC nya bisa macem-macem. Saya ambil kayak gini, sbg contoh :
[pin LCD] <--> [pin uC]
1 (Gnd) <--> 11 (Gnd)
2 (+5V) <--> 10 (Vcc)
4 (RS) <--> 22 (PC0)
5 (RD) <--> 23 (PC1)
6 (EN) <--> 24 (PC2)
11 (D4) <--> 26 (PC4)
12 (D5) <--> 27 (PC5)
13 (D6) <--> 28 (PC6)
14 (D7) <--> 29 (PC7)
Kalo pake program Code Vision gampang. Coz sudah ada unit dan fungsi tersendiri yang bisa langsung dipake. Namanya lcd.h
Contoh programnya :
#include
#asm
.equ __lcd_port=0x15
#endasm
#include
void main(void)
{
// inisialisasi LCD
lcd_init(16);
// menampilkan pada baris 0 dari kolom 0
lcd_gotoxy(0,0);
lcd_puts("Forum");
// menampilkan pada baris 1 dari kolom 0
lcd_gotoxy(0,1);
lcd_puts("Sains");
// agar nampak dan terus ditampilkan
while(1);
}
Secara teori sih begitu. Saya lupa lagi. Soalnya jarang pake LCD, biasanya langsung dikomunikasikan ke PC.
udah mulai ngebahas detail yah...
ayo lah,
yu mulai dari rangkaiannya...
1. Rangkaian
pin-pin yang diperlukan ialah:
RS --> gunanya untuk membedakan antara data (pin high) untuk ditampilkan atau untuk instruksi/register (pin low)
RW --> gunanya untuk mode baca (pin high) atau tulis (pin low), kita akan gunakan mode tulis saja (tidak membaca balik apa yg ditampilkan LCD), jadi pin ini di-pull-up resistor aja
E --> enable, untuk memberitahu LCD bahwa data sudah siap untuk dibaca (kasih falling edge signal dgn low state selama minimal 1000 ns)
DATA --> bisa mode 4-bit atau mode 8-bit
nah, jadi maksimal kita bisa menggunakan RS+RW+E+DATA = 11 pin microcontroller, minimal menggunakan RS+E+DATA(4-bit) = 6 pin microcontroller
kita akan gunakan yang minimal saja, maklum lah biasanya untuk aplikasi diusahakan menghemat pin (buat keypad, ADC, serial link, tombol, d.l.l.)
2. Perintah Dasar
untuk lengkapnya perintah apa aja yang tersedia, bisa merujuk ke datasheet LCD nya,
kita ambil contoh LCD dengan driver HD4478U dengan display 2x16 aja yg umum
kita gunakan perintah:
a. kirim data untuk ditampilkan
b. pindahkan kursor ke kanan/kiri
c. pindahkan kursor ke posisi (x,y)
yang lainnya ada bikin blinking, bikin tulisan berjalan; kita bahas ketiga/empat perintah di atas aja, soalnya itu yang pernah saya cobain
a. kirim data untuk ditampilkan
mode = 4-bit data
untuk menulis data: set RS high, lalu kirim 4-bit high data (high nibble), beri sinyal Enable, kirim 4-bit low data (low nibble), beri sinyal Enable
untuk "keamanan", kita matikan saja semua interupsi ketika menulis data,
kalo mau sih boleh aja diaktifkan
b. pindahkan kursor ke kanan/kiri
data perintahnya 0 - 0 - 0 - 1 - 0 - S/C - R/L - X - X
S/C = 0 untuk cursor move, 1 untuk display shift; jadi kita pake 0
R/L = 0 untuk ke kiri, 1 untuk ke kanan
jadi kita gunakan perintah 0x10 untuk pindahkan kursor ke kiri dan 0x14 untuk pindahkan kursor ke kanan
c. pindahkan kursor ke posisi (x,y)
untuk pindah ke posisi bebas, tiap cell karakter LCD diberi alamat, untuk 2x16 ialah sebagai berikut
{0x00,0x01,0x02,0x3,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},
{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F}
kirim data ini dengan RS=0 (menandakan perintah) untuk memindahkan kursor
ada satu lagi, yakni menginisialisasi LCD,
sebelum LCD siap digunakan, pelru diinisialisasi dulu
untuk contoh ini, dari datasheet bahwa harus dikirim urutan data berikut untuk menginisialisasi LCD
0x33, 0x32, 0x28, 0x0C, 0x06, 0x01
penjelsannya ada di datasheet
3. Implementasi
nah mulai deh coding nya
jadi fungsi-fungsi diperlukan ialah:
fungsi dasar:
LCD_command(command) untuk mengirim data sebagai perintah
LCD_putc(ascii) untuk mengirim 1 byte data untuk ditampilkan
fungsi untuk sinyal:
LCD_enable() memberi sinyal Enable
LCD_delay(ms) memberi delay
fungsi-fungsi turunan:
LCD_puts(lcd_string) memanggil LCD_putc berulang2 untuk menampilkan string
LCD_init() untuk menginisialisasi LCD
LCD_cur_right() memindahkan kursor ke kanan
LCD_cur_left() memindahkan kursor ke kiri
gotoxy(x, y) memindahkan kursor ke posisi x,y
wah, segitu dulu, ada yg ngajak makan :P,
nanti dilanjut di postingan selanjutnya untuk implementasi tiap fungsi nya
Kalo pake program Code Vision gampang. Coz sudah ada unit dan fungsi tersendiri yang bisa langsung dipake. Namanya lcd.h
Contoh programnya :
#include
#asm
.equ __lcd_port=0x15
#endasm
#include
void main(void)
{
// inisialisasi LCD
lcd_init(16);
// menampilkan pada baris 0 dari kolom 0
lcd_gotoxy(0,0);
lcd_puts("Forum");
// menampilkan pada baris 1 dari kolom 0
lcd_gotoxy(0,1);
lcd_puts("Sains");
// agar nampak dan terus ditampilkan
while(1);
}
Secara teori sih begitu. Saya lupa lagi. Soalnya jarang pake LCD, biasanya langsung dikomunikasikan ke PC.
[/quote]
mas insan, apa ini progrm uda lgsng nyala blm ya ke LCD? mksdnya uda tgl didownload ke IC,,,trimakasih
bisa dicoba. Dengan catatan, pemasangan pinnya cocok dgn keterangan sebelumnya
Kutip dari: insan sains pada Mei 16, 2009, 04:34:24 PM
Konfigurasi pin LCD dan uC nya bisa macem-macem. Saya ambil kayak gini, sbg contoh :
[pin LCD] <--> [pin uC]
1 (Gnd) <--> 11 (Gnd)
2 (+5V) <--> 10 (Vcc)
4 (RS) <--> 22 (PC0)
5 (RD) <--> 23 (PC1)
6 (EN) <--> 24 (PC2)
11 (D4) <--> 26 (PC4)
12 (D5) <--> 27 (PC5)
13 (D6) <--> 28 (PC6)
14 (D7) <--> 29 (PC7)
Kutip dari: insan sains pada Mei 16, 2009, 08:35:39 PM
bisa dicoba. Dengan catatan, pemasangan pinnya cocok dgn keterangan sebelumnya
ok, terimaksih dgn balasan yg begitu cepat, oya sy pake AT89s51,mudah2an bisa ya,,, ;D
bukannya CodeVision cuma untuk microcontroller jenis AVR ya,
???
ga tau kalo ada untuk keuarga MCS-51, (belum pernah pake CodeVision sih; padahal untuk personal user jadi free ya)
Kutip dari: ksatriabajuhitam pada Mei 16, 2009, 07:00:11 PM
...
wah, segitu dulu, ada yg ngajak makan :P,
nanti dilanjut di postingan selanjutnya untuk implementasi tiap fungsi nya
lanjut dah...
setelah mendisain fungsi-fungsi yang diperlukan, maka tinggal diimplementasikan,
#define LCD_DATA P2 // kita gunakan Port 2 sebagai data, sebetulnya cuma P2[0:3]
#define LCD_en P2_5 // enable LCD display
#define LCD_rs P2_4 // register select
#define LCD_DELAY 461 // bisa disesuaikan dengan frekuensi kristal yg digunakan
/* prototype fungsi dasar */
void LCD_delay(unsigned char ms);
void LCD_enable();
void LCD_command(unsigned char command);
void LCD_putc(unsigned char ascii);
/* fungsi turunan */
void LCD_puts(unsigned char *lcd_string);
void LCD_init();
/* implementasi fungsi dasar */
void LCD_delay(unsigned char ms)
{
unsigned char n;
unsigned int i;
for(n=0;n<ms;n++)
for(i=0;i<LCD_DELAY;i++);
}
void LCD_enable()
{
LCD_en = 0; // memberi sinyal falling edge
LCD_delay(1);
LCD_en = 1;
}
void LCD_command(unsigned char command)
{
LCD_rs = 0; // menandakan perintah
LCD_DATA = (LCD_DATA&0xF0)|((command>>4)&0x0F); // ambil high nibble, kirim
LCD_enable(); // beritahu driver LCD bahwa data telah siap
LCD_DATA = (LCD_DATA&0xF0)|(command&0x0F); // ambil low nibble, kirim
LCD_enable();
LCD_delay(1);
}
void LCD_putc(unsigned char ascii)
{
EA = 0; // (optional) matikan semua interrupt
LCD_rs = 1; // menandakan data untuk ditampilkan
LCD_DATA = (LCD_DATA&0xF0)|((ascii>>4)&0x0F);
LCD_enable();
LCD_DATA = (LCD_DATA&0xF0)|(ascii&0x0F);
LCD_enable();
EA = 1;
LCD_delay(1);
}
/* implementasi fungsi turunan */
void LCD_puts(unsigned char *lcd_string)
{
while(*lcd_string) /* scanning array data hingga null pointer (string habis) */
LCD_putc(*lcd_string++);
}
void LCD_init()
{
LCD_en = 1;
LCD_rs = 0;
LCD_command(0x33);
LCD_command(0x32);
LCD_command(0x28);
LCD_command(0x0C);
LCD_command(0x06);
LCD_command(0x01);
LCD_delay(256);
}
udah deh, save dengan nama antarmuka_lcd.h misalnya;
setelah punya fungsi-fungsi dasar tersebut, kita bisa bermain-main dengan instruksi LCD yang lain,
misalnya tambahkan instruksi baru berikut: (lihat data sheet untuk tabel instruksi yang tersedia)
untuk membersihkan layar --> perintah 0x01
untuk pindah ke baris-1 --> perintah 0x80
untuk pindah ke baris-2 --> perintah 0xC0
maka bisa ditambahkan deklarasi berikut:
...
#define LCD_clear() LCD_command(0x01)
#define LCD_row1() LCD_command(0x80)
#define LCD_row2() LCD_command(0xC0)
...
udah deh bisa dipake...
contoh:
void main()
{
LCD_init();
init_int();
init_baud();
baca_status_eeprom();
P1 = 0x00;
kembali_ke_main:
main_display(); // mode_main = mode_cari (1), mode_entry (2)
while(1)
{
LCD_clear();
// tambahin apa aja lah...
// sesuai keperluan...
}
}
saya pake compiler SDCC
:kribo:
waduh mana yg bener ne,, coba aja smuanyalah,,, sukur2 bisa, tp yg ptama ga bisa,, mudah2an yg kdua bisa,, saya punyanya microC,
Kutip dari: erik hardianto pada Mei 16, 2009, 08:43:20 PM
oya sy pake AT89s51,mudah2an bisa ya,,, ;D
Program yang saya lampirkan khusus untuk uC keluarga AVR dan dibuat pada Code Vision.
Seperti yang ksatriabajuhitam bilang
Kutip dari: ksatriabajuhitam pada Mei 16, 2009, 09:04:00 PM
bukannya CodeVision cuma untuk microcontroller jenis AVR ya,
???
Kalo membuat dengan software lain, berarti memang harus membuat dulu fungsi-fungsi untuk LCDnya itu sendiri. Sebagaimana yang dijelaskan sama ksatriabajuhitam. Ok, selamat mencoba. ^_^
uda nyoba, tp ga bisa.. kalo buat nampilin huruf , gmn programnya ya mas,,, saya pake compiler mikroC..
Kutip dari: erik hardianto pada April 26, 2009, 10:45:38 PM
1. ada yang punya contoh program pake bahasa C untuk LCD 2X16..
2. ic-nya pake at89c52 bisa ga?
3. ditunggu jwb dari yang bisa bantu. terima kasih
mas ksatriabajuhitam,,, LCDnya ga mau tampilin huruf kenapa ya... tolong dong, 4 hari lagi ni uji sistem...
@mas Erik :
Micro C nya yang untuk 8051 kan? soalnya Micro C kan banyak variasinya, ada yang untuk AVR, PIC, dll.
mas Erik mungkin bisa mendeskripsikan bagaimana proses perakitannya dari awal (baik secara hardware maupun software). Soalnya kalo dalam hal troubleshooting, hal-hal remeh saja bisa jadi satu-satunya penyebab. Kalo bisa melampirkan juga program yang sudah ditulis.
Kutip dari: insan sains pada Mei 25, 2009, 04:40:55 PM
@mas Erik :
Micro C nya yang untuk 8051 kan? soalnya Micro C kan banyak variasinya, ada yang untuk AVR, PIC, dll.
mas Erik mungkin bisa mendeskripsikan bagaimana proses perakitannya dari awal (baik secara hardware maupun software). Soalnya kalo dalam hal troubleshooting, hal-hal remeh saja bisa jadi satu-satunya penyebab. Kalo bisa melampirkan juga program yang sudah ditulis.
iya, sy pake AT89S51, ngomong2 masukin gambar gmn ya???
programnya ga beda jauh sama mas KBH:
#define LCD_DATA P2 // kita gunakan Port 2 sebagai data, sebetulnya cuma P2[0:3]
#define LCD_en P2_5 // enable LCD display
#define LCD_rs P2_4 // register select
#define LCD_DELAY 11.92 // bisa disesuaikan dengan frekuensi kristal yg digunakan
/* prototype fungsi dasar */
void LCD_delay(unsigned char ms);
void LCD_enable();
void LCD_command(unsigned char command);
void LCD_putc(unsigned char ascii);
/* fungsi turunan */
void LCD_puts(unsigned char *lcd_string);
void LCD_init();
void main(){
LCD_init();
LCD_puts("Ga Sukses");
while(1);
}
/* implementasi fungsi dasar */
void LCD_delay(unsigned char ms)
{
unsigned char n;
unsigned int i;
for(n=0;n<ms;n++)
for(i=0;i<LCD_DELAY;i++);
}
void LCD_enable()
{
LCD_en = 0; // memberi sinyal falling edge
LCD_delay(1);
LCD_en = 1;
}
void LCD_command(unsigned char command)
{
LCD_rs = 0; // menandakan perintah
LCD_DATA = (LCD_DATA&0xF0)|((command>>4)&0x0F); // ambil high nibble, kirim
LCD_enable(); // beritahu driver LCD bahwa data telah siap
LCD_DATA = (LCD_DATA&0xF0)|(command&0x0F); // ambil low nibble, kirim
LCD_enable();
LCD_delay(1);
}
void LCD_putc(unsigned char ascii)
{
EA = 0; // (optional) matikan semua interrupt
LCD_rs = 1; // menandakan data untuk ditampilkan
LCD_DATA = (LCD_DATA&0xF0)|((ascii>>4)&0x0F);
LCD_enable();
LCD_DATA = (LCD_DATA&0xF0)|(ascii&0x0F);
LCD_enable();
EA = 1;
LCD_delay(1);
}
/* implementasi fungsi turunan */
void LCD_puts(unsigned char *lcd_string)
{
while(*lcd_string) /* scanning array data hingga null pointer (string habis) */
LCD_putc(*lcd_string++);
}
void LCD_init()
{
LCD_en = 1;
LCD_rs = 0;
LCD_command(0x33);
LCD_command(0x32);
LCD_command(0x28);
LCD_command(0x0C);
LCD_command(0x06);
LCD_command(0x01);
LCD_delay(256);
}
IC LCD
p2.0 ------------------> D4
p2.1 ------------------> D5
p2.2 ------------------> D6
p2.3 ------------------> D7
p2.4 ------------------> RS
p2.5 ------------------> E
sama vcc+ground...
ketinggalan:
IC LCD
p2.0 ------------------> D4
p2.1 ------------------> D5
p2.2 ------------------> D6
p2.3 ------------------> D7
p2.4 ------------------> RS
p2.5 ------------------> E
sama vcc+ground...
Kutip dari: erik hardianto pada Mei 26, 2009, 11:24:31 AM
ketinggalan:
IC LCD
p2.0 ------------------> D4
p2.1 ------------------> D5
p2.2 ------------------> D6
p2.3 ------------------> D7
p2.4 ------------------> RS
p2.5 ------------------> E
sama vcc+ground...
niatnya cuma mau tampilin "Ga sukses"
e, ga sukses bener... apa sing salah ya mas???
mungkin masalah timing nya,
kalo ga mau ngitung cycle fungsi delay nya, coba2 pake nilai gede aja dulu
Kutip dari: erik hardianto pada Mei 26, 2009, 11:12:35 AM
...
#define LCD_DELAY 11.92 // bisa disesuaikan dengan frekuensi kristal yg digunakan
...
di deklarasi itu nilai delai harus bulat, maksudnya disesuaikan itu:
(cycle yg dibutuhkan untuk 1 loop fungsi delay) x (1/freq_crystal x pembagi*) x LCD_DELAY
*) pembagi : beberapa microcontroller, misal keluarga 8051 umumnya tipe CISC, memerlukan tahapan proses yg menyebabkan clock internalnya hanya menggunakan freq_crystal / pembagi. untuk 8051 nilai pembaginya 12.
Kutip dari: ksatriabajuhitam pada Mei 26, 2009, 08:35:18 PM
mungkin masalah timing nya,
kalo ga mau ngitung cycle fungsi delay nya, coba2 pake nilai gede aja dulu
di deklarasi itu nilai delai harus bulat, maksudnya disesuaikan itu:
(cycle yg dibutuhkan untuk 1 loop fungsi delay) x (1/freq_crystal x pembagi*) x LCD_DELAY
*) pembagi : beberapa microcontroller, misal keluarga 8051 umumnya tipe CISC, memerlukan tahapan proses yg menyebabkan clock internalnya hanya menggunakan freq_crystal / pembagi. untuk 8051 nilai pembaginya 12.
uda di ganti smua ko ga mau tampilin jurum juga ya mas... knp ini?
Dari keterangan mas Erik
- Hardware udah bener
- Program gak ada yang salah
- Freq-nya udah diubah
Apa di compilernya yach?
Apa mungkin di deklarasi portnya yach?
Misal kayak deklarasi ini :
#define LCD_en P2_5
Di AVR Studio, saya biasanya nulis :
#define LCD_en P2.5
Kalo di GCC, saya biasanya nulis :
#define LCD_en PB5
Apa karena ini bukan yach?
Kutip dari: ksatriabajuhitam pada Mei 26, 2009, 08:35:18 PM
mungkin masalah timing nya,
kalo ga mau ngitung cycle fungsi delay nya, coba2 pake nilai gede aja dulu
di deklarasi itu nilai delai harus bulat, maksudnya disesuaikan itu:
(cycle yg dibutuhkan untuk 1 loop fungsi delay) x (1/freq_crystal x pembagi*) x LCD_DELAY
*) pembagi : beberapa microcontroller, misal keluarga 8051 umumnya tipe CISC, memerlukan tahapan proses yg menyebabkan clock internalnya hanya menggunakan freq_crystal / pembagi. untuk 8051 nilai pembaginya 12.
smua yg ditulis gada yg ngerti,,, mksdnya apa ya mas??
- Freq-nya udah diubah
Apa di compilernya yach?
[/quote]
1. freq,nya sy pake 12,,
2. compilernya? ga ngerti maksudnya??
hampir 2 minggu gak baca topik ini, gimana perkembangannya nie?
iya ni ditunggu,, sampe prustasi,, gada jwban, jd sy pake prog, punya tmn pake bahasa asembly, tp ga sesempurna yg diinginkan.. bingung,,, , kalo bisa yg pake bahasa c, jd smpurna.. 1 juli sidang.. kalo ada yg masi bisa bantu, ditunggu. jd malaikat buat saya, soalnya uda 7 tahun kulia. detik2 terakhir :)
coba post aja program assembly nya, siapa tau kita-kita di sini bisa bantu convert ke c
Kutip dari: ksatriabajuhitam pada Juni 13, 2009, 07:44:53 AM
coba post aja program assembly nya, siapa tau kita-kita di sini bisa bantu convert ke c
program nya,,,
$mod51
ORG 00H
MAIN:
LCD_RS EQU P3.5
LCD_RW EQU P3.6
LCD_EN EQU P3.7
MAIN_PROGRAM:
LCALL INITIALIZE_LCD
MOV A,#80H
LCALL ADDRESS
MOV DPTR,#TEST
LCALL TRANSFER
ENDD:
JMP ENDD
;*************************************************
;-------------INITIALIZATION LCD------------------
;*************************************************
INITIALIZE_LCD:
CLR LCD_EN ;INIT 00110000B
CLR LCD_RW
CLR LCD_RS
MOV P1,#00110000B
SETB LCD_EN
LCALL DELAY1
CLR LCD_EN ;INIT 00110000B
CLR LCD_RW
CLR LCD_RS
MOV P1,#00110000B
SETB LCD_EN
LCALL DELAY1
CLR LCD_EN ;INIT 00110000B
CLR LCD_RW
CLR LCD_RS
MOV P1,#00110000B
SETB LCD_EN
LCALL DELAY1
CLR LCD_EN ;0 0 1 DL N F X X
CLR LCD_RW ;DL = 1 => 8BIT DL = 0 => 4BIT
CLR LCD_RS ;N = 1 => 2LINES N = 0 => 1LINE
MOV P1,#00111000B ;F = 1 => 5X10 F = 0 => 5X7
SETB LCD_EN ;==> 8BIT AND 2LINES
LCALL DELAY1
CLR LCD_EN ;0 0 0 0 1 D C B
CLR LCD_RW ;D = 1 => DISP_ON D = 0 => DISP_OFF
CLR LCD_RS ;C = 1 => CURSOR_ON C = 0 => CURSOR_OFF
MOV P1,#00001100B ;B = 1 => BLINK_ON B = 0 => BLINK_OFF
SETB LCD_EN ;==> DISP_ON, CURSOR OFF AND BLINK OFF
LCALL DELAY1
CLR LCD_EN ;0 0 0 0 0 1 I/D S
CLR LCD_RW ;I/D= 1 => INCREMENT I/D= 0 => DECREMENT
CLR LCD_RS ;S = 1 => DISP SHIFT S = 0 => NO DISP SHIFT
MOV P1,#00000110B ;==> INCREMENT AND NO DISP SHIFT
SETB LCD_EN
LCALL DELAY1
CLR LCD_EN
RET
;*************************************************
;*************************************************
;------------------CONTROL LCD--------------------
;*************************************************
CURSOR_BLINK:
MOV A,#0FH ; 0 0 0 0 1 1 1 1 ==> ( 0 0 0 0 1 D C B )
LCALL COMMAND ; DISPLAY ON, CURSOR ON AND BLINK ON
RET
CURSOR_OFF:
MOV A,#0CH ; 0 0 0 0 1 1 0 0 ==> ( 0 0 0 0 1 D C B )
LCALL COMMAND ; dISPLAY ON, CURSOR OFF AND BLINK OFF
RET
CURSOR_CUSTOM:
MOV A,#0C0H ; 1 1 0 0 0 0 0 0 ==> ( ??????????????????
LCALL COMMAND
RET
CLEAR_DISPLAY:
MOV A,#01H ; CLEAR DISPLAY
LCALL COMMAND
RET
HOME:
MOV A,#03H ; SET DDRAM ADD TO 00H
LCALL COMMAND ; RETURN CURSOR TO ORIGINAL POSITION IF SHIFTED
RET
SHIFT_LEFT_SCREEN:
MOV A,#18H ; 0 0 0 1 1 0 0 0 ==> ( 0 0 0 1 S/C R/L X X )
LCALL COMMAND ; S/C = 1 DISP SHIFT S/C = 0 CURSOR MOVE R/L = 1 RIGHT SHIFT R/L = 0 LEFT SHIFT
RET ; DISP SHIFT AND LEFT SHIFT
SHIFT_RIGHT_SCREEN:
MOV A,#1CH ; 0 0 0 1 1 1 0 0 ==> ( 0 0 0 1 S/C R/L X X )
LCALL COMMAND ; S/C = 1 DISP SHIFT S/C = 0 CURSOR MOVE R/L = 1 RIGHT SHIFT R/L = 0 LEFT SHIFT
RET ; DISP SHIFT AND RIHT SHIFT
;*************************************************
;*************************************************
;------------------INTERFACE LCD------------------
;*************************************************
COMMAND:
MOV P1,A
CLR LCD_EN
CLR LCD_RW
CLR LCD_RS
LCALL DELAY0
SETB LCD_EN
LCALL DELAY0
CLR LCD_EN
RET
CLEAR_SCREEN:
CLR LCD_EN
CLR LCD_RS
CLR LCD_RW
MOV P1,#00000001B
LCALL DELAY0
SETB LCD_EN
LCALL DELAY0
CLR LCD_EN
RET
ADDRESS:
CLR LCD_EN
CLR LCD_RW
CLR LCD_RS
MOV P1,A
LCALL DELAY0
SETB LCD_EN
LCALL DELAY0
CLR LCD_EN
RET
WRITE_ON:
MOV P1,A
CLR LCD_EN
CLR LCD_RW
SETB LCD_RS
LCALL DELAY0
SETB LCD_EN
LCALL DELAY0
LCALL DELAY0
CLR LCD_EN
RET
TRANSFER:
CLR A
MOVC A,@A+DPTR
INC DPTR
CJNE A,#0FFH,TRANS
LJMP EXIT
TRANS:
MOV P1,A
LCALL WRITE_ON
LJMP TRANSFER
EXIT:
RET
;*************************************************
;*************************************************
;------------------TIMER DELAY--------------------
;*************************************************
DELAY0:
PUSH 7
MOV R7,#1
SUB_DELAY0:
MOV TMOD,#00000001B ; 1023 X TIMES
MOV TH0,#0FCH
MOV TL0,#00H
SETB TR0
TF0?0:
JNB TF0,TF0?0
CLR TR0
CLR TF0
DJNZ R7,SUB_DELAY0
POP 7
RET
DELAY1:
PUSH 7
MOV R7,#1
SUB_DELAY1:
MOV TMOD,#00000001B ; 24575 X TIMES
MOV TH0,#0A0H
MOV TL0,#00H
SETB TR0
TF0?1:
JNB TF0,TF0?1
CLR TR0
CLR TF0
DJNZ R7,SUB_DELAY1
POP 7
RET
DELAY2:
PUSH 7
MOV R7,#1
SUB_DELAY2:
MOV TMOD,#00000001B ; 10903 X TIMES
MOV TH0,#0D5H
MOV TL0,#68H
SETB TR0
TF0?2:
JNB TF0,TF0?2
CLR TR0
CLR TF0
DJNZ R7,SUB_DELAY1
POP 7
RET
;*************************************************
TEST:
DB 'KODE KIR' , 0FFH
END
Kutip dari: erik hardianto pada Juni 11, 2009, 02:10:22 AM
iya ni ditunggu,, sampe prustasi,, gada jwban, jd sy pake prog, punya tmn pake bahasa asembly, tp ga sesempurna yg diinginkan.. bingung,,, , kalo bisa yg pake bahasa c, jd smpurna.. 1 juli sidang.. kalo ada yg masi bisa bantu, ditunggu. jd malaikat buat saya, soalnya uda 7 tahun kulia. detik2 terakhir :)
tidak sesempurna yg di inginkan? gejalanya apa?
;D
wew, mepet ya?
ya dah neh ada pake C mode 8bit.
saia attach lengkap:
program dengan Keil uVision3 C51 V8.16
schematic dan simulasi dengan ISIS Proteus V7.4SP3.
jangan nanya ya.. kenapa pilih warna ungu bwt komponennya :D kakakaka
ntar kalo butuh yg versi assembly-nya tinggal ngomong aja.. ^^"
semoga cepet lulus..
wkkk............
Parah neh erik keknya g punya basic sama sekali..
Klo pake AVR tipe ATmega misalnya ATmega8535 gunakan CodevisionAVR seperti dibilang ma Insan.
Klo MCS51 g ada fugnsinya d CodevisionAVR jadinya bikin sendiri dseperti yg dibilang ma KEsatriaBajuHitam.
Klo asal nyoba ya ga jalan laa...
Coding kesatriabajuhitam udah lebih dari jelas itu tinggal digabungin aja antara main program (.c) dengan librarynya (.h)
Sabar aja n pelajari 1-1 g usa buru" harusnya jalan itu.
Cobain lisitng dari Herlambang mudah-mudahan bisa.
Saya basic MCS51 bahasa assembler n klo program LCD pake MCS51 pake bahasa assembler. sempurna kok g da salahnya.
Klo bahasa C pake AVR CodeVisionAVR n beberapa penulisan berbeda dengan KeilC
Comment tentang listing KBH n Erik di bawah ini.....
kesalahan :
#define LCD_DELAY 461 // disesuaikan dengan frekuensi kristal yg digunakan
void LCD_delay(unsigned char ms); ganti dengan
void delay_ms (unsigned int ms);
alasan
1. unsigned char range 0 - 255 sedangkan unsigned int range 0 - 65535
untuk 1 detik manggilnya kan delay_ms(1000); klo unsigned char tidak sampai (max 255)
2. sudah ada #define LCD_DELAY 461 nanti rancu dengan void LCD_delay, klo error g ketahuan salahnya
kan bahasa C case sensitif (huruf besar dan huruf kecil berbeda).
Lihat listing delay
/* implementasi fungsi dasar */
void LCD_delay(unsigned char ms)
{
unsigned char n;
unsigned int i;
for(n=0;n<ms;n++)
for(i=0;i<LCD_DELAY;i++);
}
Si KBH nilai LCD_DELAY nya = 461
si ERIK nilai LCD_DELAY nya = 11.92 (keknya kristal tuh 11.0592 deh)
untuk for loop tidak ada nilai pecahan harusnya (for(i=0;i<12;i++); bukan for(i=0;i<11.92;i++);
selain itu ini bukan delay 1 milisekon menurutku salah neh.
klo untuk delay pada mikro gunakan kristal 12MHz
alasan : biar perhitungan delay bulat.
klo komunikasi UART dengan komputer atau perangkat lain dgn kristal 11.0592MHz
alasan : baudrate tertentu akan menghasilkan error.
listingku cobain
void delay_ms(unsigned int ms)
{
unsigned int loop;
while (ms--)
{
loop=1000;
while (loop--) {} //tunda 1ms bisa juga tambahkan _nop_ dalam {}
}
}
untuk kristal 12 MHz 1 siklus mesin = 1uS, jadi 1 _nop_ = 1uS.
saya tidak menambahkan _nop_ karena asumsi 1 siklus while(loop--) = 1uS.
1 mS = 1000 uS jadi...
x mS = x * 1000 * 1 uS ; gimana ?
emang ga ngerti program,,, jd yg diatas tgl tambahin doang ya???? saya pake MikroC yg warna biru,,, bukan AVR, jd kalo bisa yg salah tolong ditambahin ya...
@Too Payz
thanks koreksinya,
jago microcon nih kayaknya, selamat bergabung dan sharing :D
(tapi kok program saya jalan tuh (compiler-nya SDCC), atau mungkin sdcc ga ngasih pesan error aja kali, tapi nilainya langsung truncated (dibuang lebihnya) ketika run-time)
Kutip dari: ksatriabajuhitam pada Juni 28, 2009, 02:49:33 PM
(tapi kok program saya jalan tuh (compiler-nya SDCC), atau mungkin sdcc ga ngasih pesan error aja kali, tapi nilainya langsung truncated (dibuang lebihnya) ketika run-time)
Pesan applikasi (compiler) di buat oleh pembuat program compiler SDCC, dan untuk pesan ada yang tergolong ERROR dan WARNING.
Biasanya yang diutamakan ERROR dulu untuk di buat daftar pesan saat terjadi error (kesalahan listing program), jadi yang WARNING biasanya "nanti dulu" untuk versi berikutnya.
Mungkin tidak keluar karena termasuk WARNING dan bukan ERROR, atau mungkin sebenarnya ERROR yang tidak terdeteksi atau belum di buat daftarnya oleh pembuat Compiler SDCC tersebut.
Masi belajar mikro juga kok ini... :D
trus gmn ne jadinya
tuh ada solusi lain dari herlambang, kalo mau dicoba
(saya juga belum liat code nya)
Kutip dari: herlambang pada Juni 23, 2009, 09:38:07 AM
;D
wew, mepet ya?
ya dah neh ada pake C mode 8bit.
saia attach lengkap:
program dengan Keil uVision3 C51 V8.16
schematic dan simulasi dengan ISIS Proteus V7.4SP3.
jangan nanya ya.. kenapa pilih warna ungu bwt komponennya :D kakakaka
ntar kalo butuh yg versi assembly-nya tinggal ngomong aja.. ^^"
semoga cepet lulus..
@herlambang
asli ga software nya? (hehe, saya juga punya yang bajakan :P )
emang mantep itu software ISIS (sebetulnya VSM sih buat simulasinya), Electronics Workbench lewat lah...
Kutip dari: ksatriabajuhitam pada Juni 29, 2009, 08:27:09 PM
@herlambang
asli ga software nya? (hehe, saya juga punya yang bajakan :P )
emang mantep itu software ISIS (sebetulnya VSM sih buat simulasinya), Electronics Workbench lewat lah...
;D tau sendiri lah gan.. lisensinya aja selangit dan daripada tidak pake, mendingan pake yang >:D
^^" ..
Yups.. tul gan EWB yang terbarupun (ganti nama jadi NI Designer (dibeli National Instrument))
masih kalah kalo bwt simulasi mikrokontroler dan peripheralnya..
mungkin kelebihan NI di FPGA dan circuit analisisnya..
BTW, nyaman banget pake Proteuss... thanx 4 Labcenter Electronics ;D
Kutip dari: herlambang pada Juni 30, 2009, 05:26:40 AM
BTW, nyaman banget pake Proteuss... thanx 4 Labcenter Electronics ;D
coba altium deh, jauh lebih enak
Kutip dari: tAZZZ pada Juli 30, 2009, 02:18:08 PM
Kutip dari: herlambang pada Juni 30, 2009, 05:26:40 AM
BTW, nyaman banget pake Proteuss... thanx 4 Labcenter Electronics ;D
coba altium deh, jauh lebih enak
masih enakan proteus untuk VSM.
tolong.....^ ^
w anggota bru nie..hehehe
blh mnta tlng y....
mnta cntoh program bhsa C tp untuk tampilan ke LCD sie ??
tolong beritahu dan informasinya untuk lcd2x16 ke atmega128 bisa tidak yah???melihat lcd saya berjenis LMB162AFC apakah sama???
Kutip dari: herlambang pada Juni 23, 2009, 09:38:07 AM
;D
wew, mepet ya?
ya dah neh ada pake C mode 8bit.
saia attach lengkap:
program dengan Keil uVision3 C51 V8.16
schematic dan simulasi dengan ISIS Proteus V7.4SP3.
jangan nanya ya.. kenapa pilih warna ungu bwt komponennya :D kakakaka
ntar kalo butuh yg versi assembly-nya tinggal ngomong aja.. ^^"
semoga cepet lulus..
sudah bisa tersenyum,, sudah lulus kang mas... maturnuwun doanya,,, ;D
@erik...
selamat bro.... udeh lulus ya? hahah ikutan seneng dah :D
MAs Herlambang
punya contoh program c untuk mikrokontroler jenis pic16f877a ngk? yang make keypad sama LCD?
saya lagi bingung neh cara program make keypadnya...
n buat mas - mas yang lainnya ada yang punya ngk contoh-contohnya? makasih yah sebelumnya. ane anak baru neh.... hehehe :)