|
|
|
|
|
|
|
|
/* keybrd_shift_reg.ino |
|
|
/* keybrd_shift_reg.ino |
|
|
this works on Teensy LC 1*bb, active low and active high |
|
|
|
|
|
|
|
|
|
|
|
| Layout | **0** | **1** | |
|
|
|
|
|
|:------:|-------|-------| |
|
|
|
|
|
| **0** | a | b | |
|
|
|
|
|
| **1** | c | d | |
|
|
|
|
|
|
|
|
tested on Teensy LC and daisy chained 74HC165 shift registers |
|
|
|
|
|
add this line to RowScanner_SPIShiftRegisters::scan(): |
|
|
|
|
|
//clear unpowered pins (for testing bb) |
|
|
|
|
|
rowState &= 0b01010001000100010001000100010001; //also 31st key |
|
|
|
|
|
|
|
|
|
|
|
Layout |
|
|
|
|
|
| Left |**0**|**1**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|**7**|**8**| |
|
|
|
|
|
|:-----:|-----|-----| |:-----:|-----|-----|-----|-----|-----|-----|-----|-----|-----| |
|
|
|
|
|
| **0** | a | b | | **0** | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|
|
|
|
|
| **1** | c | d | | **1** | a | b | c | d | e | f | g | h | i | |
|
|
*/ |
|
|
*/ |
|
|
// ################## GLOBAL ################### |
|
|
// ################## GLOBAL ################### |
|
|
// ================= INCLUDES ================== |
|
|
// ================= INCLUDES ================== |
|
|
#include <Debug.h> |
|
|
#include <Debug.h> |
|
|
|
|
|
|
|
|
//IOE Ports |
|
|
|
|
|
#include "IOExpanderPort.h" |
|
|
|
|
|
#include <RowPort_MCP23018.h> |
|
|
|
|
|
#include <ColPort_MCP23018.h> |
|
|
|
|
|
|
|
|
|
|
|
//Codes |
|
|
//Codes |
|
|
#include <Code_Sc.h> |
|
|
#include <Code_Sc.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// =============== CONFIGURATION =============== |
|
|
// =============== CONFIGURATION =============== |
|
|
const unsigned int RowBase::DELAY_MICROSECONDS = 500; //500 |
|
|
const unsigned int RowBase::DELAY_MICROSECONDS = 500; //500 |
|
|
|
|
|
const uint8_t RowScanner_SPIShiftRegisters::SHIFT_LOAD = 10; |
|
|
|
|
|
|
|
|
//activeLow has diode cathode (band) on row |
|
|
//activeLow has diode cathode (band) on row |
|
|
//activeHigh has diode cathode (band) on col, and pull down resistors on cols |
|
|
//activeHigh has diode cathode (band) on col, and pull down resistors on cols |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ================= RIGHT ROWS ================ |
|
|
// ================= RIGHT ROWS ================ |
|
|
//typedef should be large in /home/wolfv/Documents/Arduino/keybrd_proj/keybrd/src/config_keybrd.h |
|
|
//typedef should be large in /home/wolfv/Documents/Arduino/keybrd_proj/keybrd/src/config_keybrd.h |
|
|
//Row_ShiftRegisters(STROBE_PIN, SHIFT_LOAD, ptrsKeys[], KEY_COUNT) |
|
|
|
|
|
|
|
|
//Row_ShiftRegisters(STROBE_PIN, ptrsKeys[], KEY_COUNT) |
|
|
//the s_z are place holders and should not print |
|
|
//the s_z are place holders and should not print |
|
|
/* |
|
|
|
|
|
//BYTE_COUNT 1, prints 0 1 |
|
|
|
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_a, &s_b, &s_c, &s_1, &s_d, &s_e, &s_f }; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//prints 0 1 |
|
|
|
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z }; |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
Row_ShiftRegisters row_R0(8, 10, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
|
|
|
|
|
|
//prints a b |
|
|
|
|
|
Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z }; |
|
|
|
|
|
const uint8_t KEY_R1_COUNT = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1); |
|
|
|
|
|
Row_ShiftRegisters row_R1(9, ptrsKeys_R1, KEY_R1_COUNT); |
|
|
/* |
|
|
/* |
|
|
//prints 0 1 2 |
|
|
//prints 0 1 2 |
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z, |
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z, |
|
|
&s_2, &s_z, &s_z, &s_z }; |
|
|
&s_2, &s_z, &s_z, &s_z }; |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
Row_ShiftRegisters row_R0(8, 10, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
|
|
|
Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
*/ |
|
|
*/ |
|
|
/* |
|
|
/* |
|
|
//prints 0 1 2 3 |
|
|
//prints 0 1 2 3 |
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z, |
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z, |
|
|
&s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z }; |
|
|
&s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z }; |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
Row_ShiftRegisters row_R0(8, 10, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
|
|
|
Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
*/ |
|
|
*/ |
|
|
/* |
|
|
/* |
|
|
//prints 0 1 2 3 4 5 |
|
|
//prints 0 1 2 3 4 5 |
|
|
|
|
|
|
|
|
&s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z, |
|
|
&s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z, |
|
|
&s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z }; |
|
|
&s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z }; |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
Row_ShiftRegisters row_R0(8, 10, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
|
|
|
Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
//prints 0 1 2 3 4 5 6 7 8 |
|
|
//prints 0 1 2 3 4 5 6 7 8 |
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z, |
|
|
Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z, |
|
|
&s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z, |
|
|
&s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z, |
|
|
&s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z, |
|
|
&s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z, |
|
|
&s_6, &s_z, &s_z, &s_z, &s_7, &s_z, &s_8 }; //31-key limit because endRow |
|
|
&s_6, &s_z, &s_z, &s_z, &s_7, &s_z, &s_8 }; //31-key limit because endRow |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); |
|
|
Row_ShiftRegisters row_R0(8, 10, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
|
|
|
Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT); |
|
|
|
|
|
|
|
|
//unresponsive |
|
|
|
|
|
|
|
|
//prints a b c d e f g h i |
|
|
Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z, |
|
|
Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z, |
|
|
&s_c, &s_z, &s_z, &s_z, &s_d, &s_z, &s_z, &s_z, |
|
|
&s_c, &s_z, &s_z, &s_z, &s_d, &s_z, &s_z, &s_z, |
|
|
&s_e, &s_z, &s_z, &s_z, &s_f, &s_z, &s_z, &s_z, |
|
|
&s_e, &s_z, &s_z, &s_z, &s_f, &s_z, &s_z, &s_z, |
|
|
&s_g, &s_z, &s_z, &s_z, &s_h, &s_z, &s_i }; //31-key limit because endRow |
|
|
&s_g, &s_z, &s_z, &s_z, &s_h, &s_z, &s_i }; //31-key limit because endRow |
|
|
const uint8_t KEY_R1_COUNT = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1); |
|
|
const uint8_t KEY_R1_COUNT = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1); |
|
|
Row_ShiftRegisters row_R1(9, 10, ptrsKeys_R1, KEY_R1_COUNT); |
|
|
|
|
|
|
|
|
Row_ShiftRegisters row_R1(9, ptrsKeys_R1, KEY_R1_COUNT); |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
const uint8_t LED_PIN = 16; //indicates wait |
|
|
const uint8_t LED_PIN = 16; //indicates wait |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pinMode (LED_PIN, OUTPUT); |
|
|
pinMode (LED_PIN, OUTPUT); |
|
|
Keyboard.begin(); |
|
|
Keyboard.begin(); |
|
|
SPI.begin(); |
|
|
SPI.begin(); |
|
|
|
|
|
|
|
|
wait(); |
|
|
|
|
|
row_R0.begin(); |
|
|
row_R0.begin(); |
|
|
row_R1.begin(); |
|
|
row_R1.begin(); |
|
|
|
|
|
|
|
|
|
|
|
wait(); |
|
|
Keyboard.print(F("keybrd_shift_reg.ino ")); |
|
|
Keyboard.print(F("keybrd_shift_reg.ino ")); |
|
|
debug.print_free_RAM(); |
|
|
debug.print_free_RAM(); |
|
|
} |
|
|
} |