Arşivlenmiş
1
0
Bu depo arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız.
keybrd/src/Scanner_ShiftRegsReadStrobed.cpp

64 satır
2.3 KiB
C++
Ham Normal Görünüm Geçmiş

#include "Scanner_ShiftRegsReadStrobed.h"
2016-09-25 04:27:06 +00:00
2016-11-06 09:41:56 +00:00
Scanner_ShiftRegsReadStrobed::Scanner_ShiftRegsReadStrobed(const bool activeState,
2016-09-25 04:27:06 +00:00
const uint8_t slaveSelect, const uint8_t byte_count)
2016-11-06 09:41:56 +00:00
: activeState(activeState),
2016-09-28 20:37:40 +00:00
slaveSelect(slaveSelect), byte_count(byte_count)
2016-09-25 04:27:06 +00:00
{
pinMode(slaveSelect, OUTPUT);
SPI.begin();
2016-09-25 04:27:06 +00:00
}
/* init() is called once for each row from Row constructor.
Configures controller to communicate with shift register matrix.
slaveSelect initialize not needed, only affects first scan, which is before USB is detected by OS.
digitalWrite(slaveSelect, HIGH);
2016-09-25 04:27:06 +00:00
*/
void Scanner_ShiftRegsReadStrobed::init(const uint8_t strobePin)
2016-09-25 04:27:06 +00:00
{
pinMode(strobePin, OUTPUT);
}
/* scan() strobes the row's strobePin and returns state of the shift register's input pins.
strobePin is Arduino pin number connected to this row.
Bit patterns are 1 bit per key.
Scanner_ShiftRegsReadStrobed class was tested on two sets of 74HC165 shift registers
and 74AHC1G126 tri-state buffer chips
74HC165 is not an SPI device.
The 74HC165 SH/LD polarity is the inverse of SPI slave-select convention.
Most SPI chips will high-Z their MISO pin when their slave select signal is high.
To use SPI-like protocol, 74HC*126 will high-Z the MISO pin when the slave select signal is low.
SPI.beginTransaction() and SPI.endTransaction() are not needed,
but would be needed if trackball uses interrupts.
2016-09-25 04:27:06 +00:00
*/
read_pins_t Scanner_ShiftRegsReadStrobed::scan(const uint8_t strobePin)
2016-09-25 04:27:06 +00:00
{
read_pins_t readState = 0; //bits, 1 means key is pressed, 0 means released
//strobe off here NOT release continuously
2016-11-06 09:41:56 +00:00
digitalWrite(strobePin, activeState); //strobe on
//SPI.beginTransaction( SPISettings(5000000, MSBFIRST, SPI_MODE0) ); //control SPI bus, 5 MHz
2016-11-05 20:07:56 +00:00
//photo-transistor at 3.3v needs 20 ms to stabilize
delayMicroseconds(20); //monitor trackball here
2016-09-25 04:27:06 +00:00
digitalWrite(slaveSelect, HIGH); //shift the data toward a serial output
digitalWrite(strobePin, !activeState); //strobe off to preserve IR LED life
2016-09-25 04:27:06 +00:00
SPI.transfer(&readState, byte_count);
//SPI.endTransaction();
digitalWrite(slaveSelect, LOW); //load parallel inputs to registers
2016-09-25 04:27:06 +00:00
//strobe off here still releases continuously
2016-09-25 04:27:06 +00:00
return readState;
}