replace Port_*::write() with setHigh() and setLow(), and move strobe logic from Port_*::write() to Scanner_IOE::scan()
This commit is contained in:
parent
46988319a1
commit
e92716e263
@ -1,4 +1,4 @@
|
||||
/* keybrd_PCA9655E.ino
|
||||
/* PCA9655E_5_keybrd.ino
|
||||
keyboard layout is same as top-left keys of DH matrices:
|
||||
|
||||
Controller I/O expander
|
||||
@ -90,9 +90,9 @@ Row row_R1(scanner_R, 1<<1, ptrsKeys_R1, KEY_COUNT_R1);
|
||||
void setup()
|
||||
{
|
||||
delay(6000);
|
||||
Keyboard.print("keybrd_PCA9655E.ino ");
|
||||
Keyboard.print("PCA9655E_5_keybrd.ino ");
|
||||
|
||||
//Keyboard.begin(); not needed ?? it's in DH mainSketch.cpp and keybrd_4c_split_keyboard_with_IOE.ino
|
||||
//Keyboard.begin();todo not needed ?? it's in DH mainSketch.cpp and keybrd_4c_split_keyboard_with_IOE.ino
|
||||
scanner_R.begin();
|
||||
}
|
||||
|
@ -2,10 +2,10 @@
|
||||
|
||||
void LED_Port::on()
|
||||
{
|
||||
refPort.write(pin, HIGH);
|
||||
refPort.setHigh(pin);
|
||||
}
|
||||
|
||||
void LED_Port::off()
|
||||
{
|
||||
refPort.write(pin, LOW);
|
||||
refPort.setLow(pin);
|
||||
}
|
||||
|
@ -17,7 +17,8 @@ class PortInterface : public PortWriteInterface
|
||||
public:
|
||||
virtual void beginProtocol()=0; //SPI bus or I2C bus
|
||||
virtual void begin(const uint8_t strobeOn)=0; //configure GPIO pins
|
||||
virtual void write(const uint8_t pin, const bool pinLogicLevel)=0;
|
||||
virtual void setLow(const uint8_t pin)=0;
|
||||
virtual void setHigh(const uint8_t pin)=0;
|
||||
virtual uint8_t read()=0;
|
||||
};
|
||||
#endif
|
||||
|
@ -14,6 +14,7 @@ write() interface emulates Arduino's digitalWrite().
|
||||
class PortWriteInterface
|
||||
{
|
||||
public:
|
||||
virtual void write(const uint8_t pin, const bool pinLogicLevel)=0;
|
||||
virtual void setLow(const uint8_t pin)=0;
|
||||
virtual void setHigh(const uint8_t pin)=0;
|
||||
};
|
||||
#endif
|
||||
|
@ -39,21 +39,25 @@ void Port_MCP23018::begin(const uint8_t strobeOn)
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
/* write() sets pin output to logicLevel.
|
||||
pin is bit pattern, where pin being strobed is 1.
|
||||
logicLevel is HIGH or LOW.
|
||||
write() does not overwrite the other pins.
|
||||
/* setLow() sets pin output LOW.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_MCP23018::write(const uint8_t pin, const bool logicLevel)
|
||||
void Port_MCP23018::setLow(const uint8_t pin)
|
||||
{
|
||||
if (logicLevel == LOW)
|
||||
{
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
}
|
||||
else
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
}
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
|
||||
Wire.beginTransmission(deviceAddr);
|
||||
Wire.write(portNum + 0x12); //GPIO
|
||||
Wire.write(outputVal);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
/* setHigh() sets pin output HIGH.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_MCP23018::setHigh(const uint8_t pin)
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
|
||||
Wire.beginTransmission(deviceAddr);
|
||||
Wire.write(portNum + 0x12); //GPIO
|
||||
|
@ -42,7 +42,8 @@ class Port_MCP23018 : public PortInterface
|
||||
: deviceAddr(deviceAddr), portNum(portNum), outputVal(0), readPins(readPins) {}
|
||||
void beginProtocol();
|
||||
void begin(const uint8_t strobeOn);
|
||||
virtual void write(const uint8_t pin, const bool logicLevel);
|
||||
virtual void setLow(const uint8_t pin);
|
||||
virtual void setHigh(const uint8_t pin);
|
||||
virtual uint8_t read();
|
||||
};
|
||||
#endif
|
||||
|
@ -52,22 +52,21 @@ void Port_MCP23S17::begin(const uint8_t strobeOn)
|
||||
transfer(deviceAddr << 1, portNum + 0x0C, pullUp); //configure GPPU
|
||||
}
|
||||
|
||||
/* write() sets pin output to logicLevel (useful for strobePin, one LED pin, or multiple pins).
|
||||
/* setLow() sets pin output LOW.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
logicLevel is HIGH or LOW.
|
||||
write() does not overwrite the other pins.
|
||||
*/
|
||||
void Port_MCP23S17::write(const uint8_t pin, const bool logicLevel)
|
||||
void Port_MCP23S17::setLow(const uint8_t pin)
|
||||
{
|
||||
if (logicLevel == LOW)
|
||||
{
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
}
|
||||
else
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
}
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
transfer(deviceAddr << 1, portNum + 0x12, outputVal); //set GPIO port to outputVal
|
||||
}
|
||||
|
||||
/* setHigh() sets pin output HIGH.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_MCP23S17::setHigh(const uint8_t pin)
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
transfer(deviceAddr << 1, portNum + 0x12, outputVal); //set GPIO port to outputVal
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,8 @@ class Port_MCP23S17 : public PortInterface
|
||||
: deviceAddr(deviceAddr), portNum(portNum), outputVal(0), readPins(readPins) {}
|
||||
void beginProtocol();
|
||||
void begin(const uint8_t strobeOn);
|
||||
virtual void write(const uint8_t pin, const bool logicLevel);
|
||||
virtual void setLow(const uint8_t pin);
|
||||
virtual void setHigh(const uint8_t pin);
|
||||
virtual uint8_t read();
|
||||
};
|
||||
#endif
|
||||
|
@ -25,21 +25,25 @@ void Port_PCA9655E::begin(const uint8_t strobeOn)
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
/* write() sets pin output to logicLevel.
|
||||
pin is bit pattern, where pin being strobed is 1.
|
||||
logicLevel is HIGH or LOW.
|
||||
write() does not overwrite the other pins.
|
||||
/* setLow() sets pin output LOW.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_PCA9655E::write(const uint8_t pin, const bool logicLevel)
|
||||
void Port_PCA9655E::setLow(const uint8_t pin)
|
||||
{
|
||||
if (logicLevel == LOW)
|
||||
{
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
}
|
||||
else
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
}
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
|
||||
Wire.beginTransmission(deviceAddr);
|
||||
Wire.write(portNum + 2); //output Byte command
|
||||
Wire.write(outputVal);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
/* setHigh() sets pin output HIGH.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_PCA9655E::setHigh(const uint8_t pin)
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
|
||||
Wire.beginTransmission(deviceAddr);
|
||||
Wire.write(portNum + 2); //output Byte command
|
||||
|
@ -46,7 +46,8 @@ class Port_PCA9655E : public PortInterface
|
||||
: deviceAddr(deviceAddr), portNum(portNum), outputVal(0), readPins(readPins) {}
|
||||
void beginProtocol();
|
||||
void begin(const uint8_t strobeOn);
|
||||
virtual void write(const uint8_t pin, const bool logicLevel);
|
||||
virtual void setLow(const uint8_t pin);
|
||||
virtual void setHigh(const uint8_t pin);
|
||||
virtual uint8_t read();
|
||||
};
|
||||
#endif
|
||||
|
@ -14,16 +14,24 @@ void Port_ShiftRegs::begin()
|
||||
SPI.begin();
|
||||
}
|
||||
|
||||
void Port_ShiftRegs::write(const uint8_t pin, const bool logicLevel)
|
||||
/* setLow() sets pin output LOW.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_ShiftRegs::setLow(const uint8_t pin)
|
||||
{
|
||||
if (logicLevel == LOW)
|
||||
{
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
}
|
||||
else
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
}
|
||||
outputVal &= ~pin; //set pin output to low
|
||||
|
||||
digitalWrite(slaveSelect, LOW);
|
||||
SPI.transfer(outputVal);
|
||||
digitalWrite (slaveSelect, HIGH);
|
||||
}
|
||||
|
||||
/* setHigh() sets pin output HIGH.
|
||||
pin is bit pattern, where pin being set is 1.
|
||||
*/
|
||||
void Port_ShiftRegs::setHigh(const uint8_t pin)
|
||||
{
|
||||
outputVal |= pin; //set pin output to high
|
||||
|
||||
digitalWrite(slaveSelect, LOW);
|
||||
SPI.transfer(outputVal);
|
||||
|
@ -16,6 +16,7 @@ class Port_ShiftRegs : public PortWriteInterface
|
||||
public:
|
||||
Port_ShiftRegs(const uint8_t slaveSelect);
|
||||
void begin();
|
||||
void write(const uint8_t pin, const bool logicLevel);
|
||||
void setLow(const uint8_t pin);
|
||||
void setHigh(const uint8_t pin);
|
||||
};
|
||||
#endif
|
||||
|
@ -26,18 +26,29 @@ read_pins_t Scanner_IOE::scan(const uint8_t strobePin)
|
||||
uint8_t readState; //bits, 1 means key is pressed, 0 means released
|
||||
|
||||
//strobe on
|
||||
refPortWrite.write(strobePin, activeState);
|
||||
if (activeState == LOW) //if active low
|
||||
{
|
||||
refPortWrite.setLow(strobePin);
|
||||
}
|
||||
else //if active high
|
||||
{
|
||||
refPortWrite.setHigh(strobePin);
|
||||
}
|
||||
delayMicroseconds(3); //time to stabilize voltage
|
||||
|
||||
//read the port pins
|
||||
readState = refPortRead.read();
|
||||
|
||||
//strobe off
|
||||
refPortWrite.write(strobePin, !activeState);
|
||||
|
||||
if (activeState == LOW) //if active low
|
||||
{
|
||||
refPortWrite.setHigh(strobePin);
|
||||
readState = ~readState;
|
||||
}
|
||||
else //if active high
|
||||
{
|
||||
refPortWrite.setLow(strobePin);
|
||||
}
|
||||
|
||||
return readState;
|
||||
}
|
||||
|
Reference in New Issue
Block a user