int switchAState, switchBState, switchCState, switchDState = LOW;
Only one of the 4 variables in this line is initialed to LOW. The rest get default values (which just happen to be the same value as LOW).
Some arrays would be real useful...
In readSwitch(), you pass in the previous state, read the new state, and do something if the current state is not the same as the previous state.
You need to do the same with controlChange. Don't read the values in loop(). Read them in controlChange(), instead. Compare the new reading with the old reading, and do something if the absolute value (abs()) of the difference is large enough.