Sudah lama sekali tidak berkreasi di blog ini…sekarang pengen coba share gimana membuat sebuah jam digital
akan saya paparkan skematik dan kode nya disini,,,silakan dicoba ya teman semua
setting xtall = 1 Mhz Internal,,, jadi ga perlu pakai xtall, dengan kata lain ketika kita beli ic Atmega8 yg masih baru yg belum diapa-apakan,,, bisa langsung diberi program ini, tanpa perlu setting fusebit nya. atau kalau ingin pakai Xtall dikasih xtall 1Mhz dan setting eksternal crystall oscillator.Â
code
#include <mega8.h>
#asm
.equ __i2c_port=0x18 ;portc
.equ __sda_bit=5
.equ __scl_bit=4
#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,segment;
void init_dev(void)
{
DDRC=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); }; break;
case 1 : { PORTC=((0b1101)<<2); }; break;
case 2 : { PORTC=((0b1011)<<2); }; break;
case 3 : { PORTC=((0b0111)<<2); }; break;
};
}
void sevsegmentjam( void )
{
unsigned int tempdata;
unsigned int digit1,digit2,digit3,digit4,digit5,digit6;
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);
}
void sevsegmentjamset( char dig )
{
unsigned int tempdata;
unsigned int digit1,digit2,digit3,digit4,digit5,digit6;
tempdata=menit;
digit3=tempdata%10;
tempdata/=10;
digit4=tempdata%10;
tempdata=jam;
digit5=tempdata%10;
tempdata/=10;
digit6=tempdata%10;
if (dig==0)
{
write7segment(0,digit3);
delay_ms(5);
write7segment(1,digit4);
delay_ms(5);
}
if (dig==1)
{
write7segment(2,digit5);
delay_ms(5);
write7segment(3,digit6);
delay_ms(5);
}
}
void read_key(void)
{
if (PINC.0==0)
{
while (PINC.0==0);
status++;
if (status==3)
{
init_dev();
rtc_set_time(jam,menit,0);
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=0;
}
}
}
void main (void)
{
unsigned long int j;
init_dev();
//rtc_set_time(13,30,00);
while(1)
{
while(status==0)
{
rtc_get_time(&jam,&menit,&detik);
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);
}
}
}
}
ini file projectnya
http://www.ziddu.com/download/19513172/clock.zip.htm

ini foto asli alatnya,,,,mungkin temen2 bisa berkreasi sendiri rangkaian yang diinginkan

itu button yg nyambung ke PINC.0 berfungsi untuk pindah2 mode set menit dan jam, dan yang terhubung ke PINC.1 berfungsi merubah angka menit dan jam, dan setelah merubah angka menit dan jam tekan button yg terhubung ke PINC.0 lagi maka jam akan tersimpan dan kembali ke mode normal 