'*************************************************************************** '* (Pic16F876,OSC-4MHz) * '*************************************************************************** ......................... SECUND var byte ' переменная времени часов SECUND=0 MINUT var byte ' переменная времени часов MINUT=0 HOUR var byte ' переменная времени часов HOUR=0 DAY var byte ' переменная времени часов DAY=0 ............................... on interrupt goto MyINT ' Зададим адрес обработки прерываний - ' он находится по адресу метки myINT TMR1=3036 ' Установка предварительного значения таймера(<65635) ' после запуска прерываний получим F(прер.)=2Гц PIE1.0 = 1 ' Прерывание 1-разрешено /0-запрещено INTCON.6 = 1 ' от периферийных устройств микроконтроллера, ' т.к. TMR1 - периферия INTCON.7 = 1 ' Установим бит глобального разрешения прерываний ' (этот бит разрешает работу всех запросов вообще) T1CON=%00110000 ' Предустановлен делитель 1:8, Fosc/4, но не включен таймер ' После всех настроек перейдем на выполнение главной программы, а таймер будет ' включен позже и начнет увеличивать свое значение с каждым циклом. В начале мы ' предустановили делитель 1:8, загрузили таймер значением 3036 и как только ' он дотикает до 65535 и придет следующий тик - это вызовет его ' переполнение и, соответственно, прерывание по переполнению TMR1 .................................. T1CON.0=1 ' запуск таймера прерывания TMR1 по переполнению .................................. ACP_TO_LCD: ' подпрограмма отображения данных на LCD lcdout $FE,$80,dec2 MINUT,":",dec2 SECUND ................................. disable ' disable-enable границы где прерывания не работают ' исключаем действие прерывания само на себя. MyINT: 'подпрограмма прерываний таймера TMR1 (отсчет времени 0.5сек/2Гц) If PIR1.0=1 Then ' Проверим, было ли вызвано прерывание ' именно переполнением таймера TMR1. Если это так, PIR1.0=0 ' то сразу сбросим флаг этого прерывания, ' чтобы при выходе снова не попасть в обработчик. TMR1=3040 ' Установка предварительного значения таймера ' на 4 больше, чем вначале (3036)-4 цикла уходят на запись числа. F=F+1 if F=2 then ' :2,получаем 1Гц из 2импульсов прерывания по 0.5сек/2Гц F=0 ' для индикации часов SECUND=SECUND+1 if SECUND=60 then SECUND=0 MINUT=MINUT+1 if MINUT=60 then MINUT=0 HOUR=HOUR+1 if HOUR=24 then HOUR=0 DAY=DAY+1 endif endif endif endif endif resume enable end