Archived
1
0

add strobe to RowScanner_SPIShiftRegisters::scan()

This commit is contained in:
wolfv6 2016-06-30 22:46:28 -06:00
parent fd7da5aebb
commit 1eb09df387
3 changed files with 29 additions and 10 deletions

View File

@ -2,8 +2,12 @@
void RowScanner_SPIShiftRegisters::begin()
{
pinMode (SS, OUTPUT);
digitalWrite (SS, HIGH);
//configure row
pinMode(STROBE_PIN, OUTPUT);
//todo there is only one slave, is select needed?
pinMode (SHIFT_LOAD, OUTPUT);
digitalWrite (SHIFT_LOAD, HIGH);
}
/*
@ -11,12 +15,20 @@ Sets rowEnd and returns rowState.
*/
read_pins_t RowScanner_SPIShiftRegisters::scan(read_pins_mask_t& rowEnd)
{
//todo rowEnd, rowState, return int size depend on BYTE_COUNT, like in send(), set in config_keybrd?
read_pins_t rowState = 0;
digitalWrite(SS, LOW); //load parallel inputs to the register
digitalWrite(SS, HIGH); //shift the data toward a serial output
//strobe row on
digitalWrite(STROBE_PIN, LOW);
delayMicroseconds(3); //time to stablize voltage
//read all the column pins
digitalWrite(SHIFT_LOAD, LOW); //load parallel inputs to the register
digitalWrite(SHIFT_LOAD, HIGH); //shift the data toward a serial output
SPI.transfer(&rowState, BYTE_COUNT);
//strobe row off
digitalWrite(STROBE_PIN, HIGH);
rowEnd = 1 << KEY_COUNT;
return rowState;
}

View File

@ -14,12 +14,16 @@ The maximum keys per row is 31, because Arduino's largest type is 32 bits and ro
class RowScanner_SPIShiftRegisters : public RowScannerInterface
{
private:
const uint8_t SS; //pin on master that selects slave
//todo static const bool ACTIVE_HIGH; //logic level of strobe pin: 0=activeLow, 1=activeHigh
const uint8_t STROBE_PIN; //Arduino pin number connected to this row
const uint8_t SHIFT_LOAD; //controller's pin number that is connected to shift register's SHIFT_LOAD pin
const uint8_t BYTE_COUNT; //number of bytes to read from shift registers
const uint8_t KEY_COUNT; //number of keys in row
public:
RowScanner_SPIShiftRegisters(const uint8_t SS, uint8_t BYTE_COUNT, uint8_t KEY_COUNT)
: SS(SS), BYTE_COUNT(BYTE_COUNT), KEY_COUNT(KEY_COUNT) {}
RowScanner_SPIShiftRegisters(const uint8_t STROBE_PIN, const uint8_t SHIFT_LOAD,
uint8_t BYTE_COUNT, uint8_t KEY_COUNT)
: STROBE_PIN(STROBE_PIN), SHIFT_LOAD(SHIFT_LOAD),
BYTE_COUNT(BYTE_COUNT), KEY_COUNT(KEY_COUNT) {}
virtual read_pins_t scan(read_pins_mask_t& rowEnd);
void begin();
};

View File

@ -4,6 +4,7 @@
#include <RowBase.h>
#include <RowScanner_SPIShiftRegisters.h>
#include <Debouncer_4Samples.h>
//todo #include <Debouncer_Not.h>
/* Row_DH_IOE is a row connected to an Input/Output Expander.
@ -28,9 +29,11 @@ class Row_ShiftRegisters : public RowBase
private:
RowScanner_SPIShiftRegisters scanner;
Debouncer_4Samples debouncer;
//Debouncer_Not debouncer; //todo test
public:
Row_ShiftRegisters(const uint8_t SS, uint8_t BYTE_COUNT, Key *const ptrsKeys[], uint8_t KEY_COUNT)
: RowBase(ptrsKeys), scanner(SS, BYTE_COUNT, KEY_COUNT) { }
Row_ShiftRegisters(const uint8_t STROBE_PIN, const uint8_t SHIFT_LOAD, uint8_t BYTE_COUNT,
Key *const ptrsKeys[], uint8_t KEY_COUNT)
: RowBase(ptrsKeys), scanner(STROBE_PIN, SHIFT_LOAD, BYTE_COUNT, KEY_COUNT) { }
void begin();
read_pins_t scan(read_pins_mask_t& rowEnd);
read_pins_t debounce(const read_pins_t rowState, read_pins_t& debounced);