Pages

Minggu, 09 November 2014

Jam Digital dengan ATmega8 dan RTC DS1307

Nahhh.. kali ini udah bisa bikin jam digital dengan sekaligus tampilan kalender..

disini saya bikin jamnya pake microkontroller ATmega8 lagi deeehh, si kecil yang gesiiitttt,, hehehe, dan saya pake RTC DS1307 untuk real time nya..


bagi sobat yang suka utak atik micro controller, nih boleh kalo mau bikin percobaan membuat jam dengan tampilan SevenSegment..
 disini nanti ada 2 tombol Push Button untuk setting Jam dan kalendernya.. hehehee.. oke deh di bawah ini adalah skemanya..
















#include <mega8.h>
#asm
.equ __i2c_port=0x18    ;portc
.equ __sda_bit=1    
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <delay.h>
#include <ds1307.h>
#include <math.h>
/*
7 segment
a = 6
b = 4
c = 0
d = 1
e = 2
f = 5
g = 3

*/


char status=0;
unsigned char jam,menit,detik,hari,bulan, tahun,;

void init_dev(void)
{
 DDRC=0b11111100;
 DDRB=0b11111100;
 DDRD=0XFF;
 i2c_init();
 rtc_init(0,1,0);
}

void write7segment(unsigned char digit, unsigned char bilangan)
{
  
 
  switch (bilangan)
  {
    case 0  : { PORTD=~(0b1110111); }; break;
    case 1  : { PORTD=~(0b0010001); }; break;
    case 2  : { PORTD=~(0b1011110); }; break;
    case 3  : { PORTD=~(0b1011011); }; break;
    case 4  : { PORTD=~(0b0111001); }; break;
    case 5  : { PORTD=~(0b1101011); }; break;
    case 6  : { PORTD=~(0b1101111); }; break;
    case 7  : { PORTD=~(0b1010001); }; break;
    case 8  : { PORTD=~(0b1111111); }; break;
    case 9  : { PORTD=~(0b1111011); }; break;

  };     
 
  switch (digit)
  {
    case 0  : { PORTC=((0b1110)<<2); PORTB=((0b111111)<<2);}; break;
    case 1  : { PORTC=((0b1101)<<2); PORTB=((0b111111)<<2);}; break;
    case 2  : { PORTC=((0b1011)<<2); PORTB=((0b111111)<<2);}; break;
    case 3  : { PORTC=((0b0111)<<2); PORTB=((0b111111)<<2);}; break;
    case 4  : { PORTC=((0b1111)<<2); PORTB=((0b111110)<<2);}; break;
    case 5  : { PORTC=((0b1111)<<2); PORTB=((0b111101)<<2);}; break;
    case 6  : { PORTC=((0b1111)<<2); PORTB=((0b111011)<<2);}; break;
    case 7  : { PORTC=((0b1111)<<2); PORTB=((0b110111)<<2);}; break;
    case 8  : { PORTC=((0b1111)<<2); PORTB=((0b101111)<<2);}; break;
    case 9  : { PORTC=((0b1111)<<2); PORTB=((0b011111)<<2);}; break;
   };    
 
}


void sevsegmentjam( void )
{
  unsigned int tempdata;
  unsigned int digit3,digit4,digit5,digit6, digit7,digit8,digit9,digit10,digit11,digit12,;            
  
  tempdata=menit; 
  digit3=tempdata%10; 
  write7segment(0,digit3);
  delay_ms(5);    
 
  tempdata/=10;
  digit4=tempdata%10;  
  write7segment(1,digit4);
  delay_ms(5);
 
  tempdata=jam;                                                                                                                       
  digit5=tempdata%10; 
  write7segment(2,digit5);
  delay_ms(5);  

  tempdata/=10;
  digit6=tempdata%10; 
  write7segment(3,digit6);
  delay_ms(5);
 
  tempdata=hari;                                                                                                                       
  digit7=tempdata%10; 
  write7segment(4,digit7);
  delay_ms(5);  

  tempdata/=10;
  digit8=tempdata%10; 
  write7segment(5,digit8);
  delay_ms(5);
 
  tempdata=bulan;                                                                                                                       
  digit9=tempdata%10; 
  write7segment(6,digit9);
  delay_ms(5);  

  tempdata/=10;
  digit10=tempdata%10; 
  write7segment(7,digit10);
  delay_ms(5)
  ;
  tempdata=tahun;                                                                                                                       
  digit11=tempdata%10; 
  write7segment(8,digit11);
  delay_ms(5);  

  tempdata/=10;
  digit12=tempdata%10; 
  write7segment(9,digit12);
  delay_ms(5);
}




