Jam digital mengunakan ds1307 dan AT mega8 dengan metode switching
Chip type : ATmega8
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
note : simulasi di proteus gak akan berjalan lancar karena ada komunikasi I2C ke DS1307
liat mesagebox dari proteusnya aja, detiknya jalan lama banget, berarti ini udah gak realtime simulasinya
effectnya display angka akan kedip2 nyala mati karena efect switching 7′s
kalo mau jalan benerannya ya…. bikin yang aslinya jangan disimulasi
*****************************************************/
#include <mega8.h>
#asm
.equ __i2c_port=0×12 ;PORTD
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h>
#include <delay.h>
#define q1 PORTD.2
#define q2 PORTD.3
#define q3 PORTD.4
#define q4 PORTD.5
#define q5 PORTD.6
#define q6 PORTD.7
#define pb1 PINB.4
#define pb2 PINB.5
unsigned char q=0,jam,menit,detik,jam1,menit1,detik1,jam1bcd,jam2bcd,menit1bcd,menit2bcd,detik1bcd,detik2bcd;
//timer 1 interupt 1ms
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xFC;
TCNT1L=0×18;
//switching 7′s
q++;
if(q==1){q1=1;q2=0;q3=0;q4=0;q5=0;q6=0;}
if(q==2){q1=0;q2=1;q3=0;q4=0;q5=0;q6=0;}
if(q==3){q1=0;q2=0;q3=1;q4=0;q5=0;q6=0;}
if(q==4){q1=0;q2=0;q3=0;q4=1;q5=0;q6=0;}
if(q==5){q1=0;q2=0;q3=0;q4=0;q5=1;q6=0;}
if(q==6){q1=0;q2=0;q3=0;q4=0;q5=0;q6=1;}
if(q>6){q=0;}
//display 7′s
if(q==1){PORTB=detik1bcd;}
if(q==2){PORTB=detik2bcd;}
if(q==3){PORTB=menit1bcd;}
if(q==4){PORTB=menit2bcd;}
if(q==5){PORTB=jam1bcd;}
if(q==6){PORTB=jam2bcd;}
}
//kalo kata bahasa asemblynya ini HEX to DEC, biar gak keluar angka A s/d F jadi cuma 0 s/d 9 aja
unsigned char dec2bcd(unsigned char num)
{
return ((num/10 * 16) + (num % 10));
}
void ds_1307(){
rtc_get_time(&jam,&menit,&detik); //ambil data rtc
jam1bcd=dec2bcd(jam);
jam1=jam/10;
jam2bcd=dec2bcd(jam1);
menit1bcd=dec2bcd(menit);
menit1=menit/10;
menit2bcd=dec2bcd(menit1);
detik1bcd=dec2bcd(detik);
detik1=detik/10;
detik2bcd=dec2bcd(detik1);
}
void set_rtc(){
if(!pb1){jam++;delay_ms(300);} //jika PINB.4==0 maka……. nglakuin bgonoan dah tuh
if(jam>23){jam=0;}
if(!pb2){menit++;delay_ms(300);}
if(menit>59){menit=0;}
rtc_set_time(jam,menit,detik); //seting rtc
}
void main(void)
{
PORTB=0×30;//pinb.4,5 dikasi pullup internal
DDRB=0x0F; //4 bit pertama PORTB sebagai output
PORTD=0×00;
DDRD.2=DDRD.3=DDRD.4=DDRD.5=DDRD.6=DDRD.7=1; //sebagai output untuk switching 7′s
//pengisian data timer 1
TCCR1A=0×00;
TCCR1B=0×02;
TCNT1H=0xFC;
TCNT1L=0×18;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
TIMSK=0×04; // aktifasi timer1
i2c_init();
rtc_init(0,0,0); //ngatur output mode 0 apa 1 and Square Wave Output frekwensi (gak usah diganti-ganti)
#asm (“sei”) //aktifasi interupt
while (1)
{
ds_1307();
set_rtc();
};
}
Chip type : ATmega8
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
note : simulasi di proteus gak akan berjalan lancar karena ada komunikasi I2C ke DS1307
liat mesagebox dari proteusnya aja, detiknya jalan lama banget, berarti ini udah gak realtime simulasinya
effectnya display angka akan kedip2 nyala mati karena efect switching 7′s
kalo mau jalan benerannya ya…. bikin yang aslinya jangan disimulasi
*****************************************************/
#include <mega8.h>
#asm
.equ __i2c_port=0×12 ;PORTD
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h>
#include <delay.h>
#define q1 PORTD.2
#define q2 PORTD.3
#define q3 PORTD.4
#define q4 PORTD.5
#define q5 PORTD.6
#define q6 PORTD.7
#define pb1 PINB.4
#define pb2 PINB.5
unsigned char q=0,jam,menit,detik,jam1,menit1,detik1,jam1bcd,jam2bcd,menit1bcd,menit2bcd,detik1bcd,detik2bcd;
//timer 1 interupt 1ms
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xFC;
TCNT1L=0×18;
//switching 7′s
q++;
if(q==1){q1=1;q2=0;q3=0;q4=0;q5=0;q6=0;}
if(q==2){q1=0;q2=1;q3=0;q4=0;q5=0;q6=0;}
if(q==3){q1=0;q2=0;q3=1;q4=0;q5=0;q6=0;}
if(q==4){q1=0;q2=0;q3=0;q4=1;q5=0;q6=0;}
if(q==5){q1=0;q2=0;q3=0;q4=0;q5=1;q6=0;}
if(q==6){q1=0;q2=0;q3=0;q4=0;q5=0;q6=1;}
if(q>6){q=0;}
//display 7′s
if(q==1){PORTB=detik1bcd;}
if(q==2){PORTB=detik2bcd;}
if(q==3){PORTB=menit1bcd;}
if(q==4){PORTB=menit2bcd;}
if(q==5){PORTB=jam1bcd;}
if(q==6){PORTB=jam2bcd;}
}
//kalo kata bahasa asemblynya ini HEX to DEC, biar gak keluar angka A s/d F jadi cuma 0 s/d 9 aja
unsigned char dec2bcd(unsigned char num)
{
return ((num/10 * 16) + (num % 10));
}
void ds_1307(){
rtc_get_time(&jam,&menit,&detik); //ambil data rtc
jam1bcd=dec2bcd(jam);
jam1=jam/10;
jam2bcd=dec2bcd(jam1);
menit1bcd=dec2bcd(menit);
menit1=menit/10;
menit2bcd=dec2bcd(menit1);
detik1bcd=dec2bcd(detik);
detik1=detik/10;
detik2bcd=dec2bcd(detik1);
}
void set_rtc(){
if(!pb1){jam++;delay_ms(300);} //jika PINB.4==0 maka……. nglakuin bgonoan dah tuh
if(jam>23){jam=0;}
if(!pb2){menit++;delay_ms(300);}
if(menit>59){menit=0;}
rtc_set_time(jam,menit,detik); //seting rtc
}
void main(void)
{
PORTB=0×30;//pinb.4,5 dikasi pullup internal
DDRB=0x0F; //4 bit pertama PORTB sebagai output
PORTD=0×00;
DDRD.2=DDRD.3=DDRD.4=DDRD.5=DDRD.6=DDRD.7=1; //sebagai output untuk switching 7′s
//pengisian data timer 1
TCCR1A=0×00;
TCCR1B=0×02;
TCNT1H=0xFC;
TCNT1L=0×18;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
TIMSK=0×04; // aktifasi timer1
i2c_init();
rtc_init(0,0,0); //ngatur output mode 0 apa 1 and Square Wave Output frekwensi (gak usah diganti-ganti)
#asm (“sei”) //aktifasi interupt
while (1)
{
ds_1307();
set_rtc();
};
}