|
@@ -1,10 +1,10 @@
|
|
|
# Keypad Scanning
|
|
|
|
|
|
-There's a dozen ways to connect a keyboard to a microcontroller, and this paper attempts to enumerate many of them. [test link](#one-per-pin)
|
|
|
-There are similar articles on the internet [[see below](#ext_ref)],
|
|
|
-but this paper introduces some new techniques: [row-grounded](#3x4-plus-ground-[new-design]),
|
|
|
-[row-grounded-with-diodes](#3x4diodes),
|
|
|
-[row-grounded-with-4-diodes](#3x4double_diodes)
|
|
|
+There's a dozen ways to connect a keyboard to a microcontroller, and this paper attempts to enumerate many of them.
|
|
|
+There are similar articles on the internet [[see below](#external-references)],
|
|
|
+but this paper introduces some new techniques: [row-grounded](#3x4-plus-ground-new-design),
|
|
|
+[row-grounded-with-diodes](#3x4-plus-ground-and-2-diodes-new-design),
|
|
|
+[row-grounded-with-4-diodes](#3x4-plus-ground-and-4-diodes-new-design)
|
|
|
|
|
|
Some articles focus on a full-function, unambiguous keyboard,
|
|
|
where multiple key-presses can be detected. Something
|
|
@@ -23,7 +23,7 @@ In this document, *n* refers to the number of keys that are in the keyboard. The
|
|
|
that is being pressed during an explanation.
|
|
|
|
|
|
|
|
|
-## <a name="one_per_pin" /> One per Pin
|
|
|
+## One per Pin
|
|
|
|
|
|
The simplest way to connect keys to a microcontroller is one key to one pin.
|
|
|
Connect the other side of the key to ground.
|
|
@@ -40,7 +40,7 @@ This configuration has a few advantages:
|
|
|
- there is no keyboard scan....which helps keep scan-noise out of the power supply; helpful in an audio environment
|
|
|
- can easily be set to wake-on-interrupt, which means that you can power down between keystrokes
|
|
|
|
|
|
-See [KeyBounce](#bounce) below.
|
|
|
+See [KeyBounce](#keyboard-bounce) below.
|
|
|
|
|
|
Of course, this solution does not apply to a keyboard which has *rows* and *columns*.
|
|
|
|
|
@@ -56,7 +56,6 @@ microcontrollers have an A/D converter, and that can be used to determine which
|
|
|
|
|
|
A naive approach would be to simply use equal-valued resistors, and then each tap would be *k*/(*n*+1) of the supply voltage.
|
|
|
|
|
|
- <a name="3x4chain" />
|
|
|
### 3x4 Chain
|
|
|
|
|
|
Sometimes a keyboard will be pre-wired as a grid, so you don't have access to the individual keys. You can still use
|
|
@@ -109,7 +108,7 @@ See also [this article](https://github.com/sgmne/AnalogKeypad)
|
|
|
|
|
|
## Scanning
|
|
|
|
|
|
-### 3x4 Scanning <a name="3x4scan" />
|
|
|
+### 3x4 Scanning
|
|
|
|
|
|
The simplest connection of a 3x4 keyboard is to simply use 7 GPIO pins, 4 for the rows, and 3 for the columns.
|
|
|
Enable input & pullups on the columns and rows. At scan time, assert each row pin, one at a time, as a low, and measure
|
|
@@ -136,10 +135,10 @@ This scheme can be configured for interrupt triggering
|
|
|
columns are set to input+pullup+interrupt.
|
|
|
Any keypress will then pull at least one column line low. Once the
|
|
|
interrupt is triggered, change to the logic described above, scan the keyboard
|
|
|
-[over the [debounce period](#bounce) and then restore they keyboard
|
|
|
+[over the [debounce period](#keyboard-bounce) and then restore they keyboard
|
|
|
to the "ready-for-interrupt" configuration.
|
|
|
|
|
|
-### 3x4 plus Ground [new design] <a name="3x4gnd" />
|
|
|
+### 3x4 plus Ground [new design]
|
|
|
|
|
|
If you are really tight on pins, you can ground one of the rows and still get a functioning keyboard.
|
|
|
|
|
@@ -161,7 +160,6 @@ The resulting 4 groups of 3 bits indicate the state of the keyboard; 1=open, 0=k
|
|
|
|
|
|
Again, the same logic will allow you to manage a 4x4 keyboard with 7 GPIO pins.
|
|
|
|
|
|
-<a name="3x4diodes" />
|
|
|
### 3x4 plus Ground and 2 Diodes [new design]
|
|
|
|
|
|
Again, we can scrape off one more GPIO if we can add a pair of diodes to the row pins.
|
|
@@ -215,7 +213,6 @@ look for the symbol **FIVE_PIN**.
|
|
|
This configuration is also interrupt-capable, by setting the row drivers to output-low, and the columns as
|
|
|
input+pullup+interrupt.
|
|
|
|
|
|
-<a name="3x4double_diodes" />
|
|
|
### 3x4 plus Ground and 4 Diodes [new design]
|
|
|
|
|
|
As an extreme, you can decode a 3x4 keypad with only 4 GPIO pins,
|
|
@@ -268,7 +265,7 @@ can happen.
|
|
|
look for the symbol **FOUR_PIN**. Here is a working prototype. ![working](keypad.jpg)
|
|
|
|
|
|
|
|
|
-### Keyboard Debounce <a name="bounce" />
|
|
|
+### Keyboard Debounce
|
|
|
|
|
|
When a key is pressed, there is a short time during closure when the
|
|
|
physical elements almost-touch, and the
|
|
@@ -301,8 +298,12 @@ One involves using an SPI output and a shift register
|
|
|
<https://hackaday.com/2015/04/15/simple-keypad-scanning-with-spi-and-some-hardware/>
|
|
|
This design requires an external chip ($0.10), 8 diodes and 4 resistors.
|
|
|
|
|
|
+### Interrupts
|
|
|
|
|
|
-### Reading DIP switches <a name="dip_switches" />
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### Reading DIP switches
|
|
|
|
|
|
In some situations, it's helpful to read an array of DIP switches,
|
|
|
perhaps to read a configuration at power-on. In this case,
|
|
@@ -325,7 +326,7 @@ and it's impossible to determine if the "5" key is pressed or not. Diodes are
|
|
|
required at each junction to disambiguate.
|
|
|
|
|
|
|
|
|
-### External keyboard processor <a name="external_hardware" />
|
|
|
+### External keyboard processor
|
|
|
|
|
|
With the current cost of processors, consider adding an external coprocessor to your project.
|
|
|
|
|
@@ -364,7 +365,7 @@ It's U$0.11, 16k flash, 2k ram, 6gpio, sop8.
|
|
|
| scan with diodes | 6 for 4x4, 5 for 3x4 | 1 | 2 diodes |
|
|
|
| scan with 4 diodes | 5 for 4x4, 4 for 3x4 | 1 | 4 diodes |
|
|
|
|
|
|
-### External References <a name="ext_ref" />
|
|
|
+### External References
|
|
|
|
|
|
An excellent overview of keyboard scanning directly from a microcontroller.
|
|
|
<https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ApplicationNotes/ApplicationNotes/00003407A.pdf>
|