1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #include "RowScanner_SPIShiftRegisters.h"
-
- //constructor
- RowScanner_SPIShiftRegisters::RowScanner_SPIShiftRegisters(const uint8_t STROBE_PIN, uint8_t KEY_COUNT)
- : STROBE_PIN(STROBE_PIN), ROW_END(1 << KEY_COUNT), BYTE_COUNT(ceil (float(KEY_COUNT)/8))
- {
- //configure controller to communicate with shift register matrix
- pinMode(STROBE_PIN, OUTPUT);
- pinMode(SHIFT_LOAD, OUTPUT);
- }
-
- void RowScanner_SPIShiftRegisters::begin()
- {
- //initialize shift register's shift/load pin
- digitalWrite(SHIFT_LOAD, HIGH);
- }
-
- /*
- Sets rowEnd and returns rowState.
- */
- read_pins_t RowScanner_SPIShiftRegisters::scan(read_pins_mask_t& rowEnd)
- {
- read_pins_t rowState = 0;
-
- //strobe row on
- digitalWrite(STROBE_PIN, HIGH);
- 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, LOW);
-
- rowEnd = ROW_END;
-
- //for testing breadboard, clear unpowered pins
- rowState &= 0b01010001000100010001000100010001; //todo
-
- return rowState;
- }
|