Сразу признаюсь, что это моя первая прога на С, поэтому сильно не выскубайте.
Таймер(ы) настраиваются в отдельной функции. Как и порты, объявление констант и переменных. С этим проблем нет. Хочу записать число 1234.
Вот обработчик прерываний:
Код: Выделить всё
void interrupt isr (void)
{
if (T0IF)
{
tmp100 = tmp100 + 1; // изменение переменной каждое преывание по переполнению TMR0
T0IF = 0;
}
} Код: Выделить всё
void init (void)
{
// настройки для всех таймеров
GIE = 1; // разрешены все немаскированные прерывания
PEIE = 1; // разрешены все немаскированные прерывания от переферийных модулей
// регистр OPTION
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 1; // bit 2 Настройка предделителя на 224 Гц
PS1 = 1; // bit 1 Настройка предделителя на 224 Гц
PS0 = 1; // bit 0 Настройка предделителя на 224 Гц
TMR0 = 0; // предзагрузка TMR0, сбрасывается при переполнении.
}Код: Выделить всё
void stTMR0 (void)
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
T0IE = 1; // Разрешение прерывания по переполнению TMR0
}Код: Выделить всё
void main (void)
{
podgot(); // настройки портов, АЦП и т.п.
init(); // настройка таймеров
stTMR0(); запуск TMR0
for(;;)
{
while (tmp100 == 10) // ждать 10-ти прерываний от TMR0
{
all_1 = 0; // общий анод 1-го разряда
PORTB = arr_seg [1]; // запись в порт, подключенный к сегментам, числа из ячейки массива
}
while (tmp100 == 20)
{
gash (); // гашение всех разрядов
}
while (tmp100 == 35)
{
all_2 = 0;
PORTB = arr_seg [2];
}
while (tmp100 == 35)
{
gash ();
}
while (tmp100 == 40)
{
all_3 = 0;
PORTB = arr_seg [3];
}
while (tmp100 == 50)
{
gash ();
}
while (tmp100 == 55)
{
all_4 = 0;
PORTB = arr_seg [4];
}
while (tmp100 == 60)
{
gash ();
}
tmp100 = 0;
}
}