#define clockEnablePin 9 // CE
#define ploadPin 7 // PL
#define dataPin 2 // Q7 MISO
#define clockPin 4 // CP
#define pulseWidth 0 // Задержка сдвига
#define chipCount 1 // Количество микросхем
#if (chipCount == 1)
typedef uint8_t Type_t;
#elif (chipCount == 2)
typedef uint16_t Type_t;
#elif (chipCount == 3 || chipCount == 4)
typedef uint32_t Type_t;
#elif (chipCount > 4 && chipCount <= 8 )
typedef uint64_t Type_t;
#else
#error "Chips of microcircuits should not be less than 1 or more than 8"
#endif
#include <EncButton.h>
VirtEncButton enc1;
VirtEncButton enc2;
//Encoder enc3;
//Encoder enc4;
//Encoder enc5;
//Encoder enc6;
//Encoder enc7;
//Encoder enc8;
//Encoder enc9;
//Encoder enc10;
//Encoder enc11;
//Encoder enc12;
//Encoder enc13;
VirtButton btn1;
VirtButton btn2;
//bool Button1,Button2,Button3,Button4,Button5;
Type_t inputs;
Type_t last_inputs;
/* Карта битов в переменной inputs относительно подлюченных сдвиговых регистров 74HС165 (По своей логике и удобству)
* Bit 0 = U2(D0) Bit 8 = U3(D0) Bit 16 = U4(D0) Bit 24 = U5(D0) Bit 32 = U6(D0) Bit 40 = U7(D0)
* Bit 1 = U2(D1) Bit 9 = U3(D1) Bit 17 = U4(D1) Bit 25 = U5(D1) Bit 33 = U6(D1) Bit 41 = U7(D1)
* Bit 2 = U2(D2) Bit 10 = U3(D2) Bit 18 = U4(D2) Bit 26 = U5(D2) Bit 34 = U6(D2) Bit 42 = U7(D2)
* Bit 3 = U2(D3) Bit 11 = U3(D3) Bit 19 = U4(D3) Bit 27 = U5(D3) Bit 35 = U6(D3) Bit 43 = U7(D3)
* Bit 4 = U2(D4) Bit 12 = U3(D4) Bit 20 = U4(D4) Bit 28 = U5(D4) Bit 36 = U6(D4) Bit 44 = U7(D4)
* Bit 5 = U2(D5) Bit 13 = U3(D5) Bit 21 = U4(D5) Bit 29 = U5(D5) Bit 37 = U6(D5) Bit 45 = U7(D5)
* Bit 6 = U2(D6) Bit 14 = U3(D6) Bit 22 = U4(D6) Bit 30 = U5(D6) Bit 38 = U6(D6) Bit 46 = U7(D6)
* Bit 7 = U2(D7) Bit 15 = U3(D7) Bit 23 = U4(D7) Bit 31 = U5(D7) Bit 39 = U6(D7) Bit 47 = U7(D7)
*/
//btn1<bitRead(inputs, 6)>;
// btn2<bitRead(inputs, 6)>;
void setup() {
Serial.begin(115200);
pinMode(clockEnablePin, OUTPUT);
pinMode(ploadPin, OUTPUT);
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
// enc1.setEncType(EB_STEP2);
// enc2.setEncType(EB_STEP2);
//enc3.setEncType(EB_STEP2);
// enc4.setEncType(EB_STEP2);
// enc5.setEncType(EB_STEP2);
// enc6.setEncType(EB_STEP2);
// enc7.setEncType(EB_STEP2);
//enc8.setEncType(EB_STEP2);
//enc9.setType(TYPE2);
//enc10.setType(TYPE2);
//enc11.setType(TYPE2);
//enc12.setType(TYPE2);
//enc13.setType(TYPE2);
}
void loop() {
// Опрос регитров и запись в переменную inputs
inputs = Read_inputs();
// Обработка энкодеров
enc1.tick(bitRead(inputs, 2), bitRead(inputs, 1), bitRead(inputs, 0));
enc2.tick(bitRead(inputs, 5), bitRead(inputs, 4), bitRead(inputs, 3));
// enc3.tick(bitRead(inputs, 6),bitRead(inputs, 7),!bitRead(inputs, 8));
// enc4.tick(bitRead(inputs, 9),bitRead(inputs, 10),!bitRead(inputs, 11));
// enc5.tick(bitRead(inputs, 12),bitRead(inputs, 13),!bitRead(inputs, 14));
// enc6.tick(bitRead(inputs, 15),bitRead(inputs, 16),!bitRead(inputs, 17));
// enc7.tick(bitRead(inputs, 18),bitRead(inputs, 19),!bitRead(inputs, 20));
// enc8.tick(bitRead(inputs, 21),bitRead(inputs, 22),!bitRead(inputs, 23));
//enc9.tick(bitRead(inputs, 24),bitRead(inputs, 25),!bitRead(inputs, 26));
//enc10.tick(bitRead(inputs, 27),bitRead(inputs, 28),!bitRead(inputs, 29));
//enc11.tick(bitRead(inputs, 30),bitRead(inputs, 31),!bitRead(inputs, 32));
//enc12.tick(bitRead(inputs, 33),bitRead(inputs, 34),!bitRead(inputs, 35));
//enc13.tick(bitRead(inputs, 36),bitRead(inputs, 37),!bitRead(inputs, 38));
// Состояние кнопок
btn1.tick(bitRead(inputs, 6));
btn2.tick(bitRead(inputs, 7));
//Button1 = bitRead(inputs, 6);
// Button2 = bitRead(inputs, 7);
// Button3 = bitRead(inputs, 41);
//Button4 = bitRead(inputs, 42);
//Button5 = bitRead(inputs, 43);
// Вывести состояние битов от старшего до младшего бит в Serial port
/*if(inputs != last_inputs){
last_inputs = inputs;
for(int i = chipCount * 8 - 1; i> -1; i--){
bool Val = bitRead(inputs, i);
Serial.print(Val);
}
Serial.println();
}*/
if (enc1.right()) Serial.println("e1 Right holded"); // если было удержание + поворот
if (enc1.left()) Serial.println("e1 Left holded");
if (enc1.press()) Serial.println("e1 Click"); // отпускание кнопки (+ дебаунс)
if (enc2.right()) Serial.println("e2 Right holded"); // если было удержание + поворот
if (enc2.left()) Serial.println("e2 Left holded");
if (enc2.press()) Serial.println("e2 press"); // отпускание кнопки (+ дебаунс)
if (btn1.click()) Serial.println("Click b1");
if (btn1.press()) Serial.println ("Press btn1");
//if (btn1.hold()) Serial.println ("Hold btn1");
if (btn2.press()) Serial.println("press b2");
/*
// ------------------- примеры AlexGyver
if (enc1.isTurn()) { // если был совершён поворот (индикатор поворота в любую сторону)
// ваш код
}
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
if (enc1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс)
if (enc1.isClick()) Serial.println("Click"); // отпускание кнопки (+ дебаунс)
//if (enc1.isRelease()) Serial.println("Release"); // то же самое, что isClick
if (enc1.isHolded()) Serial.println("Holded"); // если была удержана и энк не поворачивался
//if (enc1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки
//-------------------------------------------
*/
}
Type_t Read_inputs(){
Type_t result = 0;
digitalWrite(clockEnablePin, HIGH);
digitalWrite(ploadPin, LOW);
delayMicroseconds(pulseWidth);
digitalWrite(ploadPin, HIGH);
digitalWrite(clockEnablePin, LOW);
for(int8_t a = 1; a < chipCount + 1; a++) { // (По своей логике и удобству)
for(int8_t b = a * 8 - 1; b > a * 8 - 8 - 1; b--){
result |= (((Type_t)digitalRead(dataPin)) << b);
digitalWrite(clockPin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(clockPin, LOW);
}
}
return result;
}