Hot Posts

6/recent/ticker-posts

Graphic LCD 128x64 dengan AVR Mega32

Liquid Crystal Display (LCD) merupakan salah satu media tampilan yang sering dijumpai dalam kehidupan sehari-hari khususnya pada peralatan elektronika seperti telepon seluler, kalkulator, jam dan lain sebagainya. Berdasarkan tampilannya LCD dibedakan menjadi 2 macam, yaitu karakter dan grafik. Aplikasi kali ini akan memberikan sebuah contoh penggunaan Graphic LCD 128x64 yang akan menampilkan karakter dan gambar (grafik). Sebelumnya mari kita bahas atau berkenalan dulu dengan Graphic LCD 128x64 ini, kata pepatah mengatakan tak kenal maka tak sayang.. :)

Graphic LCD 128x64
Secara fisik lcd ini mempunyai dimensi yang cukup lebar dibanding dengan yang biasa kita pakai (2x16).











Seperti halnya namanya LCD ini mempunyai titik X sebanyak 128 (0-127) dan titik Y sebanyak 64 (0-63). Untuk lebih jelasnya lihat gambar berikut:


































Disamping dapat menampilkan grafik LCD ini juga dapat menampilkan text seperti halnya LCD karakter. Untuk memudahkan dalam pemrograman titik Y dibagi menjadi 8 yaitu Y0-Y7, Y8-Y15 dan seterusnya yang masing-masing memiliki lebar 8. Jadi jika ingin menampilkan text LCD ini mampu menampilkan text sebanyak 8 baris dan panjangnya maksimal adalah 16 karakter, karena masing-masing karakter lebarnya adalah 8 jadi 8x16=128. Tetapi bisa saja dengan membuat font lebih besar misal font Arial Black dengan ukuran 14. Seperti pada gambar berikut:












Tampilan LCD menampilkan text setandar yaitu ukuran font 12 Arial Black.













Tampilan LCD untuk menampilkan font yang lebih besar.

Dalam software Proteus jenis LCD ini dapat kita temukan pada library Optoelectronics-Graphic LCDs, disana banyak pilihan model tetapi yang akan digunakan disini adalah yang menggunakan driver KS0108 controllers. Lebih jelasnya lihat gambar sekematik berikut:


















Untuk programnya menggunakan CodeVisionAVR adalah:

#include
#include
#include
#include "graph.h"
#include "GLCD.h"
#include "font.h"
#include "string.h"
#include "stdlib.h"

#define menu    PINB.1  
#define up      PINB.2  
#define down    PINB.3
#define enter   PINB.4
#define LED1    PORTD.5
#define LED2    PORTD.6
#define LED3    PORTD.7

typedef unsigned char byte;

#define E_DELAY 3
#define DATAPORT PORTC
#define DATADDR DDRC
#define DATAPIN PINC
#define CS1 PORTD.0
#define CS2 PORTD.1
#define RS  PORTD.2
#define RW  PORTD.3

#define EN  PORTD.4

void tampil(void);
void set_suhu(void);

unsigned char str0[] = "SUHU";
unsigned char str1[] = "SET-1";
unsigned char str2[] = "SET-2";
unsigned char str3[] = "SET-3";

float suhu,suhu_cel;
float suhu_set1=50, suhu_set2=90, suhu_set3=110;
unsigned char temp[];
int indeks=0;

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void set_suhu()
{
  if (menu==0 && indeks==0)
  {
    delay_ms(300);
    glcd_off();
    indeks=1;
    while (menu==1 && indeks==1) 
    {
      delay_ms(100);
      glcd_on();
      glcd_clear();
      glcd_puts(str1,76,0,0,1,0);      
      ftoa(suhu_set1,0,temp);  
      glcd_puts(temp,76,1,0,1,0);      
      //-tombol up
      if (up==0)
      {
        delay_ms(200);
        suhu_set1+=10;
        if (suhu_set1>=1000)
          {
            suhu_set1=1000;
          }
      }
      //-tombol down
      if (down==0)
      {
        delay_ms(200);
        suhu_set1-=10;
        if (suhu_set1<=100)
          {
            suhu_set1=100;
          }
      }
      //-tbl enter 
      if (enter==0 && indeks==1)
      {
        delay_ms(200);
        indeks=2;
        glcd_clear();
      }
      
      if (menu==0 && indeks==1)
      {
        delay_ms(200); 
        indeks=2;
        glcd_clear(); 
      }
    }
  }
  
  if (menu==0 && indeks==2)   
  {
    delay_ms(300);
    indeks=3;
    while (menu==1 && indeks==3) 
    {
      delay_ms(100); 
      glcd_clear();
      glcd_puts(str2,76,3,0,1,0);      
      ftoa(suhu_set2,0,temp);
      glcd_puts(temp,76,4,0,1,0);       
      //-tombol up
      if (up==0)
      {
        delay_ms(200);
        suhu_set2+=10;
        if (suhu_set2>=2000)
        {
          suhu_set2=1500;
        }
      }
      //-tombol down
      if (down==0)
      {
        delay_ms(200);
        suhu_set2-=10;
        if (suhu_set2<=1000)
        {
          suhu_set2=1000;
        }
      }
      //-tbl enter
      if (enter==0 && indeks==3)
      {
        delay_ms(200);
        indeks=4;
        glcd_clear();
      }
      
      if (menu==0 && indeks==3)
      {
        delay_ms(200); 
        indeks=4;
        glcd_clear(); 
      }
    }
  }

  if (menu==0 && indeks==4)   
  {
    delay_ms(300);
    indeks=5;
    while (menu==1 && indeks==5) 
    {
      delay_ms(100);
      glcd_clear();
      glcd_puts(str3,76,6,0,1,0);       
      ftoa(suhu_set3,0,temp);
      glcd_puts(temp,76,7,0,1,0);       
      //-tombol up
      if (up==0)
      {
        delay_ms(200);
        suhu_set3+=10;
        if (suhu_set3>=2500)
        {
          suhu_set3=1500;
        }
      }
      //-tombol down
      if (down==0)
      {
        delay_ms(200);
        suhu_set3-=10;
        if (suhu_set3<=3000)
        {
          suhu_set3=2000;
        }
      }
      //-tbl enter
      if (enter==0 && indeks==5)
      {
        delay_ms(200);
        indeks=0;
        glcd_clear();
      }
      
      if (menu==0 && indeks==5)
      {
        delay_ms(200);
        glcd_clear(); 
        indeks=0; 
      }
    }
  }
}

