Dim Frequency As Long
Dim Flag As Bit
Dim Overflow As Byte
Dim Cnt As Long

$crystal = 8000000                                          ' частота кварца

'******************************
Config Portd = Input
Config Timer0 = Timer , Prescale = 1                        ' CK=8MHz - тактирование Таймер0
Config Timer1 = Counter , Edge = Rising , Noise Cancel = 1  ' включена фильтрация шумов

Config Lcd = 16 * 2                                         ' экран 16*2 (любой с контроллером HD44780)
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.0


'****Reset for Start***********
Stop Timer0
Stop Counter1

'******Interrupt routline setting****
On Timer0 Tm0_intsub
On Timer1 Tm1_intsub

'******Enable Interrupts, timer 0, counter1*****
Enable Interrupts
Enable Ovf1                                                 'Counter1
Enable Ovf0                                                 'Timer0
Counter1 = 0
Overflow = 0
Cnt = 31249
Flag = 0

'******Initial******
Cls                                                         ' очистка дисплея
Lcd "Frequency Meter"
Waitms 500
Start Timer0
Start Counter1

'*******Main Loop*****
Main:
Do
    If Flag = 1 Then
            Frequency = Overflow * 65536
            Frequency = Frequency + Counter1
            Cls
            Cursor Off
            Lcd "Freq= "
            Lcd Frequency
            Lcd " Hz"
            Locate 1 , 1
            Reset Flag
            Counter1 = 0
            Overflow = 0
            Cnt = 31249                                     ' значение подобрано для захвата за 1 секунду


            Tcnt1 = 0
            Tcnt0 = 90

            Start Timer0
            Start Counter1
     End If
Loop

'************************************************
'*******Counter1 Overflow Interrupt**************
 Tm1_intsub:                                                'переполнение counter1 - счетчик прешедших импульсов
Incr Overflow
Return
'***********Timer0 Zero Interrupt****************
Tm0_intsub:
         If Cnt <> 0 Then                                   ' отсчет одной секунды
                Decr Cnt
         Else
                Stop Counter1
                Stop Timer0
                Set Flag
         End If
Return
'************End of interrupt*********************