We bought a small
safe, not to store gold bullion in but to store my wife's medicines in - having
a curious three year old and needing access to the medicines required it.
I could not believe it when I entered in an access code that virtually every
time I hit a key - the key bounced i.e. there were multiple key presses for
every single key press unless I hit the keys very precisely and quickly - They
were obviously in a hurry when they designed it.
When this happened the safe sat there bleeping for one minute - very
This is a example of why switch debounce is important and the designer of the
electronics obviously had no idea about it. I even opened it up - it had an
atmel microcontroller inside so they could have easily got rid of the switch
bounce problem. One day I'll have to change it (using a PIC Micro of course)
we just use the key now!
debounce : What is it ?
When a switch is
pressed it does not fully close the first time you press it because the metal
contacts bounce off each other!
Feeding the signal into a logic gate or a microcontroller sends multiple key
press signals which is not what you want so you have to ignore the bouncing
signal - this is known as debouncing the switch.
The basic switch debounce microcontroller solution is:
1st button press (or the 1st of many bounces!).
Wait for a
switch again to see if it is still presed.
Note: Because each switch is constructed
differently the characteristics of the key bounce will be different so you need
to characterize different switches and assess how long the bounce lasts 400us,
800us or longer? (or just use a long delay).
The switch debounce solution
The solution in all
cases is time - you have to wait until
the bouncing has stopped. You either use a debouncing circuit or use software
to wait for a period after the bouncing has stopped.
The most common discrete switch debouncing circuit is a resistor and capacitor
pair which slows the input signal feeding into a logic gate (charging the
capacitor when the switch is closed) - in this case the gate must have
hysteresis so that it reacts correctly otherwise it could oscillate anyway.
When using a microcontroller the best way is to use software to debounce the
switch as the microcontroller can easily wait a set time period before deciding
that the switch value is valid. You can also change the time period and do
not need extra components.
Add the switch
and pull up resistor and then program the chip using the the hex file.
The program simply
turns on the LED when the button is pressed but the button is debounced.
Source code files :
To get the file
software project files and c source code click here.
Note: Initially at power up the led is flashed on
and off 6 times to show the microcontroller is active.
Input button (switch)
Note how init_ports()
sets up the port direction for bit five of the port as an input (setting bit 5
high) using the TRISIO register all the others remain as outputs.
The code that does
the debouncing is shown below get_key(). It returns zero for failure and 1 if
the key was ok.
First of all it simply tests the key state to make sure that the key is pressed
(low input in this circuit) and if not it returns 0.
Then it waits for 1 millisecond to let the bouncing stop to (this time delay
can be changed depending on the characteristics of the switch i.e. to get the
correct switch debounce action).
Then the key is checked again - if the key state has
changed then it returns 0. If it has not changed then the key has been held
in a low state and is in the same state as first test - it is a valid key press
so the routine returns 1.
The following code is part of switch debounce source code:
TRISIO = (1<<5); //
set as output except bit 5 GP5=i/p }
// Is GP5 low - no so
exit if (GPIO
& (1<<5)) return 0; // no key yet
delay_ms(1); // wait for
key to settle
// Is GP5 high ? yes so
exit = false key. if ( (GPIO
& (1<<5))>0 ) return 0; // was a false key so restart
return 1; // key ok so return valid }
Basically for the switch debounce procedure you test a key, wait a
while and re-test - if the result is the same then it was a valid