Witam
Aktualnie piszę zegarek na kontroler atmega8, niestety _delay_ms nie działa dokładnie, za pewne z powodu braku włączonej optymalizacji kodu, niestety po jej włączeniu z programem dzieją się dziwne rzeczy, zegar czasami działa za szybko, czasami lcd w ogóle się nie odpala ;/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>
#include "lcd.h"
#include "ds1307/ds1307.h"
#include "uart/uart.h"
#define UART_BAUD_RATE 2400
int main(void)
{
ds1307_init();
sei();
uint8_t year = 0;
uint8_t month = 0;
uint8_t day = 0;
uint8_t hour = 0;
uint8_t minute = 0;
uint8_t second = 0;
char *str = "123";
char datetime[8] = "";
ds1307_getdate(&year, &month, &day, &hour, &minute, &second);
DDRD=0xFF;
lcd_init(LCD_DISP_ON);
PORTC |= ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3));
while(1)
{
for(second = second; second < 60; second++)
{
sprintf(str, "%d", hour);
if(hour < 10)
strcat(datetime, "0");
strcat(datetime, str);
strcat(datetime, ":");
sprintf(str, "%d", minute);
if(minute < 10)
strcat(datetime, "0");
strcat(datetime, str);
strcat(datetime, ":");
sprintf(str, "%d", second);
if(second < 10)
strcat(datetime, "0");
strcat(datetime, str);
lcd_puts(datetime);
_delay_ms(1000);
lcd_clrscr();
memset(datetime, 0, 8 * sizeof(char) );
if(bit_is_clear(PINC, PC3))
{
hour = 0;
minute = 0;
second = 0;
lcd_puts("00:00:00");
_delay_ms(500);
while(!(bit_is_clear(PINC, 3)))
{
if((bit_is_clear(PINC, 2)))
{
if(hour < 23)
hour++;
else
hour = 0;
}
if((bit_is_clear(PINC, 1)))
{
if(minute < 59)
minute++;
else
minute = 0;
}
if((bit_is_clear(PINC, 0)))
{
if(second < 59)
second++;
else
second = 0;
}
lcd_clrscr();
sprintf(str, "%d", hour);
if(hour < 10)
strcat(datetime, "0");
strcat(datetime, str);
strcat(datetime, ":");
sprintf(str, "%d", minute);
if(minute < 10)
strcat(datetime, "0");
strcat(datetime, str);
strcat(datetime, ":");
sprintf(str, "%d", second);
if(second < 10)
strcat(datetime, "0");
strcat(datetime, str);
lcd_puts(datetime);
memset(datetime, 0, 8 * sizeof(char) );
_delay_ms(500);
}
ds1307_setdate(year, month, day, hour, minute, second);
}
}
second = 0;
minute++;
if(minute == 60)
{
minute = 0;
hour++;
}
if(hour == 24)
hour = 0;
}
}