С протеусом есть засада в динамической индикации. Решение проблемы в следующем, после засветки индикатора далать паузу от 1 мс. Кстати прога написана верно, поставить нужно только задержку.
А по поводу симуляторов. Я Уважаю людей которым уже далеко за 40 а они стараются разобраться с новым софтом и железом. Но Александр вы прекрасно знаете в каком городе мы живем. Если-бы не Стелл мы бы электронщики вымерли как мамонты. Для меня спалить очередной МК из разряда траура, т.к. покупка нового сопряжена с определенными проблемами. И в довесок очень часто я программирую на работе, а всю домашнюю приблуду на работу не потянешь, а протеус позволяет мне в рабочее время спокойненько отлаживать свои устройства.
Вот в довесок код из часов что делал я.
В протеусе работает великолепно. В железе пока не собирал, у меня сыну 10 месяцев иногда даж посидеть некогда :-)
unsigned char ind(unsigned char a) // перевод числа в символьное представление
{
unsigned char b;
switch (a)
{
case 0: // 0
b = 0b00111111;
break;
case 1: // 1
b = 0b00000110;
break;
case 2: // 2
b = 0b01011011;
break;
case 3: // 3
b = 0b01001111;
break;
case 4: // 4
b = 0b01100110;
break;
case 5: // 5
b = 0b01101101;
break;
case 6: // 6
b = 0b01111101;
break;
case 7: // 7
b = 0b00000111;
break;
case 8: // 8
b = 0b01111111;
break;
case 9: // 9
b = 0b01101111;
break;
}
return b;
}
void indicator (unsigned char c,unsigned char d,unsigned char e,unsigned char f) // вывод числел на индикаторы
{
if (PINB.2)
{
PORTD = c;
PORTC.1=0;
delay_ms(1);
PORTC.1=1;
// Второй разряд
if (sec%2) // Моргание точечкой каждую секунду
{
PORTD = d | 0b10000000;
PORTC.2=0;
delay_ms(1);
PORTC.2=1;
PORTD = 0;
}
else
{
PORTD = d;
PORTC.2=0;
delay_ms(1);
PORTC.2=1;
PORTD = 0;
}
// Третий разряд
PORTD = e;
PORTC.3=0;
delay_ms(1);
PORTC.3=1;
// Четвёртый разряд
PORTD = f;
PORTC.4=0;
delay_ms(1);
PORTC.4=1;
}
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
indicator( ind(min/10), ind(min%10), ind (sec/10), ind (sec%10) );
}