123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #include "Scanner_uC.h"
-
- /* Scanner_uC functions call Arduino's Digital Pins functions
- https://www.arduino.cc/en/Tutorial/DigitalPins
- https://www.arduino.cc/en/Reference/PinMode
- https://www.arduino.cc/en/Reference/DigitalWrite
- https://www.arduino.cc/en/Reference/DigitalRead
- https://www.arduino.cc/en/Reference/Constants > Digital Pins modes: INPUT, INPUT_PULLUP, and OUTPUT
- */
-
- /* constructor
- */
- Scanner_uC::Scanner_uC(const bool activeState, const uint8_t readPins[], const uint8_t readPinCount)
- : activeState(activeState), readPins(readPins), readPinCount(readPinCount)
- {
- uint8_t mode;
-
- //configure read pins
- if (activeState == LOW) //if active low
- {
- mode = INPUT_PULLUP; //use internal pull-up resistor
- }
- else //if active high
- {
- mode = INPUT; //requires external pull-down resistor
- }
-
- for (uint8_t i=0; i < readPinCount; i++)
- {
- pinMode(readPins[i], mode);
- }
- }
-
- /* init() is called once for each row from Row constructor.
- Configure row-strobe pin to output.
- */
- void Scanner_uC::init(const uint8_t strobePin)
- {
- pinMode(strobePin, OUTPUT);
- }
-
- /* scan() is called on every iteration of sketch loop().
- scan() strobes the row's strobePin and retuns state of readPins.
- Bit patterns are 1 bit per key.
- */
- read_pins_t Scanner_uC::scan(const uint8_t strobePin)
- {
- read_pins_t readState = 0; //bits, 1 means key is pressed, 0 means released
- read_pins_t readMask = 1; //bits, active bit is 1
-
- //strobe on
- digitalWrite(strobePin, activeState);
- delayMicroseconds(3); //time to stablize voltage
-
- //read all the read pins
- for (uint8_t i=0; i < readPinCount; i++)
- {
- if ( digitalRead(readPins[i]) == activeState )
- {
- readState |= readMask;
- }
- readMask <<= 1;
- }
-
- //strobe off
- digitalWrite(strobePin, !activeState);
-
- return readState;
- }
|