'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 12.10.2015 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** Device = 16F876 Xtal = 4 On_Interrupt GoTo prer '-----------------20 30 66 '------------------ настройка порта С --------------------------- PORTC = %00000000 ' на выходе порта С нули TRISC = 0 ' порт С на выход PORTC.7 = 1 ' подадим +5в затвор VT1, и тем самым обесточим, ' сделаем неактивными выходные клеммы удаленного ' управления PORTC.6 = 1 ' аналогично '------------------ настройка порт В ---------------------------- 'Declare PortB_Pullups = On 'подключим подтягивающие резисторы к порт В TRISB = 1 ' порт В на вход '------------------ настройки потра А --------------------------- ADCON1 = %00000100 ' левое выравнивание, RA0; RA1; RA3 - аналоговый вход, ' RA2; RA5 - цифровые ( можно входы, можно выходы ) TRISA = 1 ' порт А на вход Declare Adin_Res = 8 ' разрядность преобразования АЦП 8 бит Declare Adin_Tad = 8_fosc ' выбор источника тактового сигнала - Fosc/8 Declare Adin_Stime = 50 ' время ожидания 50 мкс перед началом преобразования '------------------ обьявление переменных ----------------------- Dim timer_1 As TMR1L.Word ' зададим имя регистра TMR1 для загрузки значения полупериода ' частоты генератора Dim fact_tmr0 As Byte ' переменная фиксирующая факт прерывания по переполнению таймера TMR0 Dim fact_tmr1 As Byte ' переменная фиксирующая факт прерывания по переполнению таймера TMR1 Dim urov As Byte ' пременная для смены состояний высокого на низкий уровень меандра ' генератора Dim a As Byte ' просто переменная для организации цикла Dim b As Byte ' переменная цикла Dim c As Byte ' переменная цикла Symbol timer_0 = TMR0 ' переменная timer_0, это у нас новое имя регистру TMR0 Dim acp As Byte ' назначим переменную для хранения преобразования АЦП Dim t_timer_1 As Word ' изменяющаяся (вычисляемая в подпрограмме p00) переменная полупериода частоты ' сигнала генератора Dim fact_acp As Byte ' переменная организации прореживания ( деления на два ) прерываний от таймера ' TMR0 Dim per_0v_s1 As Byte ' переменная периода (инкрементируемая) регистрации низкого уровня на соответст- ' вующем входе порта PORTB - антидребезговая защита Dim per_0v_s2 As Byte ' Dim per_0v_s3 As Byte ' Dim per_0v_s4 As Byte ' Dim per_0v_s5 As Byte ' Dim per_0v_s6 As Byte ' переменная периода (инкрементируемая) регистрации низкого уровня на соответст- ' вующем входе порта PORTB - антидребезговая защита Dim vkl_s1 As Byte ' переменная включено - выключено Dim vkl_s2 As Byte ' переменная включено - выключено Dim vkl_s3 As Byte ' переменная включено - выключено Dim vkl_s4 As Byte ' переменная включено - выключено Dim vkl_s5 As Byte ' переменная включено - выключено Dim vkl_s6 As Byte ' переменная включено - выключено Dim per_5v_s1 As Byte ' переменная набора времени периода для идентификации отпущенного состояния ' кнопки s6 ( инкрементируемая ) Dim per_5v_s2 As Byte ' Dim per_5v_s3 As Byte ' Dim per_5v_s4 As Byte ' Dim per_5v_s5 As Byte ' Dim per_5v_s6 As Byte ' переменная набора времени периода для идентификации отпущенного состояния ' кнопки s6 (инкрементируемая) Dim s1_on_prin_resh As Byte ' флаг по которому отправляемся в подпрограмму принятия решений по факту нажа- ' тия на кнопку s1 ( обьявим этот флаг для того, чтобы в подпрограмму прин-реш ' мы попадали единоразово после произошедшего нажатия на кнопку s1 ) Dim s2_on_prin_resh As Byte ' Dim s3_on_prin_resh As Byte ' Dim s4_on_prin_resh As Byte ' Dim s5_on_prin_resh As Byte ' Dim s6_on_prin_resh As Byte ' флаг по которому отправляемся в подпрограмму принятия решений по факту нажа- ' тия на кнопку s6 ( обьявим этот флаг для того, чтобы в подпрограмму прин-реш ' мы попадали единоразово после произошедшего нажатия на кнопку s6 ) Dim s1_on As Byte ' флаг факта состоявшегося нажатия на кнопку s1 Dim s2_on As Byte ' Dim s3_on As Byte ' Dim s4_on As Byte ' Dim s5_on As Byte ' флаг факта состоявшегося нажатия на кнопку s5 Dim s6_on As Byte ' флаг факта наличия низкого уровня на входе PORTB.5 Dim timer_buz As Byte ' переменная ( инкрементируемая )периода работы бузера - подтверждение нажатия ' на кнопки или аварийной ситуации Dim buz_on As Byte ' флаг включения бузера Symbol s1 = PORTB.4 ' присвоим порту PORTB.4 принадлежность к кнопке S1, это у нас это кнопка ' Пульт / Клеммы Symbol s2 = PORTB.3 ' присвоим порту PORTB.3 принадлежность к кнопке S2, это Сброс Symbol s3 = PORTB.2 ' присвоим порту PORTB.2 принадлежность к кнопке S3, это STOP Symbol s4 = PORTB.1 ' присвоим порту PORTB.1 принадлежность к кнопке S4 и оптопаре, это RUN Symbol s5 = PORTB.0 ' присвоим порту PORTB.0 принадлежность к кнопке S5 и оптопаре, это REVERS Symbol s6 = PORTB.5 ' присвоим порту PPORTB.5, потенциал транзистора T1, вывод Drain, ( будем конт- ' ролировать напряжение на этом выводе транзистора ) Symbol buzzer_on = PORTC.3 ' присвоим порту PORTC.3 принадлежность к работе бузера timer_0 = 0 ' переполнение TMR0 при 1/128 коэффициенте делителя наступит примерно через ' 32,768 мс, это 30,5 прерываний в секунду fact_tmr0 = 0 ' сбросим переменную в ноль чтобы программа понимала что преры- ' вания от таймера TMR0 еще нет fact_tmr1 = 0 ' аналогично и эту переменную в ноль, указывая программе что пре- ' рывания от таймере TMR1 еще нет urov = 0 ' переменная значения напряжения на выходе генератора (0В или +5В) acp = 1 ' временно зададим перовоначальную частоту 30 Гц (1) t_timer_1 = 48869 ' начальная - минимальная частота 30 Гц fact_acp = 0 ' обнулим на всякий случай переменную каждого второго прерывания от TMR0 per_0v_s1 = 0 per_0v_s1 = 0 ' обнулим переменную задержки регистрации низкого уровня с кнопки s1 per_0v_s2 = 0 ' обнулим переменную задержки регистрации низкого уровня с кнопки s2 per_0v_s3 = 0 ' обнулим переменную задержки регистрации низкого уровня с кнопки s3 per_0v_s4 = 0 ' обнулим переменную задержки регистрации низкого уровня с кнопки s4 per_0v_s5 = 0 ' обнулим переменную задержки регистрации низкого уровня с кнопки s5 per_0v_s6 = 0 ' обнулим переменную задержки регистрации низкого уровня с кнопки s6 s1_on = 0 ' обнулим переменную факта нажатия на кнопку s1 s2_on = 0 ' обнулим переменную факта нажатия на кнопку s2 s3_on = 0 ' обнулим переменную факта нажатия на кнопку s3 s4_on = 0 ' обнулим переменную факта нажатия на кнопку s4 s5_on = 0 ' обнулим переменную факта нажатия на кнопку s5 s6_on = 0 ' обнулим переменную факта наличия низкого уровня на входе PORTB.5 timer_buz = 0 ' обнулим переменную времени включения бузера buz_on = 0 ' обнулим флаг включения бузера vkl_s1 = 0 ' вначале - выключено vkl_s2 = 0 ' вначале - выключено vkl_s3 = 0 ' вначале - выключено vkl_s4 = 0 ' вначале - выключено vkl_s5 = 0 ' вначале - выключено vkl_s6 = 0 ' вначале - выключено per_5v_s1 = 0 ' обнулим переменную задержки регистрации высокого уровня с кнопки s1 per_5v_s2 = 0 ' обнулим переменную задержки регистрации высокого уровня с кнопки s2 per_5v_s3 = 0 ' обнулим переменную задержки регистрации высокого уровня с кнопки s3 per_5v_s4 = 0 ' обнулим переменную задержки регистрации высокого уровня с кнопки s4 per_5v_s5 = 0 ' обнулим переменную задержки регистрации высокого уровня с кнопки s5 per_5v_s6 = 0 ' обнулим переменную задержки регистрации высокого уровня с кнопки s6 s1_on_prin_resh = 0 ' обнулим переменную факта нажатия на кнопку s1, для единоразового посещения ' подпрограммы принятия решений ( prin_resh ) s2_on_prin_resh = 0 ' s3_on_prin_resh = 0 ' s4_on_prin_resh = 0 ' s5_on_prin_resh = 0 ' s6_on_prin_resh = 0 ' обнулим переменную факта нажатия на кнопку s6, для единоразового посещения ' подпрограммы принятия решений ( prin_resh ) '------------------ настройка регистров таймера TMR1 ------------ PIE1.0 = 1 ' разрешение прерывания от TMR1 INTCON.6 = 1 ' разрешение прерываний от периферийных модулей INTCON.7 = 1 ' глобальное разрешение прерываний T1CON = %00000001 ' включение модуля TMR1, выбор источника тактового сигнала - Fosc/4, ' коэффициент деления предделителя 1:1 '------------------ настройка регистров таймера TMR0 ------------ timer_0 = 0 ' значение периода обращения к модулю АЦП INTCON.5 = 1 ' прерывание от TMR0 разрешено OPTION_REG = %10000100 ' коэффициент деления предделителя 1:128(1:32), предделитель включен перед ' TMR0, выбор тактового сигнала для TMR0 - внутренний, подтягивающие ' резисторы - отключены 'GoTo main ' после всех настроек перейдем к выполнению основной программы '------------------ подпрограмма обработчика прерываний --------- prer: Context Save ' сохраним регистры STATUS и аккумулятор If PIR1.0 = 1 Then ' проверим, било ли вызвано пррерывание переполнением именно таймером ' TMR1, если это так, то: PIR1.0 = 0 ' сразу сбросим флаг этого прерывания, и fact_tmr1 = 1 ' установим факт запроса прерывания от таймера TMR1 timer_1 = t_timer_1 ' загрузим в TMR1 это значение (65369 1:1 166 мкс) EndIf If INTCON.2 = 1 Then ' теперь проверим было ли прерывание от модуля таймера TMR0, если да, то INTCON.2 = 0 ' сбрасываем влаг вызвавший это прерывание, и fact_tmr0 = 1 ' установим факт запроса прерывания от таймера TMR0 timer_0 = 0 ' новое значение для периода переполнения равно 32 768 мкс, ( 16,384 mc ) EndIf Context Restore ' восстановим значение регистров W и STATUS Retfie ' возврат из обработчика cikl: a = a + 1 GoTo cikl '------------------------------------40 110 '---------------------------- ОСНОВНОЙ ЦИКЛ --------------------- 'main: 'If fact_tmr1 = 1 Then ' если имеется факт прерывания от таймера TMR1, то 'fact_tmr1 = 0 ' сбросим факт прерывания, и 'GoSub meandr ' отправляемся в подпрограмму формирования меандра - meandr 'EndIf 'If fact_tmr0 = 1 Then ' если имеется факт прерывания от таймера TMR0, то 'Inc fact_acp ' увеличиваем на единицу переменную fact_acp, для того чтобы при следующем выяв- ' ленном новом факте прерывания (fact_1), отправиться в подпрограмму преобразо- ' вания АЦП - p00 'If buz_on = 1 Then ' если поднят флаг на включение бузера, то 'Inc timer_buz ' инкрементируем с каждым новым переполнением таймера TMR0 счетчик - измеритель ' времени работы бузера ( timer_buz ) 'EndIf 'fact_tmr0 = 0 ' сбросим факт прерываня 'GoSub skan_knop ' отправляемся в подпрограмму сканирования кнопок ( skan_knop ) 'EndIf '---------------------------- повторение опроса ------------------------------------------------------------- 'If fact_tmr1 = 1 Then ' ДОПОЛНИТЕЛЬНО ЕСЛИ В ЭТОМ МЕСТЕ СНОВА ВОЗНИК факт прерывания от таймера TMR1, то 'fact_tmr1 = 0 ' сбросим факт прерывания, и 'GoSub meandr ' отправляемся в подпрограмму формирования меандра - meandr 'EndIf '------------------------------------------------------------------------------------------------------------ 'If timer_buz = 8 Then ' если с момента включения бузера прошло восемь периодов переполлнения таймера ' TMR0, то 'timer_buz = 0 ' обнулим счетную временную переменную времени работы таймера 'buzzer_on = 0 ' выключим собственно сам бузер 'buz_on = 0 ' опустим флаг по которому мы определяем что бузер необходимо включить 'EndIf 'If fact_acp = 8 Then ' если флаг каждых вторых (восьмых) прерываний от таймера TMR0 поднят, то 'fact_acp = 0 ' обнулим переменную прореживания, и 'GoSub izmerenie_u ' отправляемся в подпрограмму преобразования АЦП (измерение напряжения) - izmerenie_u 'EndIf 'If s1_on_prin_resh = 1 Or s2_on_prin_resh = 1 Or s3_on_prin_resh = 1 Or s4_on_prin_resh = 1 Or s5_on_prin_resh = 1 Then 'or s6_on_prin_resh = 1 Then ' проверяем факты нажатия ' на какую либо из кнопок , если любой из результатов положительный, то 'GoSub prin_resh ' отправляемся в подпрограмму принятия решений по факту нажатия на кнопки 'EndIf 'GoTo main ' отправляемся в новый цикл '---------------------------- подпрограмма обработки двуг флагов подряд fact_tmr0, и измерения напряжения ' на переменном резисторе 'izmerenie_u: 'INTCON.7 = 0 ' запретим все прерывания вообще 'acp = ADIn 0 ' произведем преобразование АЦП 'INTCON.7 = 1 ' разрешим все прерывания 'If acp = 0 Then ' если преобразование равно нулю, ручка до упора выкручена влево, то ' 'acp = 1 ' укажем программе первый минимальный шаг регулирования ( 30 Гц ) 'ElseIf acp > 248 Then ' если значение АЦП перевалило за 248, ( ручка до упора ' вправо ), то 'acp = 247 ' приведем значение АЦП к максимальному 247 шагу ( прим. 2336 Гц ) 'EndIf 't_timer_1 = 48869 + (67 * acp ) ' вычислим величину нового значения для модуля TMR1 'If t_timer_1 > 65369 Then ' проверим полученный результат, для того чтобы частота не подымалось ' выше чем например 2560 Гц 't_timer_1 = 65369 'EndIf 'Return '---------------------------- подпрограмма обработки флага fact_tmr1, и формирования полупериодаполупериода ' меандра 'meandr: 'If urov = 0 Then ' если состояние уровня равно 0В, то 'PORTC.2 = 1 ' сделаем сигнал на выходе PORTC.2 +5B 'Inc urov ' инкрементируем ( увеличим ) на единицу значение переменной urov 'ElseIf urov = 1 Then ' если же состояние уровня равно +5В, то 'PORTC.2 = 0 ' сделаем сигнал на выходе PORTC.2 0В 'urov = 0 ' обнулим переменную urov, тем самым давая понять программе, что в ' следующий раз нам необходимо будет получить +5В на выходе PORTC.2 'EndIf 'Return ' вернемся в главную программу '---------------------------- подпрограмма сканирования кнопок ---------------------------------------------- '------------------------------------------------------------------------------------------------------------ ' В данной подпрограмме сканирования кнопок реализован данный алгоритм работы. Периодично, а именно по каждо- ' му переполнению таймера TMR0, рабочая точка программы перемещается в подпрограмму skan_knop, далее начина- ' ется по очереди опрос кнопок s1-s6. Детальнее процесс на примере кнопки s1. Сначало проверяем состояние ' уровня напряжения на входе порта PORTB.4, если уровень напряжения равен нулю (кнопка нажата), И с момента ' последнего отжатия кнопки s1 прошло более двух периодов переполнения таймера TMR0, то начинаем увеличивать ' по каждому переполнению таймера TMR0 переменную - ожидания нажатого состояния кнопки s1 - ( per_0v_s1 ). ' Ниже в этой же подпрограмме проверяем значение этой переменной, и если оно больше или равно двум, то есть ' кнопка s1 нажата ровно или более двух переполнений таймера TMR0, то устанавливаем флаг факта состоявшегося ' нажатия на кнопку s1, один флаг s1_on_prin_resh для захода в подпрограмму принятия решений по фактам сос- ' тоявшихся нажатий ( в эту подпрограмму рабочая точка программы заходит сразу же как только обнаруживает ' поднятым данный флаг в теле цикла основной программы, как только данный флаг выполнит необходимое действие, ' он сдесь же и будет сброшен в ноль ), и второй флаг s1_on по которому мы определяем что кнопка была толь- ' ко что нажата. В противном случае мы проверяем состояние напряжения на входе порта PORTB.4, если уровень ' положительный (кнопка отпущена), И с момента последнего нажатия на кнопку s1 прошло ровно или более двух ' периодов переполнения таймера TMR0, то начинаем увеличивать с каждым переполнением таймера TMR0 перемен- ' ную - ожидания состояния отпускания кнопки s1 -( per_5v_s1 ). Ниже в этой же подпрограмме проверяем значе- ' ние этой переменной, если оно больше или равно твум периодам переполнения таймера TMR0, ( то есть кнопка ' отпущена уже ровно или более этих двух периодов переполнения ), то опускаем флаг факта нажатия на кнопку s1 ' ( s1_on ), и обнуляем переменную выдержки отпущенного состояния кнопки s1. '------------------------------------------------------------------------------------------------------------ 'skan_knop: 'If s1 = 0 And s1_on = 0 Then ' если кнопка s1 нажата, И как дальше будет понятно отпущена уже более двух пе- ' риодов переполнения таймера TMR0, то 'Inc per_0v_s1 ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s1) 'ElseIf s1 = 1 And s1_on = 1 Then ' или если кнопка s1 отпущена, И с момента последнего нажатия прошло ' менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования ' факт нажатия кнопки s1 s1_on еще не опущен, то 'Inc per_5v_s1 ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s1) 'EndIf 'If s2 = 0 And s2_on = 0 Then ' если кнопка s2 нажата, И как дальше будет понятно отпущена уже более двух пе- ' риодов переполнения таймера TMR0, то 'Inc per_0v_s2 ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s2) 'ElseIf s2 = 1 And s2_on = 1 Then ' или если кнопка s2 отпущена, И с момента последнего нажатия прошло ' менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования ' факт нажатия кнопки s2 s2_on еще не опущен, то 'Inc per_5v_s2 ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s2) 'EndIf 'If per_0v_s1 = 2 Then ' если судя по инкрементированной переменной ожидания per_0v_s1, кнопка s1 на- ' жата уже более двух подрят переполнений таймера TMR0, то 's1_on_prin_resh = 1 ' устанавливаем факт нажатия на кнопку s1 - s1_on_prin_resh для реакции на это ' действие в подпрограмме принятия решений - prin_resh 's1_on = 1 ' устанавливаем флаг факта нажатия на кнопку s1 для отслеживания выдержки в раз- ' мере двух периодов таймера TMR0, - этот флаг для принятия решений в этой под- ' программе 'buz_on = 1 ' подымем флаг того что мы включаем буззер 'buzzer_on = 1 ' включим собственно сам бузер ( в порт PORTC.3 выдадим единицу ) 'per_0v_s1 = 0 ' обнуляем переменную - ожидание состояния низкого уровня напряжения, что бы в ' дальнейшем вновь иметь возможность отсчитать два периода переполнения TMR0 ' перед фиксированием нового нажатия кнопки s1 'ElseIf per_5v_s1 = 2 Then ' или если судя по переменной - ожидания состояния высокого уровня per_5v_s1, ' кнопка s1 отпущена более или ровно двух периодов переполнения таймера TMR0, то 's1_on = 0 ' обнуляем флаг факта нажатия на кнопку s1, и 'per_5v_s1 = 0 ' обнуляем переменную - ожидания состояния высокого уровня, для того что бы да- ' лее вновь иметь возможность измерить время первых двух периодов состояния от- ' пускания кнопки s1, по истечении которых точно будем знать, что кнопка s1 - ' отпущена 'EndIf 'If per_0v_s2 = 2 Then ' если судя по инкрементированной переменной ожидания per_0v_s2, кнопка s2 на- ' жата уже более двух подрят переполнений таймера TMR0, то 's2_on_prin_resh = 1 ' устанавливаем факт нажатия на кнопку s2 - s2_on_prin_resh для реакции на это ' действие в подпрограмме принятия решений - prin_resh 's2_on = 1 ' устанавливаем флаг факта нажатия на кнопку s2 для отслеживания выдержки в раз- ' мере двух периодов таймера TMR0, - этот флаг для принятия решений в этой под- ' программе 'buz_on = 1 ' подымем флаг того что мы включаем буззер 'buzzer_on = 1 ' включим собственно сам бузер ( в порт PORTC.3 выдадим единицу ) 'per_0v_s2 = 0 ' обнуляем переменную - ожидание состояния низкого уровня напряжения, что бы в ' дальнейшем вновь иметь возможность отсчитать два периода переполнения TMR0 ' перед фиксированием нового нажатия кнопки s2 'ElseIf per_5v_s2 = 2 Then ' или если судя по переменной - ожидания состояния высокого уровня per_5v_s2, ' кнопка s2 отпущена более или ровно двух периодов переполнения таймера TMR0, то 's2_on = 0 ' обнуляем флаг факта нажатия на кнопку s2, и 'per_5v_s2 = 0 ' обнуляем переменную - ожидания состояния высокого уровня, для того что бы да- ' лее вновь иметь возможность измерить время первых двух периодов состояния от- ' пускания кнопки s2, по истечении которых точно будем знать, что кнопка s2 - ' отпущена 'EndIf 'If s3 = 0 And s3_on = 0 Then ' если кнопка s3 нажата, И как дальше будет понятно отпущена уже более двух пе- ' риодов переполнения таймера TMR0, то 'Inc per_0v_s3 ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s3) 'ElseIf s3 = 1 And s3_on = 1 Then ' или если кнопка s3 отпущена, И с момента последнего нажатия прошло ' менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования ' факт нажатия кнопки s3 s3_on еще не опущен, то 'Inc per_5v_s3 ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s3) 'EndIf 'If s4 = 0 And s4_on = 0 Then ' если кнопка s4 нажата, И как дальше будет понятно отпущена уже более двух пе- ' риодов переполнения таймера TMR0, то 'Inc per_0v_s4 ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s4) 'ElseIf s4 = 1 And s4_on = 1 Then ' или если кнопка s4 отпущена, И с момента последнего нажатия прошло ' менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования ' факт нажатия кнопки s4 s4_on еще не опущен, то 'Inc per_5v_s4 ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s4) 'EndIf 'If per_0v_s3 = 2 Then ' если судя по инкрементированной переменной ожидания per_0v_s3, кнопка s3 на- ' жата уже более двух подрят переполнений таймера TMR0, то 's3_on_prin_resh = 1 ' устанавливаем факт нажатия на кнопку s3 - s3_on_prin_resh для реакции на это ' действие в подпрограмме принятия решений - prin_resh 's3_on = 1 ' устанавливаем флаг факта нажатия на кнопку s3 для отслеживания выдержки в раз- ' мере двух периодов таймера TMR0, - этот флаг для принятия решений в этой под- ' программе 'buz_on = 1 ' подымем флаг того что мы включаем буззер 'buzzer_on = 1 ' включим собственно сам бузер ( в порт PORTC.3 выдадим единицу ) 'per_0v_s3 = 0 ' обнуляем переменную - ожидание состояния низкого уровня напряжения, что бы в ' дальнейшем вновь иметь возможность отсчитать два периода переполнения TMR0 ' перед фиксированием нового нажатия кнопки s1 'ElseIf per_5v_s3 = 2 Then ' или если судя по переменной - ожидания состояния высокого уровня per_5v_s3, ' кнопка s3 отпущена более или ровно двух периодов переполнения таймера TMR0, то 's3_on = 0 ' обнуляем флаг факта нажатия на кнопку s3, и 'per_5v_s3 = 0 ' обнуляем переменную - ожидания состояния высокого уровня, для того что бы да- ' лее вновь иметь возможность измерить время первых двух периодов состояния от- ' пускания кнопки s3, по истечении которых точно будем знать, что кнопка s3 - ' отпущена 'EndIf 'If per_0v_s4 = 2 Then ' если судя по инкрементированной переменной ожидания per_0v_s4, кнопка s4 на- ' жата уже более двух подрят переполнений таймера TMR0, то 's4_on_prin_resh = 1 ' устанавливаем факт нажатия на кнопку s4 - s4_on_prin_resh для реакции на это ' действие в подпрограмме принятия решений - prin_resh 's4_on = 1 ' устанавливаем флаг факта нажатия на кнопку s4 для отслеживания выдержки в раз- ' мере двух периодов таймера TMR0, - этот флаг для принятия решений в этой под- ' программе 'buz_on = 1 ' подымем флаг того что мы включаем буззер 'buzzer_on = 1 ' включим собственно сам бузер ( в порт PORTC.3 выдадим единицу ) 'per_0v_s4 = 0 ' обнуляем переменную - ожидание состояния низкого уровня напряжения, что бы в ' дальнейшем вновь иметь возможность отсчитать два периода переполнения TMR0 ' перед фиксированием нового нажатия кнопки s1 'ElseIf per_5v_s4 = 2 Then ' или если судя по переменной - ожидания состояния высокого уровня per_5v_s4, ' кнопка s4 отпущена более или ровно двух периодов переполнения таймера TMR0, то 's4_on = 0 ' обнуляем флаг факта нажатия на кнопку s4, и 'per_5v_s4 = 0 ' обнуляем переменную - ожидания состояния высокого уровня, для того что бы да- ' лее вновь иметь возможность измерить время первых двух периодов состояния от- ' пускания кнопки s4, по истечении которых точно будем знать, что кнопка s4 - ' отпущена 'EndIf 'If s5 = 0 And s5_on = 0 Then ' если кнопка s5 нажата, И как дальше будет понятно отпущена уже более двух пе- 'Inc per_0v_s5 ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s5) 'ElseIf s5 = 1 And s5_on = 1 Then ' или если кнопка s5 отпущена, И с момента последнего нажатия прошло ' менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования ' факт нажатия кнопки s5 s5_on еще не опущен, то 'Inc per_5v_s5 ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s5) 'EndIf 'If s6 = 0 And s6_on = 0 Then ' если кнопка s6 нажата, И как дальше будет понятно отпущена уже более двух пе- ' риодов переполнения таймера TMR0, то 'Inc per_0v_s6 ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s6) 'ElseIf s6 = 1 And s6_on = 1 Then ' или если кнопка s6 отпущена, И с момента последнего нажатия прошло ' менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования ' факт нажатия кнопки s6 s6_on еще не опущен, то 'Inc per_5v_s6 ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s6) 'EndIf 'If per_0v_s5 = 2 Then ' если судя по инкрементированной переменной ожидания per_0v_s5, кнопка s5 на- ' жата уже более двух подрят переполнений таймера TMR0, то 's5_on_prin_resh = 1 ' устанавливаем факт нажатия на кнопку s5 - s5_on_prin_resh для реакции на это ' действие в подпрограмме принятия решений - prin_resh 's5_on = 1 ' устанавливаем флаг факта нажатия на кнопку s5 для отслеживания выдержки в раз- ' мере двух периодов таймера TMR0, - этот флаг для принятия решений в этой под- ' программе 'buz_on = 1 ' подымем флаг того что мы включаем буззер 'buzzer_on = 1 ' включим собственно сам бузер ( в порт PORTC.3 выдадим единицу ) 'per_0v_s5 = 0 ' обнуляем переменную - ожидание состояния низкого уровня напряжения, что бы в ' дальнейшем вновь иметь возможность отсчитать два периода переполнения TMR0 ' перед фиксированием нового нажатия кнопки s5 'ElseIf per_5v_s5 = 2 Then ' или если судя по переменной - ожидания состояния высокого уровня per_5v_s5, ' кнопка s4 отпущена более или ровно двух периодов переполнения таймера TMR0, то 's5_on = 0 ' обнуляем флаг факта нажатия на кнопку s5, и 'per_5v_s5 = 0 ' обнуляем переменную - ожидания состояния высокого уровня, для того что бы да- ' лее вновь иметь возможность измерить время первых двух периодов состояния от- ' пускания кнопки s5, по истечении которых точно будем знать, что кнопка s5 - ' отпущена 'EndIf 'If per_0v_s6 > = 2 Then ' если судя по инкрементированной переменной ожидания per_0v_s6, кнопка s6 на- ' жата уже более двух подрят переполнений таймера TMR0, то 's6_on_prin_resh = 1 ' устанавливаем факт нажатия на кнопку s6 - s6_on_prin_resh для реакции на это ' действие в подпрограмме принятия решений - prin_resh 's6_on = 1 ' устанавливаем флаг факта нажатия на кнопку s6 для отслеживания выдержки в раз- ' мере двух периодов таймера TMR0, - этот флаг для принятия решений в этой под- ' программе 'buz_on = 1 ' подымем флаг того что мы включаем буззер 'buzzer_on = 1 ' включим собственно сам бузер ( в порт PORTC.3 выдадим единицу ) 'per_0v_s6 = 0 ' обнуляем переменную - ожидание состояния низкого уровня напряжения, что бы в ' дальнейшем вновь иметь возможность отсчитать два периода переполнения TMR0 ' перед фиксированием нового нажатия кнопки s6 'ElseIf per_5v_s6 > = 2 Then ' или если судя по переменной - ожидания состояния высокого уровня per_5v_s6, ' кнопка s4 отпущена более или ровно двух периодов переполнения таймера TMR0, то 's6_on = 0 ' обнуляем флаг факта нажатия на кнопку s6, и 'per_5v_s6 = 0 ' обнуляем переменную - ожидания состояния высокого уровня, для того что бы да- ' лее вновь иметь возможность измерить время первых двух периодов состояния от- ' пускания кнопки s6, по истечении которых точно будем знать, что кнопка s6 - ' отпущена 'EndIf 'Return '---------------------------- подпрограмма принятия решений по фактам нажатия на кнопки s1 - s5, и PORTB.5 -- 'prin_resh: 'If s1_on = 1 And vkl_s1 = 0 Then 'PORTC.0 = 1 'PORTC.1 = 1 's1_on_prin_resh = 0 'vkl_s1 = 1 'ElseIf s1_on = 1 And vkl_s1 = 1 Then 'PORTC.0 = 0 'PORTC.1 = 0 's1_on_prin_resh = 0 'vkl_s1 = 0 'EndIf 'If s2_on = 1 And vkl_s2 = 0 Then 'PORTC.5 = 1 's2_on_prin_resh = 0 'vkl_s2 = 1 'ElseIf s2_on = 1 And vkl_s2 = 1 Then 'PORTC.5 = 0 's2_on_prin_resh = 0 'vkl_s2 = 0 'EndIf 'If s3_on = 1 And vkl_s3 = 0 Then 'PORTC.4 = 1 's3_on_prin_resh = 0 'vkl_s3 = 1 'ElseIf s3_on = 1 And vkl_s3 = 1 Then 'PORTC.4 = 0 's3_on_prin_resh = 0 'vkl_s3 = 0 'EndIf 'If s4_on = 1 And vkl_s4 = 0 Then 'PORTC.6 = 0 's4_on_prin_resh = 0 'vkl_s4 = 1 'PORTC.6 = 1 's4_on_prin_resh = 0 'vkl_s4 = 0 'EndIf 'If s5_on = 1 And vkl_s5 = 0 Then 'PORTC.7 = 0 's5_on_prin_resh = 0 'vkl_s5 = 1 'ElseIf s5_on = 1 And vkl_s5 = 1 Then 'PORTC.7 = 1 's5_on_prin_resh = 0 'vkl_s5 = 0 'EndIf 'If s6_on = 1 then ' And vkl_s6 = 0 Then 'PORTC.0 = 0 'PORTC.1 = 0 'PORTC.5 = 0 'PORTC.4 = 0 'PORTC.6 = 1 'PORTC.7 = 1 's6_on_prin_resh = 0 'vkl_s6 = 1 'ElseIf s6_on = 1 And vkl_s6 = 1 Then 'PORTC.0 = 0 'PORTC.1 = 0 's6_on_prin_resh = 0 'vkl_s6 = 0 'EndIf 'Return End