12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #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 uint8_t strobePin,
- const uint8_t readPins[], const uint8_t readPinCount)
- : strobePin(strobePin), readPins(readPins), readPinCount(readPinCount)
- {
- uint8_t mode;
-
- //configure row
- pinMode(strobePin, OUTPUT);
-
- if (STROBE_ON == LOW) //if active low
- {
- mode = INPUT_PULLUP; //use internal pull-up resistor
- }
- else //if active high
- {
- mode = INPUT; //requires external pull-down resistor
- }
-
- //configure read pins
- for (uint8_t i=0; i < readPinCount; i++)
- {
- pinMode(readPins[i], mode);
- }
- }
-
- /* scan() strobes the row's strobePin and retuns state of readPins.
- Bitwise variables are 1 bit per key.
- */
- read_pins_t Scanner_uC::scan()
- {
- read_pins_t readState = 0; //bitwise, 1 means key is pressed, 0 means released
- read_pins_t readMask = 1; //bitwise, active bit is 1
-
- //strobe row on
- digitalWrite(strobePin, STROBE_ON);
- delayMicroseconds(3); //time to stablize voltage
-
- //read all the read pins
- for (uint8_t i=0; i < readPinCount; i++)
- {
- if ( digitalRead(readPins[i]) == STROBE_ON )
- {
- readState |= readMask;
- }
- readMask <<= 1;
- }
-
- //strobe row off
- digitalWrite(strobePin, STROBE_OFF);
-
- return readState;
- }
|