Farikh_ notes


Jam Digital Menggunakan RTC DS1307 dengan Tampilan LCD dan 4 Tombol Menu

Posted in Uncategorized oleh farikhardiansyah pada Desember 13, 2012

Banyak kita jumpai jam digital menggunakan output lcd. Dalam projek ini saya akan menggunakan lcd 16×2 dengan 4 menu tombol (tombol menu, tombol ok, tombol up, dan tombol down). Dalam pembuatanya kita menggunaan RTC DS1307. RTC DS1307 berkomunikasi dengan antarmuka I2C (Inter Integrated Circuit).

RTC DS1307 memiliki pewaktu dalam variabel detik, menit, jam, hari, tanggal, bulan dan tahun. Selain itu, RTC ini menyediakan pin battery-backup untuk dihubungkan pada baterai lithium 3V atau catu daya lain sehingga ketika power (catu daya) mati, battery-backup akan mengambil alih dan timer tetap akan berjalan sebagaimana mestinya. Sedangkan kristal yang digunakan menurut datasheet bernilai 32,768 KHz.

 proteus

Disini saya menggunakan CodeWizardAVR pada Codevision AVR, yang sudah terdapat library untuk DS1307, maka kita akan dengan mudah dapat mengakses RTC DS1307. Setting seperti gambar dibawah ini:

  1. Kita tentukan chip yang digunakan dan crystal yang sesuai.

chip

2. Menentukan PORT mana yang akan kita gunakan sebagai ouput lcd.

 lcd

3. Mengaktifkan komunikasi I2C dan memilih DS1307.

 i2c

menurut CodeVisionAVR Help, terdapat beberapa instruksi untuk mengakses DS1307:

void rtc_init(unsigned char rs, unsigned char sqwe, unsigned char out)
Instruksi ini untuk inisialisasi DS1307, dimana:

Parameter rs digunakan untuk menghasilkan nilai dari frekuensi gelombang kotak pada pin SQW/OUT DS1307:

Jika rs bernilai:

0 untuk 1 Hz

1 untuk 4096 Hz

2 untuk 8192 Hz

3 untuk 32768 Hz

Jika parameter sqwe bernilai 1 maka output gelombang kotak pada pin SQW/OUT DS1307 akan di enable.Parameter out merupakan level logika pada pin SQW/OUT saat output gelombang kotak di disable (sqwe=0)

void rtc_get_time(unsigned char *hour, unsigned char *min, unsigned char *sec)
Intruksi ini untuk mendapatkan nilai *hour, *min dan *sec. Untuk variabel hour, min dan sec dapat kita ganti namanya sesuai keinginan kita tetapi harus bertipe data unsigned char.

void rtc_get_date(unsigned char *date, unsigned char *month, unsigned char *year)
Intruksi ini untuk mendapatkan nilai *date, *month dan *year. Untuk variabel date, month dan year dapat kita ganti namanya sesuai keinginan kita tetapi harus bertipe data unsigned char.

void rtc_set_time(unsigned char hour, unsigned char min, unsigned char sec)
intruksi ini digunakan untuk mengatur (setting) nilai hour, min, dan sec sesuai keinginan kita.

void rtc_set_date(unsigned char date, unsigned char month, unsigned char year)
intruksi ini digunakan untuk menset nilai date (tanggal), month (bulan) dan year (tahun) sesuai keinginan kita.

Berikut beberapa potongan program :

  • Program utama.

#include <mega8.h>

#include <delay.h>

#include <stdio.h>

#define     on      0

#define     off     1

#define     pb_mn     PINB.0

#define     pb_ok     PINB.1

#define     pb_down   PINB.3

#define     pb_up     PINB.2

bit setjam,setmenit,setday,setdate,setmonth,setyear;

// I2C Bus functions

#asm

.equ __i2c_port=0×15 ;PORTC

.equ __sda_bit=0

.equ __scl_bit=1

#endasm

#include <i2c.h>

// DS1307 Real Time Clock functions

#include <ds1307.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0×12 ;PORTD

#endasm

#include <lcd.h>

// Declare your global variables here

char mn=0,ok=0;

char *hari[]={“mond “,”tues “,”wed  “,”thurs”,”fry  “,”Sat  “,”sun  “};

unsigned char hour,minute,second,date,month,year,day;

unsigned char dec2bcd(unsigned char num)

{

return ((num/10 * 16) + (num % 10));

}

unsigned char bcd2dec(unsigned char num)

{

return ((num/16 * 10) + (num % 16));

}

void dectobcdrtc(void)

{

hour   = dec2bcd(hour);

minute = dec2bcd(minute);

second = dec2bcd(second);

day    = dec2bcd(day);

date   = dec2bcd(date);

month  = dec2bcd(month);

year   = dec2bcd(year);

}

void bcdtodecrtc(void)

{

hour   = bcd2dec(hour);

minute = bcd2dec(minute);

second = bcd2dec(second);

day    = bcd2dec(day);

date   = bcd2dec(date);

month  = bcd2dec(month);

year   = bcd2dec(year);

}

//=================================================

void gettimertc(void)

