 ' конфигурируем порты
Config Portb = Output        'порт b на выход линейки светодиодов                              
'Config Portc.5 = Output
'Config Portc.4 = Output
'Config Portc.0 = Input
'Config Portc.3 = Input
 Ddrc = &B00110000		'порт с на вход сигнала с датчиков и выход на 2 контрольных светодиода
'Config Portd.7 = Output
'Config Portd.6 = Output
'Config Portd.2 = Input
'Config Portd.3 = Input
 Ddrd = &B11000000		'порт d на вход от кнопок и выход для управления светодиодными линейками динамической индикацией.

 Config Debounce = 50			'задержка от дребезга кнопок
 Config Adc = Single , Prescaler = Auto , Reference = Avcc  'конфиг АЦП

Dim Nast As Byte
Dim Temp As Byte
Dim Temp2 As Byte                                           ' обявляем переменную
Dim Tim0 As Byte
Dim Pin2 As Byte
Dim Puls As Bit
Dim Blok As Byte


Dim T1 As Byte

 Dim Volt As Integer
 Dim Volt2 As Integer

 Dim Top(8) As Integer     ' массивы? забыл уже, год прошел :))
 Dim Tem(8)as Integer
 Dim Topliv(8) As Eram Integer        ' массив для еепрорм
 Dim Temper(8) As Eram Integer
 Dim O As Byte


Config Timer1 = Timer , Prescale = 64
Config Timer0 = Timer , Prescale = 1024                     'конфигурируем таймер1 как таймер, 16байт


Enable Interrupts                                           'включаем глобальные прерывания
Enable Timer1
Disable Timer0                                              ' включаем прерывание таймера

Reset Portc.5   ' убираем сигнал с выходов контрольных светодиодов, чтоб к началу действий у нас ничего не горело
Reset Portc.4
Reset Portd.6   ' включаем линейки
Reset Portd.7

T1 = 10                                                     'задаем константу начала отсчета таймера

Temp = &B00000000                                           'задаем переменной, зажигающей нужный светодиод, значение 0, чтоб ничего не светилось

On Timer0 Reg:
On Timer1 Pulse:                                            'задаем и включаем подпрограмму обработки таймера1 (странно, почему сейчас а не потом?)

Portb = &B00000001                  	'теперь выводим приветствие в виде бегущей строки обоих линеек
Waitms 110
Portb = &B00000011
Waitms 110
Portb = &B00000111
Waitms 110
Portb = &B00001111
Waitms 110
Portb = &B00011111
Waitms 110
Portb = &B00111111
Waitms 110
Portb = &B01111111
Waitms 110
Portb = &B11111111
Waitms 110
Set Portc.4
Set Portc.5
Waitms 110
Portb = &B11111110
Waitms 110
Portb = &B11111100
Waitms 110
Portb = &B11111000
Waitms 110
Portb = &B11110000
Waitms 110
Portb = &B11100000
Waitms 110
Portb = &B11000000
Waitms 110
Portb = &B10000000
Waitms 110
Portb = &B00000000
Waitms 110

Start Adc                  ' запускаем АЦП

Gosub Writen		   'переходим к чтению контрольных значений из еепром

Set Portc.5		' а это зачем здесь?
Set Portc.4

Do                                                          ' основной цикл программы
 Debounce Pind.3 , 0 , Menshe , Sub			'опрашиваем кнопки
 Debounce Pind.2 , 0 , Bolshe , Sub                         
 If Pin2 = 0 Then Gosub Vyvod				'если переменная пин2 равна 0 то переходим к подпрограмме зажигания светодиодов
Loop Until Blok = 40	'ворачиваемся пока опрос кнопок не составил определенного времени, затем выходим из опроса.

Do
Gosub Vyvod              'основной цикл - переходим к подпрограмме зажигания светодиодов
Loop

Vyvod:			'подпрограмма зажигания светодиодов динамической индикацией							
  Portb = &B00000000	'гасим все светодиоды	
  Reset Portd.6		'включаем 1 линейку
  Portb = Temp		'берем данные о нужном светодиоде из переменной темп
  Waitms 2		'(непомню зачем поставил)
  Set Portd.6		'выключаем 1 линейку

  Portb = &B00000000	'аналогично для 2линейки 
  Reset Portd.7
  Portb = Temp2
  Waitms 2
  Set Portd.7
Return


Pulse:                                                      'подпрограмма обработки прерывания таймера1
 Stop Timer1                                                ' останавливаем таймер 1
 Timer1 = T1                                                ' присваеваем таймеру значение константы
  Volt = Getadc(0)		'берем данные с АЦП 
  Volt2 = Getadc(3)
   Temp = 0	'сбрасываем значение о нужном светодиоде
   Toggle Puls	'меняем значение бита

