Конечно, программа написана неправильно, но даже в таком состоянии работоспособна.
В первую очередь увеличте частоту обновления индикатора, сейчас меньше 4Гц при
1Мгц тактовой. Получается
10^6/TCCR0(1024)/256 = 3,8Гц. В главном цикле, там где опрос кнопок, бессмысленный код, а именно: антидребез не закончен, т.е. это не антидребезг, нет повторной проверки после задержки в 200мс (обычно единичное нажатие 30-50мс и повторная проверка). Ну и в конце главного цикла стоит считывание температуры с датчика, что буквально "затирает" только что инкрементированное или декрементирвоанное значение в переменной indication.
Отлаживайте программу поочерёдно, например закомментируйте всё, что касается температуры, отработайте только инкремент.
А сам по себе код опроса кнопок рабочий. Я извинюсь, что переписал в терминах GCC, просто с CodeVisione не работаю.
Спойлер
Код:
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
int set_temp=50;
char digits[] =
{
0b11000000, //0
0b11111001, //1
0b10100100, //2
0b10110000, //3
0b10011001, //4
0b10010010, //5
0b10000010, //6
0b11111000, //7
0b10000000, //8
0b10010000, //9
0b10001001, //Буква Н
0b11111111 //пустота
};
char digit_out[2];
char cur_dig; //Переменные для работы с LED
unsigned int indication; //Переменная для хранения чисел
void recoding(void)
{
if (indication < 100)
{
digit_out[0]=indication/10;
digit_out[1]=indication%10;
}
}
int main(void)
{
PORTB = 0x03;
DDRB = 0x0C;
PORTC = 0x00;
DDRC = 0x06;
PORTD = 0x00;
DDRD = 0x7F;
TCCR0 = 0x02;
TIMSK = 0x01;
ACSR = 0x80;
sei();
while (1)
{
if (!(PINB & _BV(0)))
{
set_temp++;
_delay_ms(200);
indication = set_temp;
recoding();
//_delay_ms(1000);
};
if (!(PINB & _BV(1)))
{
set_temp--;
_delay_ms(200);
indication = set_temp;
recoding();
//_delay_ms(1000);
};
recoding();
}
}
ISR(TIMER0_OVF_vect)
{
PORTD = 0xFF;
switch(cur_dig)
{
case(0):
{
PORTC |= _BV(1);
PORTC &= ~_BV(2);
break;
};
case(1):
{
PORTC |= _BV(2);
PORTC &= ~_BV(1);
break;
};
default: break;
}
PORTD = digits[digit_out[cur_dig]];
cur_dig++;
if(cur_dig == 2)
cur_dig = 0;
}