PLS tak si hraju s DS1307 a s I2C sběrnicí. Něco jsem k tomu našel a začal experimetovat. Ale nyní jsem ve fázi, že RTC a LCD displej šlape jen do 19 hodin a 59 minut. Jakmile se přehoupne 20 hodina, na displeji se úkáže 00 hodiny a aspoň minuty sedí. A ne a ne na to přijít, kde je problém. Zde přikládám main.c.
Kód: Vybrať všetko
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include "ds1307.h"
#include "I2C.h"
unsigned char minuty, hodiny, sekundy;
char buffer[16];
int main(){
lcd_init(LCD_DISP_ON); // inicializacia displeja
I2CInit(); //Inicializace I2C Bus
#define CH 7 //výmaz CH bit of RTC
uint8_t temp; //proměnná temp
DS1307Read(0x00,&temp); //čtení zařízení z adresy 00 a uložení do tempu
temp&=(~(1<<CH)); //výmaz CH Bit
DS1307Write(0x00,temp); //zápis do DS1307
DS1307Read(0x02,&temp); //Set 12/24 Hour Mode
temp|=(0b01000000); //teď 12 hodinový mód
DS1307Write(0x02,temp); //Zápis do DS1307
char Time[12]; //hh:mm:ss AM/PM
uint8_t data; //Now Read and format time
/*pokusy se zapisy*/
//temp=((58/10)<<4)|(58%10); //sekundy
//DS1307Write(0x00,temp);
//temp=((58/10)<<4)|(58%10); //minuty
//DS1307Write(0x01,temp);
//temp=((20/10)<<4)|(20%10); //hodiny
//temp|=0b00100000; //přepínač na AM/PM
//DS1307Write(0x02,temp);
while(1){
DS1307Read(0x00,&data); //sekundy + převod do decimálu
Time[8]='\0';
Time[7]=48+(data & 0b00001111);
Time[6]=48+((data & 0b01110000)>>4);
Time[5]=':';
DS1307Read(0x01,&data); //minuty + převod do decimálu
Time[4]=48+(data & 0b00001111);
Time[3]=48+((data & 0b01110000)>>4);
Time[2]=':';
DS1307Read(0x02,&data); //hodiny + převod do decimálu
Time[1]=48+(data & 0b00001111);
Time[0]=48+((data & 0b00010000)>>4);
lcd_gotoxy(0,0);
lcd_puts("DS1307 Trest");
lcd_gotoxy(2,1);
lcd_puts(Time);
if (data & 0b00100000)
{lcd_gotoxy(11,1);lcd_puts("PM");}
else
{lcd_gotoxy(11,1);lcd_puts("AM");}
}
}