Archived
1
0
This commit is contained in:
wolfv6 2016-07-02 05:18:45 -06:00
parent fb38aa95a9
commit c026df8aa4
2 changed files with 24 additions and 31 deletions

View File

@ -1,8 +1,11 @@
/* keybrd_shift_reg.ino /* keybrd_shift_reg.ino
tested on Teensy LC and daisy chained 74HC165 shift registers tested on Teensy LC and daisy chained 74HC165 shift registers
add this line to RowScanner_SPIShiftRegisters::scan():
//clear unpowered pins (for testing bb) the keyboard hardware for this sketch has 4 shift registers,
rowState &= 0b01010001000100010001000100010001; //also 31st key with every 4th input pins connected to a pull-down resistor and matrix column.
unused input pins are not grounded, so add this line to RowScanner_SPIShiftRegisters::scan():
//clear unpowered pins (for testing on breadboard)
rowState &= 0b01010001000100010001000100010001;
Layout Layout
| Left |**0**|**1**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|**7**|**8**| | Left |**0**|**1**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|**7**|**8**|
@ -23,14 +26,10 @@ Layout
#include <Row_ShiftRegisters.h> #include <Row_ShiftRegisters.h>
// =============== CONFIGURATION =============== // =============== CONFIGURATION ===============
const unsigned int RowBase::DELAY_MICROSECONDS = 500; //500 const unsigned int RowBase::DELAY_MICROSECONDS = 0; //500
const bool RowScanner_PinsArray::ACTIVE_HIGH = 0; //left matrix is active low
const uint8_t RowScanner_SPIShiftRegisters::SHIFT_LOAD = 10; const uint8_t RowScanner_SPIShiftRegisters::SHIFT_LOAD = 10;
//activeLow has diode cathode (band) on row
//activeHigh has diode cathode (band) on col, and pull down resistors on cols
//0=active low, 1= active high
const bool RowScanner_PinsArray::ACTIVE_HIGH = 0;
Debug debug; Debug debug;
// ================= LEFT PINS ================= // ================= LEFT PINS =================
@ -71,6 +70,7 @@ Row_uC row_L1(1, readPins, READ_PIN_COUNT, ptrsKeys_L1);
//Row_ShiftRegisters(STROBE_PIN, 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
/*
//prints 0 1 //prints 0 1
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 };
const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0); const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
@ -80,6 +80,7 @@ Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT);
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 };
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, ptrsKeys_R1, KEY_R1_COUNT); 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,
@ -103,8 +104,7 @@ const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
Row_ShiftRegisters row_R0(8, 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, microseconds_per_scan=87
//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,
@ -119,14 +119,13 @@ Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &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, 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
//sometimes OS takes 6 seconds to recongnize keyboard, LED blinks from the begining //sometimes OS takes 6 seconds to recongnize keyboard, LED blinks from the begining
void wait() void wait()
{ {
for (uint8_t count = 0; count < 7; count++) for (uint8_t count = 0; count < 6; count++)
{ {
//print count //print count
Keyboard.print(count); Keyboard.print(count);
@ -164,5 +163,5 @@ void loop()
//delay(100); //delay(100);
//Keyboard.println(""); //Keyboard.println("");
//debug.print_microseconds_per_scan(); debug.print_microseconds_per_scan();
} }

View File

@ -7,33 +7,27 @@
#include <RowPort.h> #include <RowPort.h>
#include <ColPort.h> #include <ColPort.h>
/* RowScanner_SPIShiftRegisters reads all shift registers in a daisy chain. /* RowScanner_SPIShiftRegisters reads shift registers.
shift registers 74HC165 Parallel-In-Serial-Out (PISO)
in sketch:
const uint8_t RowScanner_SPIShiftRegisters::SHIFT_LOAD = 10;
call begin() from setup()
Upto 4 shift registers can be in a daisy chained.
The maximum keys per row is 31, because Arduino's largest type is 32 bits and rowEnd consumes the last bit. The maximum keys per row is 31, because Arduino's largest type is 32 bits and rowEnd consumes the last bit.
//todo delete: Assumes only one row of shift registers is connected (no Slave Select).
For active low: The shift registers are active high:
10k pull-up resistor are connected to power
connect controller's MISO pin to shift register's /QH pin
in sketch, const bool RowScanner_PinsArray::ACTIVE_HIGH = 0;
For active high:
10k pull-down resistors are grounded 10k pull-down resistors are grounded
connect controller's MISO pin to shift register's QH pin connect controller's MISO pin to shift register's QH pin
in sketch, const bool RowScanner_PinsArray::ACTIVE_HIGH = 1;
shift registers 74HC165 Parallel-In-Serial-Out (PISO) are Daisy chained
The maximum keys per row is 31, because Arduino's largest type is 32 bits and rowEnd consumes the last bit.
call begin() from setup()
*/ */
class RowScanner_SPIShiftRegisters : public RowScannerInterface class RowScanner_SPIShiftRegisters : public RowScannerInterface
{ {
private: private:
//todo static const bool ACTIVE_HIGH; //logic level of strobe pin: 0=activeLow, 1=activeHigh
static const uint8_t SHIFT_LOAD; //controller's pin number that is connected to shift register's SHIFT_LOAD pin static const uint8_t SHIFT_LOAD; //controller's pin number that is connected to shift register's SHIFT_LOAD pin
const uint8_t STROBE_PIN; //Arduino pin number connected to this row const uint8_t STROBE_PIN; //Arduino pin number connected to this row
const read_pins_mask_t ROW_END; //number of keys in row + 1 const read_pins_mask_t ROW_END; //bitwise, 1 bit marks positioned after last key of row
const uint8_t BYTE_COUNT; //number of bytes to read from shift registers const uint8_t BYTE_COUNT; //number of bytes to read from shift registers
public: public:
RowScanner_SPIShiftRegisters(const uint8_t STROBE_PIN, uint8_t KEY_COUNT); RowScanner_SPIShiftRegisters(const uint8_t STROBE_PIN, uint8_t KEY_COUNT);