'Сравниваем значения АЦП с данными,взятыми из еепром
'и подаем в переменную данные о зажигании соответствующего светодиода

  If Volt < Top(1) And Puls = 0 Then Temp = &B00000001		'для первой линейки плюс мигаем этим светодиодом
  If Volt2 > Tem(1) Then Temp2 = &B00000000			'для второй линейки	

  If Volt >= Top(1) And Volt < Top(2) Then Temp = &B00000001
  If Volt2 <= Tem(1) And Volt2 > Tem(2) Then Temp2 = &B00000001

  If Volt >= Top(2) And Volt < Top(3) Then Temp = &B00000010
  If Volt2 <= Tem(2) And Volt2 > Tem(3) Then Temp2 = &B00000010


  If Volt >= Top(3) And Volt < Top(4) Then Temp = &B00000100
  If Volt2 <= Tem(3) And Volt2 > Tem(4) Then Temp2 = &B00000100


  If Volt >= Top(4) And Volt < Top(5) Then Temp = &B00001000
  If Volt2 <= Tem(4) And Volt2 > Tem(5) Then Temp2 = &B00001000


  If Volt >= Top(5) And Volt < Top(6) Then Temp = &B00010000
  If Volt2 <= Tem(5) And Volt2 > Tem(6) Then Temp2 = &B00010000


  If Volt >= Top(6) And Volt < Top(7) Then Temp = &B00100000
  If Volt2 <= Tem(6) And Volt2 > Tem(7) Then Temp2 = &B00100000


  If Volt >= Top(7) And Volt < Top(8) Then Temp = &B01000000
  If Volt2 <= Tem(7) And Volt2 > Tem(8) Then Temp2 = &B01000000


  If Volt >= Top(8) Then Temp = &B10000000
  If Volt2 <= Tem(8) And Puls = 0 Then Temp2 = &B10000000
  If Volt2 <= Tem(8) And Puls = 1 Then Temp2 = &B00000000

 Start Timer1                                               'запускаем таймер 1
 Incr Blok						'увеличиваем переменную по которой производится выход из опроса кнопок
 If Blok >= 61 Then Blok = 0				'сбрасываем ее
Return

Bolshe:				'обработка кнопки2
  Waitms 300			'ждем
   If Pind.2 = 0 Then		'если нажата то 
    Waitms 1000			'ЖДЕМ ЕЩЕ ДОЛЬШЕ
     If Pind.2 = 0 Then		'если все таки нажата то
      Gosub Nastr		'переходим к программе выбора калибровки указателя
     End If
   End If


Return

Menshe:				'обработка кнопки 1
 If Pin2 = 1 Then		'если переменная пин2 равна 1
  Gosub Nastroika_topliv	'переходим к калибровке первого указателя(первой линейки) 
 End If
 If Pin2 = 2 Then		'если равна 2 то
  Gosub Nastroika_temper	'к калибровке второго указателя
 End If

Return




Reg:				'при калибровке мигаем соответствующими контрольными светордиодами
 Incr Tim0
 If Tim0 = 5 Then
  If Pin2 = 1 Then Toggle Portc.5  'если калибруем 1 указатель то одним диодои
  If Pin2 = 2 Then Toggle Portc.4   'если 2 указатель то другим	
 Tim0 = 0
 End If

Return

Nastr:      	' подпрограмма  выбора калибровки нужного указателя 
 Incr Pin2       ' увеличиваем переменную   
  If Pin2 >= 3 Then Pin2 = 0   'и сбрасываем ее

   If Pin2 = 1 Then           'если выбран первый указатель 
    Set Portd.7		'выключаем 2 линейку
    Reset Portd.6		'и включаем 1 линейку
   End If

   If Pin2 = 2 Then      	' аналогично для второго указателя
    Set Portd.6
    Reset Portd.7
   End If

  If Pin2 = 1 Or Pin2 = 2 Then      'если выбрана для калибровки одна из линеек
   Nast = 0					' сбрасываем переменную
   Disable Timer1 	'выключаем таймер 1
   Enable Timer0	'включаем таймер 2
   Portb = &B00000000        'гасим все светодиоды в линейке
  End If

  If Pin2 = 0 Then          'если  переменная  выбора калибровки сброшена
    Gosub Writen          'переходим к чтению данных из еепром
    Enable Timer1        'вкл таймер1
    Disable Timer0      'выкл таймер2
   Set Portc.4                'и выключаем обе линейки
   Set Portc.5
  End If
Return

Nastroika_topliv:        'калибруем первый указатель

  Volt = Getadc(0)           'берем данные с ацп перого входа

  If Nast >= 9 Then Nast = 0           ' сбрасываем переменную  
  Incr Nast						' и увеличиваем ее

   Temp = 0							'гасим все светодиоды
   Portb = Temp

  Select Case Nast					'калибруем 1 указатель
   Case 1 : Topliv(nast) = Volt			'в первую яйчейку массива первого указателя в еепром заносим данные с АЦП 
            Set Portb.0					'и зажигаем соответствующий светодиод  для  отслеживания записи


   Case 2 : Topliv(nast) = Volt			'аналогично для остальных значений
           Set Portb.1

   Case 3 : Topliv(nast) = Volt
           Set Portb.2

   Case 4 : Topliv(nast) = Volt
           Set Portb.3

   Case 5 : Topliv(nast) = Volt
           Set Portb.4

   Case 6 : Topliv(nast) = Volt
           Set Portb.5

   Case 7 : Topliv(nast) = Volt
           Set Portb.6

   Case 8 : Topliv(nast) = Volt
           Set Portb.7
   End Select

Return

Nastroika_temper:					'аналогично записываем значения в еепром второго указателя

  Volt2 = Getadc(3)
  If Nast >= 9 Then Nast = 0
  Incr Nast

   Temp = 0
   Portb = Temp

  Select Case Nast
   Case 1 : Temper(nast) = Volt2
            Set Portb.0


   Case 2 : Temper(nast) = Volt2
           Set Portb.1

   Case 3 : Temper(nast) = Volt2
           Set Portb.2

   Case 4 : Temper(nast) = Volt2
           Set Portb.3

   Case 5 : Temper(nast) = Volt2
           Set Portb.4

   Case 6 : Temper(nast) = Volt2
           Set Portb.5

   Case 7 : Temper(nast) = Volt2
           Set Portb.6

   Case 8 : Temper(nast) = Volt2
           Set Portb.7
   End Select

Return

Writen:           ' подпрограмма считывания данных  калибровки с еепром 
 For O = 1 To 8
  Top(o) = Topliv(o)
  Tem(o) = Temper(o)
 Next

Return

End                                                         'end program