void sevsegmentjamset( char dig )
{
  unsigned int tempdata;
  unsigned int digit3,digit4,digit5,digit6, digit7,digit8,digit9,digit10,digit11,digit12,;            

  tempdata=menit; 
  digit3=tempdata%10;
  tempdata/=10;
  digit4=tempdata%10;
 
  tempdata=jam;                                                                                                                       
  digit5=tempdata%10;
  tempdata/=10;
  digit6=tempdata%10;
 
  tempdata=hari;                                                                                                                       
  digit7=tempdata%10;
  tempdata/=10;
  digit8=tempdata%10;
 
  tempdata=bulan;                                                                                                                       
  digit9=tempdata%10;
  tempdata/=10;
  digit10=tempdata%10;
 
  tempdata=tahun;                                                                                                                       
  digit11=tempdata%10;
  tempdata/=10;
  digit12=tempdata%10;
     
  if (dig==0)
    {
     write7segment(0,digit3);
     delay_ms(200);  
     write7segment(1,digit4);
     delay_ms(200);
     }
  if (dig==1) 
    {
     write7segment(2,digit5);
     delay_ms(200);  
     write7segment(3,digit6);
     delay_ms(200);
    }
   if (dig==2) 
    {
     write7segment(4,digit7);
     delay_ms(200);  
     write7segment(5,digit8);
     delay_ms(200);
    }
    if (dig==3) 
    {
     write7segment(6,digit9);
     delay_ms(200);  
     write7segment(7,digit10);
     delay_ms(200);
    }
    if (dig==4) 
    {
     write7segment(8,digit11);
     delay_ms(200);  
     write7segment(9,digit12);
     delay_ms(200);
    }
}

void read_key(void)
{
 if (PINC.0==0)
    {
     while (PINC.0==0);
     status++;
     if (status==6)
      {
       init_dev();
       rtc_set_time(jam,menit,0);
       rtc_set_date(hari, bulan, tahun);
       status=0;
      }
                 
    }
 if (PINC.1==0)
    {
     while (PINC.1==0);
     if (status==1)
      {
       menit++;
       if (menit==60) menit=0;
      }                      
     if (status==2)
      {
       jam++;
       if (jam==24) jam=00;
      }
      if (status==3)
      {
       hari++;
       if (hari==32) hari=01;
      }
     if (status==4)
      {
       bulan++;
       if (bulan==13) bulan=01;
      }
     if (status==5)
      {
       tahun++;
       if (tahun==20) tahun=14;
      }      
    }             
}


void main (void)
{
 unsigned long int j;
 init_dev();
 //rtc_set_time(04,45,00);
 while(1)
  {                                                                                                                             
   while(status==0)
    {
     rtc_get_time(&jam,&menit,&detik);
     rtc_get_date(&hari, &bulan, &tahun);       
     if (status==0)
        {
         for (j=0;j<1000;j++)
         {
          if (status==0) read_key();
          if (status==0) sevsegmentjam();
    
         }
        }
    };   
   while(status!=0)
   {
    if (status==1)
     {                   
      read_key();
      sevsegmentjamset(0);
     }
    if (status==2)
     {                   
      read_key();
      sevsegmentjamset(1);
     }
    if (status==3)
     {                   
      read_key();
      sevsegmentjamset(2);
     }
    if (status==4)
     {                   
      read_key();
      sevsegmentjamset(3);
     }
    if (status==5)
     {                   
      read_key();
      sevsegmentjamset(4);
     }
     
   }   
   }   
}




Oke sob semoga bisa membantu..
Sekian dulu
"dika" 9 Nov 2014




5 komentar:

Anonim mengatakan...

mba andika, sy coba compile pake codevisionavr kok eror ya, apa bisa dikirimkan file hex nya ke email saya smart_pwt@yahoo.co.id terima kasih sebelumnya

Unknown mengatakan...

Mungin CVAVR anda belum Advanced.. coba cari CVAVR yang Vesi 2.05.0 Advanced..

Unknown mengatakan...

mba RTC DS1307 bwt jam presisi gx, soalnya saya bikin tiap harinya terlambat 2dt

Unknown mengatakan...

void init_dev(void)
{
DDRC=0b11111100;
DDRB=0b11111100;
DDRD=0XFF;
i2c_init();
rtc_init(0,1,0);
}

PROGRAM d atas untuk apa mba?

Unknown mengatakan...

if (status==0)
if (status==1)
if (status==2)
if (status==3)
if (status==4)
if (status==5)
if (status==6)

itu declarasi sebagai apa mba?