#ifndef SDA
#define scl PIN_C3
#define sda PIN_C4
#endif
BOOLEAN i2c_ready(byte entegre_adres) {
int1 ack;
i2c_start(); // If the write command is acknowledged,
ack = i2c_write(entegre_adres); // then the device is ready.
i2c_stop();
return !ack;
}
void i2c_out(byte entegre_adres ,BYTE ADRES, BYTE data)
/*Burada entegre adresi ds1307 için 0xd0; adres(mesela saniye için 0x00); ve değer de desimal olarak aktarılmalıdır.
aksi halde kırmızı olan bölüm silinmelidir(desimali hexadesimale çeviriyor.). */
{
BYTE I10;
while(!i2c_ready(entegre_adres));
[color=red]I10=((DATA/10)<<4);
DATA=I10+(DATA%10);[/color]
i2c_start();
i2c_write(entegre_adres);
i2c_write(ADRES);
i2c_write(data);
i2c_stop();
}
byte i2c_init_read(byte entegre_adres, BYTE ADRES)
{
while(!i2c_ready(entegre_adres));
i2c_start();
i2c_write(entegre_adres);
i2c_write(ADRES);
i2c_start();
i2c_write(entegre_adres+1);
return(1);
}
BYTE i2c_in(BYTE SAYI,BYTE KNTRL)
{ BYTE data;
IF (SAYI<KNTRL)
{
data=i2c_read(1);
}
ELSE {
DATA=I2C_READ(0);
I2C_STOP();
/* ds1307 pazar gününü 1 olarak kabul eder; buna göre cmt 7 */
}
RETURN(data);
}/
yazım için örnek kod:
for (i=0;i<7;i++) {
i2c_out(0xd0,i,time[i]);
}
yazma yapmak için entegre adresi; ardından hangi adrese yazılacağı ardından da ne yazılacağı gösteriliyor.
0xd0 ds1307 için adres; i (saniye için 0x00); ve ardından time (buraya saniye veya başka bir değişken yazabilirsiniz.). aktarılıyor. bu işlem 7 defa tekrarlandığı için saniye dakika saat haftanın günü gün ay yıl bilgisi sırasıyla aktarılmış oluyor. eğer for döngüsünü kaldırırsanız sadece bir adrese bilgi aktarımı yapar.
okuma için örnek kod:
i2c_init_read(0xd0,0x00);
for (i=0;i<7;i++) {
time[i]=i2c_in(i,0x06);
date=(time[i]>>4)*10;
time[i]=date+((time[i]<<4)>>4);
}
burada i2c_init_read entegrenin adresi ve hangi adresten başlanacağını <yukarıdaki kodda saniye baz alınmış.>
for döngüsü içinde hangi adres okunacak ve kaç tane okunacaksa o bilgi yazılmalıdır. bcd formatındaki bilgi onluk tabana çevrilerek alınmıştır. i, 0x06 bilgisi kaçıncı bilginin okunacağını ve ne kadar okunacağını ifade eder. ack bilgisi için
her okumadan önce
i2c_init_read(entegre adresi,kaçıncı bilginin okunacağı); bilgisi gönderilip ardından
time=i2c_in(i,0x06); entegreden kaçıncı bilginin okunduğunu ve bunun nereye kadar süreceğini ifade etmektedir. ack sinyali için.
sadece bir bilgi okunması halinde
i2c_init_read(0xd0,0x03);
saat=i2c_in(1.sayı,2.sayı);bilgisinin gönderilmesi yeterlidir(1.sayı>2.sayı olacak şekilde).
protondaki str\7 gibi yapmaya çalıştım. umarım yeterli olmuştur.