Panda_Y2K
у вас есть ошибка в коде - не инициализирован pd6
Дело в том, что я его не использовал вообще и на печатке он разведен под датчик ds18b20 который тоже не используется. Это рудимент со старой схемы, где он был, но тоже не использовался

Но инициализация все равно есть, CVAVR ее автоматом делает
Код: Выделить всё
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTD=0x04;
DDRD=0x00;
у вас ошибка
Код: Выделить всё
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=4
.equ __scl_bit=5
#endasm
на схеме sda разеведен на PD5, а scl на PD4, а инициализация наоборот.
если Вы используете переменную maxday, то тогда уж лучше было бы создать массив из 12 месяцев с значениями количества дней в каждом месяце.
типа
Код: Выделить всё
unsigned char maxday [12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (day > maxday[month-1])
//или
unsigned char maxday [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (day > maxday[month])
//так быстрее будет.
{day = 1;
month++;
};
так код был бы быстрее, по тому, что swtch case сводится к тем же if, а if очищают конвеер и соответственно тормозят процесс. Согласен, что и у меня было не оптимально, но если переделываете, то можно поправить.
И почему запись в переменную maxday происходит позже чем вы ее читаете? Сначала нужно записать значение в переменную, а потом уже читать.
На работоспособность не влияет, но так интересно почему массив назвали
char lcd_buffer[6]; //масив с данными для экрана
lcd - это liquid Crystal display (жидко кристалический дисплей)
а у нас LED - Light emitted diod (светоизлучающий диод)
Не сочтите занудой

к стати каково его назначение? ссылок на него не нашел, а это 6 байт.