C коментариями особенно не заморачивался спрашивай что непонятно.
Реально работающий таймер уже исполнен в железе...
Поскольку регулировать величину счета нет необходимости кнопки и прочее
не предусмотрено... Device 16F628A ' Использовать микроконтроллер 16F628A
Declare XTAL 4 ' Использовать тактовый генератор на 4 МГц
' ---Конфигурация микроконтроллера--------------------------------------------
Config BODEN_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT, CP_OFF, DATA_CP_OFF
' INTRC_OSC-NOCLKOUT - включить внутренний генератор на 4 мГц
' MCLRE_OFF - Включить режим работы RA5/MCLR как цифрового порта ввода/вывода
' и использовать внутренний сброс MCLR
' PWRTE_ON - Включить бит разрешения работы таймера включения питания для лучшего запуска
' CP_ON - Включить защиту памяти программ от несанкционированного считывания
' DATA_CP_ON - Включить защиту EEPROM памяти данных от несанкционированного считывания
OPTION_REG=%00000101 ' Установить делитель =64
On_Interrupt GoTo ISR ' Обработчик прерывания
INTCON=%10100000 ' Включить прерывание таймера TMR0 и глобальные прерывания
PORTB_PULLUPS = On ' Включить подтягивающие резисторы на PORTB
ALL_DIGITAL = On ' Установить все порты цифровыми входами/выходами
TRISA=0
TRISB=%00000001
Dim Tiks As Byte
Dim Cnt As Byte
Dim Digit As Byte
Dim pattern As Byte
Dim odin As Byte
Dim dva As Byte
Dim tri As Byte
'Digit1 PORTA.0
Dim se As Byte 'Время присутствия сигнала
Dim sn As Byte 'Время отсутствия сигнала
Dim sd As Byte 'Интервал перед включением канала 2
Dim s_e As Byte 'Переменная se
Dim s_n As Byte 'Переменная sn
'Dim Digit3 As PORTA.2
'Dim Signal0 As PORTB.7
'Dim i As DWord
EData 0, 5, 7, 30, 4, 0, 0, 0
se = ERead 1
sn = ERead 2
sd = ERead 3
nop
Cnt=0
PORTA=0
PORTB=0
s_e=0
Wait_s:
If s_e=se Then
Cnt=0
PORTA.6=1
GoTo LOOP
EndIf
GoTo Wait_s
LOOP:
Digit = Cnt Dig 2 ' Get 100s digit
GoSub Convert ' Get segments to turn on
odin = pattern ' Display 100s digit
PORTB = odin
PORTA.2 = 0
PORTA.1 = 0
PORTA.0 = 1
DelayMS 7
Digit = Cnt Dig 1 ' Get 10s digit
GoSub Convert ' Get segments to turn on
dva = pattern ' Display 10s digit
PORTA.0 = 0
PORTB = dva
PORTA.2 = 0
PORTA.1 = 1
PORTA.0 = 0
DelayMS 7
Digit = Cnt Dig 0 ' Get 1s digit
GoSub Convert ' Get segments to turn on
tri = pattern ' Display 1s digit
PORTA.0 = 0
PORTB = tri
PORTA.2 = 1
PORTA.1 = 0
PORTA.0 = 0
DelayMS 7
PORTA.2 = 0
If Cnt>=sd Then
PORTA.7=1
'Cnt=30
EndIf
If s_n=sn Then GoTo signal_off
GoTo LOOP
Convert:
pattern = LookUp Digit, [$7E, $0C, $B6, $9E, $CC, $DA, $FA, $0E, $FE, $DE]
pattern = pattern ^ $FF ' Invert bits of variable Pattern
Return
signal_off:
PORTA.6=0
PORTA.7=0
s_e=0
s_n=0
Cnt=0
GoTo Wait_s
GoTo signal_off
ISR:
Context SAVE
Tiks = Tiks + 1
If Tiks < 62 Then NoUpdate 'если меньше секунды
Tiks = 0
Cnt=cnt+1
If PORTB.0=0 Then
s_n=0
s_e=s_e+1
Else
s_e=0
s_n=s_n+1
EndIf
NoUpdate:
INTCON.2=0 ' Re-enable TMR0 interrupts
Context Restore
End