/macro test.ino
// Requires the Encoder library
#include <Encoder.h>
#include <Keyboard.h>
// Keyboard module pins - rows 1 and 2, columns 1 and 2
#define R1 2
#define R2 3
#define C1 4
#define C2 5
// Encoder pins - A & B are the encoder itself, D is the active-low pushbutton
#define A 9
#define B 8
#define D 7
// 7-segment pins - DO is data out, SH is shift, LAT is latch
#define DO 14
#define SH 15
#define LAT 16
uint16_t c;
Encoder enc(B, A);
void encoder_setup() {
// All inputs have external pull-ups on the module, so no pull-up configuration is required here
pinMode(A, INPUT);
pinMode(B, INPUT);
pinMode(D, INPUT);
}
void encoder_update() {
if (digitalRead(D) == LOW) {
enc.write(0);
}
c = enc.read() >> 1;
}
// bit order is the same as segment order, msb -> lsb
const uint8_t charmap[] = {
//ABCDEFG.
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
0b11101110, // A
0b00111110, // b
0b10011100, // C
0b01111010, // d
0b10011110, // E
0b10001110, // F
};
void toggle(int pin) {
digitalWrite(pin, HIGH);
digitalWrite(pin, LOW);
}
void shift_byte(uint8_t b) {
for (char i = 0; i < 8; i++) {
digitalWrite(DO, (b >> i) & 1);
toggle(SH);
}
}
void ss_setup() {
pinMode(DO, OUTPUT);
pinMode(SH, OUTPUT);
pinMode(LAT, OUTPUT);
shift_byte(0x00);
shift_byte(0x00);
toggle(LAT);
}
void ss_update() {
uint8_t d = (c & 0xFF); //(c >> 8) & 0xFF;
shift_byte(charmap[d & 0xF]);
shift_byte(charmap[(d & 0xF0) >> 4]);
toggle(LAT);
}
uint8_t keystate;
void key_setup() {
keystate = 0;
pinMode(R1, INPUT);
digitalWrite(R1, LOW);
pinMode(R2, INPUT);
digitalWrite(R2, LOW);
// The matrix on the pad module does _not_ have external pull-ups
pinMode(C1, INPUT_PULLUP);
pinMode(C2, INPUT_PULLUP);
Keyboard.begin();
}
char which_key(uint8_t *n) {
char c = 0;
if (*n & 1) {
c = 'a';
*n &= ~(uint8_t)1;
} else if (*n & 2) {
c = 'b';
*n &= ~(uint8_t)2;
} else if (*n & 4) {
c = 'm';
*n &= ~(uint8_t)4;
} else if (*n & 8) {
c = ' ';
*n &= ~(uint8_t)8;
} else {
*n = 0;
}
return c;
}
void key_update() {
uint8_t new_keystate = 0;
pinMode(R1, OUTPUT);
new_keystate = (digitalRead(C2) << 1) | digitalRead(C1);
pinMode(R1, INPUT);
pinMode(R2, OUTPUT);
new_keystate |= (digitalRead(C2) << 3) | (digitalRead(C1) << 2);
pinMode(R2, INPUT);
uint8_t pressed = ~new_keystate & keystate;
uint8_t released = new_keystate & ~keystate;
if (pressed) {
while (char k = which_key(&pressed)) {
Keyboard.press(k);
}
} else if (released) {
while (char k = which_key(&released)) {
Keyboard.release(k);
}
}
keystate = new_keystate;
}
void setup() {
c = 0;
key_setup();
ss_setup();
Serial.begin(115200);
}
void loop() {
key_update();
encoder_update();
ss_update();
delay(1);
}