/*
J Paewai 2024
Demo program 10 bit button reader and 8 bit LED using Serial shift registers for inputs and ouputs
*/
//Outputs 74595 MCU connections
#define clock 4
#define data 5
#define latch 3
//Inputs 74165 MCU Connections
#define clk_7 6
#define sh_cd_1 8
#define data_9 9
#define DATA_WIDTH 16
int pinValues = 0; // Store input values of the 2x 74165's
byte outputValue = 0; // Current Status of the outputs
int lastPinValues=0; // Remember Last key press for Debounce purposes
void data_out(byte dataOut) { // Sent out a value to the 74595 Serial Resister
shiftOut(data, clock, LSBFIRST, dataOut );
shiftOut(data, clock, LSBFIRST, dataOut );
digitalWrite(latch, LOW);
delayMicroseconds(1);
digitalWrite(latch, HIGH);
delayMicroseconds(1);
digitalWrite(latch, LOW);
}
int read_shift_register() // Read in the shift register of the input keys
{
byte bitVal;
int bytesVal = 0;
digitalWrite(sh_cd_1, LOW);
delayMicroseconds(5);
digitalWrite(sh_cd_1, HIGH);
for (int i = 0; i < DATA_WIDTH; i++)
{
bitVal = digitalRead(data_9);
bytesVal |= (bitVal << ((DATA_WIDTH - 1) - i));
digitalWrite(clk_7, HIGH);
delayMicroseconds(5);
digitalWrite(clk_7, LOW);
}
return (bytesVal);
}
byte whichKeyPressed(int rawValue) { // returns a number between 1-10 of the key pressed (only one at a time)
byte retVal = 0;
switch (rawValue) {
case 512: retVal = 10; data_out(0); break; // Toggle bit 1
case 256: retVal = 9; data_out(255); break; // Toggle bit 1
case 128: retVal = 8; data_out(rawValue); break; // Toggle bit 8
case 64: retVal = 7; data_out(rawValue); break; // Toggle bit 7
case 32: retVal = 6; data_out(rawValue); break; // Toggle bit 6
case 16: retVal = 5; data_out(rawValue); break; // Toggle bit 5
case 8: retVal = 4; data_out(rawValue); break; // Toggle bit 4
case 4: retVal = 3; data_out(rawValue); break; // Toggle bit 3
case 2: retVal = 2; data_out(rawValue); break; // Toggle bit 2
case 1: retVal = 1; data_out(rawValue); break; // Toggle bit 1
}
return retVal;
}
void setup() {
//outputs 74595 MCU setups
pinMode(data,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(latch,OUTPUT);
//inputs 74165 x2 MCU setups
pinMode(clk_7,OUTPUT);
pinMode(sh_cd_1,OUTPUT);
pinMode(data_9,INPUT);
outputValue = 0; // Value to contains the output status since we cannot read it
data_out(0); // Ensure All outputs are off
}
void loop (){
pinValues = read_shift_register(); // check for key press
if(lastPinValues != pinValues && pinValues!=0) { // Is register empty or the same key still held down?
byte KP = whichKeyPressed(pinValues);
outputValue = pinValues;
lastPinValues = pinValues;
delay(10); // Small debounce delay
}
}