Первый, не работает (это часы)metan писал(а):Покажите 2 последних кода
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
static flash unsigned char display[]= // масив для индикатора
{
(0b11000000), // 0
(0b11111001), // 1
(0b10100100), // 2
(0b10110000), // 3
(0b10011001), // 4
(0b10010010), // 5
(0b10000010), // 6
(0b11111000), // 7
(0b10000000), // 8
(0b10010000), // 9
};
unsigned char seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours;
interrupt [TIM2_COMP] void timer2_comp_isr(void) // прерывание по таймеру 2
{
TCNT2=0x00; // обнуляем счетный регистр
seconds++; // условия работы часов
if(seconds>=10)
{
seconds=0;
ten_seconds++;
}
if(ten_seconds>=6)
{
ten_seconds=0;
minutes++;
}
if(minutes>=10)
{
minutes=0;
ten_minutes++;
}
if(ten_minutes>=6)
{
ten_minutes=0;
hours++;
}
if(hours>=10)
{
hours=0;
ten_hours++;
}
if(ten_hours>=2&&hours==4)
{
ten_hours=0;
hours=0;
}
}
void main(void)
{
PORTC=0x00;
DDRC=0x1F;
PORTD=0x00;
DDRD=0b11111111;
ASSR=0b00001000; // таймер в асинхронном режиме
TCCR2=0b00000110; // делитель
TCNT2=0x00;
OCR2=127; // регистр сравнения
TIMSK=0b10000000;
#asm("sei")
TIMSK &=~(1<<OCIE2 | 1<< TOIE2); // Запрещаем прерывания таймера 2
ASSR = 1<<AS2; // Включаем асинхронный режим
TCNT2 = 0;
TCCR2 = 5<<CS20; // Предделитель на 128 на 32768 даст 256 тиков в секунду
// Что даст 1 прерывание по переполнению в секунду.
while(ASSR & (1<<TCN2UB | 1<<OCR2UB | TCR2UB));
TIFR |= 1<<OCF2 | 1<< TOV2; // Сбрасываем флаги прерываний, на всякий случай.
TIMSK |= 1<< TOIE2 | 1<<TOIE0; // Нулевой таймер для индикации
while (1)
{
//динамическая индикация
PORTC.0=1; // первый разряд, десятки часов
PORTD=display[ten_hours];
delay_us(10);
PORTC.0=0;
PORTC.1=1; // второй разряд, единици часов
PORTD=display[hours];
delay_us(10);
PORTC.1=0;
PORTC.2=1; //третий разряд, десятки минут
PORTD=display[ten_minutes];
delay_us(10);
PORTC.2=0;
PORTC.3=1; // четвертый разряд, единици минут
PORTD=display[minutes];
delay_us(10);
PORTC.3=0;
PORTC.4=1; // пятый разряд, десятки секунд
PORTD=display[ten_seconds];
delay_us(10);
PORTC.4=0;
PORTC.5=1; //шестой разряд, единици секунд
PORTD=display[seconds];
delay_us(10);
PORTC.5=0;
}
}
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
static flash unsigned char display[]= // масив для индикатора
{
(0b11000000), // 0
(0b11111001), // 1
(0b10100100), // 2
(0b10110000), // 3
(0b10011001), // 4
(0b10010010), // 5
(0b10000010), // 6
(0b11111000), // 7
(0b10000000), // 8
(0b10010000), // 9
};
char sec=0;
interrupt [TIM2_COMP] void timer2_comp_isr(void) // прерывание по таймеру 2
{
TCNT2=0x00; // обнуляем счетный регистр
sec++;
if(sec==10) sec=0;
}
void main(void)
{
PORTC=0b11011111;
DDRC=0b00000000;
PORTD=0x00;
DDRD=0x00;
ASSR=0b00001000; // таймер в асинхронном режиме
TCCR2=0b00000110; // делитель
TCNT2=0x00;
OCR2=127; // регистр сравнения
TIMSK=0b10000000;
#asm("sei")
while (1)
{
PORTD=display[sec];
}
}

