#include __CONFIG (FOSC_INTOSCCLK & WDTE_OFF & PWRTE_OFF & BOREN_OFF & LVP_OFF & MCLRE_OFF & CP_OFF & CPD_OFF); //************************************************************** #define _XTAL_FREQ 4000000 #define Bt_1 RA2 // контакт энкодера 1 #define Bt_2 RA4 // контакт энкодера 2 unsigned char Vhh; bit lk_1=0; // защелка void main (void){ OPTION_REG = 0b10000000; CMCON = 7; TRISA=0b00010100; TRISB=0; VRCON=0; PORTA=0; PORTB=0; INTCON=0; Vhh= 0x80; // стартовое условие. в старший бит записываем 1. while(1){ if(Bt_1==0&&lk_1==0){// сработал контакт и бит защелки lk_1 = 0 __delay_ms(2); // задержка антидребезга и еще раз проверяем контакт if(Bt_1==0&&Bt_2==0){lk_1=1;if(Vhh>0x01)Vhh=Vhh>>1;}//здесь выполеняется при вращении энкодера по часовой if(Bt_1==0&&Bt_2==1){lk_1=1;if(Vhh<0x80)Vhh=Vhh<<1;}//здесь выполеняется при вращении энкодера против часовой //lk_1 = 1 это защелка, чтобы сработало только один раз. } if(Bt_1==1&&lk_1==1)lk_1=0; // при возвращении контакта в исходное состояние, отключаем защелку. PORTB=Vhh; // регистр отправляем в порт } }