//-tampilan GLCD
void tampil()
{               
glcd_puts(str0,5,1,0,2,0);       
//-kotak 
rectangle(0,0,75,63,0,1);         
rectangle(1,1,74,62,0,1);
//garis
h_line(2,27,72,0,1);             
//set
glcd_puts(str1,79,0,0,1,0);       
ftoa(suhu_set1,0,temp);  
glcd_puts(temp,79,1,0,1,0);      
glcd_puts(str2,79,3,0,1,0);       
ftoa(suhu_set2,0,temp);
glcd_puts(temp,79,4,0,1,0);       
glcd_puts(str3,79,6,0,1,0);       
ftoa(suhu_set3,0,temp);
glcd_puts(temp,79,7,0,1,0);       
}

void main(void)
{

#pragma used+
int i,j;
byte read_data;
byte read_arr[30];
#pragma used-

PORTB   = 0xFF;
DDRB    = 0x00;
DATADDR = 0xFF;
DDRD    = 0xFF;
PORTD   = 0xE7;
DDRC    = 0x0F;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

glcd_on();
glcd_clear();
delay_ms(500);

while(1)
  {
    tampil();
    set_suhu();
    suhu = read_adc(0);
    suhu_cel = (float)suhu*500/1023;    
    ftoa(suhu_cel,0,temp);       
    glcd_puts(temp,2,20,0,2,0);
    if (suhu>=50)
    { LED1=0; }
    if (suhu>=90)
    { LED2=0; }
    if (suhu>=110)
    { LED3=0; }
  } 
}

Post a Comment

20 Comments

  1. buatnya pakai cvavr vesi apa om?

    ReplyDelete
  2. Pak minta Library

    #include "graph.h"
    #include "GLCD.h"
    #include "font.h"

    ReplyDelete
  3. Pak minta Library nya

    #include "graph.h"
    #include "GLCD.h"
    #include "font.h"

    ReplyDelete
    Replies
    1. Library dapat di download di menu download mas norman, silahkan di sedot..
      maaf baru sembat balas, thanks...

      Delete
  4. om, kalau mau menampilkan grafik gelombang sinus bagaimana contoh programnya??

    ReplyDelete
  5. om, kalau mau menampilkan grafik sinyal, yg aq edit dr tutorial yg om berikan yg mana ?? ini pake atmega brp ?

    ReplyDelete
    Replies
    1. rutin tampilnya mas, disesuaikan dengan yang di library, sepertinya ada untuk gelombang sinus di library, thks.

      Delete
  6. mas ada nga yg pake atmega8535?
    kira2 apanya yang beda? cara pengaturan wizardnya di codevision bgaimna?
    mohon arahannya mas baru belajar tahap awal

    ReplyDelete
    Replies
    1. sama saja mas untuk mikro mega8553 tinggal ganti saja includenya dengan mega8535.h
      terus pada file project CVAVR pada menu configure the project-c compiler-code generation-chip ganti dengan mega8535

      Delete
  7. mas mikonnya bisa pake ATMega 328 ngga?

    ReplyDelete
    Replies
    1. Bisa saja, ganti include dan port menyedusikan...

      Delete
  8. kalo pake arduino IDE codingannya sama ngga mas?

    ReplyDelete
    Replies
    1. Kalau menggunakan arduino agak sedikit berbeda, yang membedakan program diantaranya compiler. Antara compiler/editor program dgn yg lain bisa berbeda.

      Delete
  9. mas bisa kasikan contoh program basic bascom pake atmega8535?
    mohon dibatu mas :(

    ReplyDelete
    Replies
    1. Kapan-kapan mas klo ada waktu, hehe....

      Delete
  10. udah setahun.. eh dua tahun lebih.. aku baru nemu ini.. contoh coding yang avr studio 4 ada ga gan?

    ReplyDelete
  11. Ada program bascomnya gan.,,kalau boleh kirim iya..... manafa784@gmail.com

    ReplyDelete
  12. mas kalau boleh saya minta library graphic nya mas

    ReplyDelete
  13. mas mau tanya rectangle(0,0,75,63,0,1); kalau yang di dalam kurung itu bisa dijelaskan tidak? terima kasih. semoga sukses terus

    ReplyDelete

Silahkan Tinggalkan Komentar Anda