{

i2c_start();

i2c_write(0xd0);

i2c_write(0);

i2c_stop();

i2c_start();

i2c_write(0xd1);

second=i2c_read(1);

minute=i2c_read(1);

hour=i2c_read(1);

day=i2c_read(1);

date=i2c_read(1);

month=i2c_read(1);

year=i2c_read(0);

i2c_stop();

delay_ms(10);

bcdtodecrtc();

}

void settimertc(void)

{

dectobcdrtc();

i2c_start();

i2c_write(0xd0);

i2c_write(0);

i2c_write(second & 0x7F);

i2c_write(minute);

i2c_write(hour);

i2c_write(day);

i2c_write(date);

i2c_write(month);

i2c_write(year);

i2c_stop();

delay_ms(10);

}

void rtc_lcd(void)

{

lcd_gotoxy(0,0);

lcd_putsf(”  “);

lcd_gotoxy(4,0);

lcd_putchar((hour / 10)   + 48);

lcd_putchar((hour % 10)   + 48);

lcd_putchar(58);

lcd_putchar((minute / 10) + 48);

lcd_putchar((minute % 10) + 48);

lcd_putchar(58);

lcd_putchar((second / 10) + 48);

lcd_putchar((second % 10) + 48);

lcd_gotoxy(1,1);

lcd_puts(hari[day]);

lcd_putchar(0x2f);

lcd_putchar((date / 10)   + 48);

lcd_putchar((date % 10)   + 48);

lcd_putchar(58);

lcd_putchar((month / 10)   + 48);

lcd_putchar((month % 10)   + 48);

lcd_putchar(58);

lcd_putchar((year / 10)   + 48);

lcd_putchar((year % 10)   + 48);

}

void run_date()

{

gettimertc();

rtc_lcd();

}

  • Program untuk tombol (setting)

void set_Jam()

{

{

lcd_gotoxy(0,0);

lcd_putsf(“2.  Set Time   “);

if (pb_ok==0)

{

lcd_gotoxy(0,1);

lcd_putsf(”   Setting Hour      “);

delay_ms(700);

setjam=on;

}

while(setjam==on)

{

rtc_lcd();

gettimertc();

if (pb_up==0)

{

hour++;

delay_ms(300);

if(hour>23)hour=0;

settimertc();

}

if (pb_down==0)

{

hour–;

delay_ms(300);

if(hour<1)hour=23;

settimertc();

}

if (pb_ok==0)

{

lcd_gotoxy(0,1);

lcd_putsf(” Setting Minute “);

delay_ms(1000);

setjam=off;

setmenit=on;

}

while(setmenit==on)

{

rtc_lcd();

gettimertc();

if (pb_up==0)

{

minute++;

delay_ms(300);

if(minute>59)minute=0;

settimertc();

}

if (pb_down==0)

{

minute–;

delay_ms(300);

if(minute<1)minute=59;

settimertc();

}

if (pb_ok==0)

{

lcd_gotoxy(0,1);

lcd_putsf(”  set complete    “);

delay_ms(800);

setjam=off;

setmenit=off;

lcd_gotoxy(0,1);

lcd_putsf(”   push ‘ok’        “);

}

}

}

}

}

  • Program tombol menu

void menu()

{

switch(mn)

{

case 0:     run_date();     break;

case 1:     set_hari();     break;

case 2:     set_Jam();      break;

case 3:     set_Date();     break;

}

}

 

Demikian yang bisa saya post….

Semoga bermanfaat.. J

About these ads

11 Tanggapan to 'Jam Digital Menggunakan RTC DS1307 dengan Tampilan LCD dan 4 Tombol Menu'

Subscribe to comments with RSS atau TrackBack to 'Jam Digital Menggunakan RTC DS1307 dengan Tampilan LCD dan 4 Tombol Menu'.

  1. vickywicak said,

    amin

  2. andhika pratama said,

    wow, nice info bro..
    terimakasih banyak


    • sama2 mas..

      • andhika pratama said,

        mas, pada waktu dicoba kok g keluar angka jamnya ya..??


    • coba dicek pada pengaturan I2c…. pada square wave output di centang mas… kalau rtc sudah jalan…nanti pada lcd akan muncul dengan sendirinya.,

  3. adit said,

    gan ini avr versi brapa? q compile pakek avr 2.5.3 kq eror trus???
    invalid expression d char hari nya


    • ini versi 2.04 gan.,
      saya compile bisa kq gan.,

  4. bambang said,

    kalo boleh saya minta file nya mas
    kirim ke bambang.snap@gmail.com

    soalnya ad yg error mas pas di compile nuhun :)

  5. ian said,

    kalau ditambah, misalnya jam 18.00 LED ON.
    tambahan programnya gmn y mas?
    terima kasih

    • farikhardiansyah said,

      ya tinggal ditambah pengkondisi mas…
      if… else… gt aja.,

  6. Yudha said,

    Mas boleh minta filenya gax mas??
    Buat praktek mas.. Mohon bantuannya..

    Kalo bisa kirim email saya: yudhaipsoner@gmail.com
    Trimakasih,,,, :)


Berikan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Logout / Ubah )

Twitter picture

You are commenting using your Twitter account. Logout / Ubah )

Facebook photo

You are commenting using your Facebook account. Logout / Ubah )

Google+ photo

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s


Ikuti

Get every new post delivered to your Inbox.

Bergabunglah dengan 906 pengikut lainnya.

%d blogger menyukai ini: