Эта библиотека позволяет подключить энкодер KY-040. Дополнительную информацию можно найти в моём блоге itworkclub.ru

Dependents:   STM32_Encoder TFT_Touch_Menu_Encoder Encoder_rotativo TFT_Touch_Menu_Touch

Committer:
zelmic
Date:
Wed Jun 20 15:21:16 2018 +0000
Revision:
0:e1a3b380b0d6
ver. 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zelmic 0:e1a3b380b0d6 1 /*
zelmic 0:e1a3b380b0d6 2 * Автор - Железняков Андрей
zelmic 0:e1a3b380b0d6 3 * Сайт - itworkclub.ru
zelmic 0:e1a3b380b0d6 4 * Данный класс описывает энкодер с кнопкой KY-040
zelmic 0:e1a3b380b0d6 5 * Обработка вращения и нажатий происходит с помощью прерываний.
zelmic 0:e1a3b380b0d6 6 * При вращении энкодера меняется состояние переменной State
zelmic 0:e1a3b380b0d6 7 * в ту или иную сторону. Значения переменной State ограничены заданным
zelmic 0:e1a3b380b0d6 8 * диапазоном, например, от 0 до 100 или 0т 300 до 500. Диапазон задается
zelmic 0:e1a3b380b0d6 9 * функцией setRange. По умолчанию диапазон от 0 до 100.
zelmic 0:e1a3b380b0d6 10 * Узнать текущее значение энкодера можно с помощью функции getState();
zelmic 0:e1a3b380b0d6 11 * Нажата ли кнопка с помощью функции getButtonState();
zelmic 0:e1a3b380b0d6 12 * К энкодеру припаяны два дополнительных конденсатора по 1000пФ для устранения
zelmic 0:e1a3b380b0d6 13 * дребезга: один между GND и CLK, второй между GND и DT. Если этих конденсаторов
zelmic 0:e1a3b380b0d6 14 * нет, то необходимо раскомментировать задержку в функции encode. Так же
zelmic 0:e1a3b380b0d6 15 * необохдимо проверить запаян ли подтягивающий резистор 10кОм на кнопку SW
zelmic 0:e1a3b380b0d6 16 * Его необходимо припаять.
zelmic 0:e1a3b380b0d6 17 */
zelmic 0:e1a3b380b0d6 18 #include "Encoder.h"
zelmic 0:e1a3b380b0d6 19
zelmic 0:e1a3b380b0d6 20 EncoderAli::EncoderAli(PinName DT,PinName CLK,PinName SW): DT_(DT), CLK1_(CLK), SW_(SW){
zelmic 0:e1a3b380b0d6 21
zelmic 0:e1a3b380b0d6 22 // инициализация начального состояния энкодера
zelmic 0:e1a3b380b0d6 23 work = false;
zelmic 0:e1a3b380b0d6 24 minValue_ =0;
zelmic 0:e1a3b380b0d6 25 maxValue_ = 100;
zelmic 0:e1a3b380b0d6 26 button = false;
zelmic 0:e1a3b380b0d6 27 State = minValue_;
zelmic 0:e1a3b380b0d6 28
zelmic 0:e1a3b380b0d6 29 // подключение прерываний для вращения, нажатия и отжатия
zelmic 0:e1a3b380b0d6 30 CLK1_.rise(callback(this,&EncoderAli::encode));
zelmic 0:e1a3b380b0d6 31 SW_.fall(callback(this,&EncoderAli::buttonPress));
zelmic 0:e1a3b380b0d6 32 SW_.rise(callback(this,&EncoderAli::buttonUp));
zelmic 0:e1a3b380b0d6 33
zelmic 0:e1a3b380b0d6 34 }
zelmic 0:e1a3b380b0d6 35
zelmic 0:e1a3b380b0d6 36
zelmic 0:e1a3b380b0d6 37 void EncoderAli::encode(void) // обработчик вращения
zelmic 0:e1a3b380b0d6 38 {
zelmic 0:e1a3b380b0d6 39 if (work) return; // если идет обработка предыдущего прерывания то ничего
zelmic 0:e1a3b380b0d6 40 // не делаем
zelmic 0:e1a3b380b0d6 41 work = true; // поднимаем флаг работы прерывания, тем самым запрещая
zelmic 0:e1a3b380b0d6 42 // выполнения других таких же прерываний
zelmic 0:e1a3b380b0d6 43 int A = DT_; // считываем значение пина DT
zelmic 0:e1a3b380b0d6 44 //wait_us(100);
zelmic 0:e1a3b380b0d6 45 if(A==0 && State < maxValue_) //если DT 0, то энкодер крутится вправо
zelmic 0:e1a3b380b0d6 46 State++;// увеличиваем значение состояния энкодера
zelmic 0:e1a3b380b0d6 47 if (A==1 && State > minValue_) //если DT = 1, то энкодер крутится влево
zelmic 0:e1a3b380b0d6 48 State--; // уменьшаем значение энкодера
zelmic 0:e1a3b380b0d6 49 work = false; // освобождаем флаг работы прерывания
zelmic 0:e1a3b380b0d6 50
zelmic 0:e1a3b380b0d6 51
zelmic 0:e1a3b380b0d6 52 }
zelmic 0:e1a3b380b0d6 53 int EncoderAli::getState()
zelmic 0:e1a3b380b0d6 54 {
zelmic 0:e1a3b380b0d6 55 return State;
zelmic 0:e1a3b380b0d6 56 }
zelmic 0:e1a3b380b0d6 57 void EncoderAli::setRange(int minValue,int maxValue)
zelmic 0:e1a3b380b0d6 58 {
zelmic 0:e1a3b380b0d6 59 minValue_=minValue;
zelmic 0:e1a3b380b0d6 60 maxValue_=maxValue;
zelmic 0:e1a3b380b0d6 61 State = minValue_;
zelmic 0:e1a3b380b0d6 62 }
zelmic 0:e1a3b380b0d6 63 void EncoderAli::buttonPress(void)
zelmic 0:e1a3b380b0d6 64 {
zelmic 0:e1a3b380b0d6 65 button = true;
zelmic 0:e1a3b380b0d6 66 }
zelmic 0:e1a3b380b0d6 67 void EncoderAli::buttonUp(void)
zelmic 0:e1a3b380b0d6 68 {
zelmic 0:e1a3b380b0d6 69 button = false;
zelmic 0:e1a3b380b0d6 70 }
zelmic 0:e1a3b380b0d6 71 bool EncoderAli::getButtonState()
zelmic 0:e1a3b380b0d6 72 {
zelmic 0:e1a3b380b0d6 73 return button;
zelmic 0:e1a3b380b0d6 74 }
zelmic 0:e1a3b380b0d6 75