Rene Greiner
/
IRQKeypad1
first version of a keypad (4x3) implementation working with interrupts instead of polling.
Revision 0:510bbea7c78e, committed 2011-12-11
- Comitter:
- Renegr
- Date:
- Sun Dec 11 08:50:58 2011 +0000
- Commit message:
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 510bbea7c78e main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Dec 11 08:50:58 2011 +0000 @@ -0,0 +1,101 @@ +#include "mbed.h" + +BusInOut colBus( p26, p25, p24); +const PinName rowPins[] = { p30, p29, p28, p27 }; + +volatile bool irqFinished = false; + +inline char toChar( unsigned char r, unsigned char c) { + static const char keytable[] = { '1', '2', '3', 'A', + '4', '5', '6', 'B', + '7', '8', '9', 'C', + '*', '0', '#', 'D' + }; + return keytable[r*4+c]; +} + +inline char toBinary( unsigned char r, unsigned char c) { + static const char keytable[] = { 0x1, 0x2, 0x3, 0xC, + 0x4, 0x5, 0x6, 0xD, + 0x7, 0x8, 0x9, 0xE, + 0xA, 0x0, 0xB, 0xF + }; + return keytable[r*4+c]; +} + +inline void start() { + colBus.output(); + colBus = 0xF; +} + +// simple log2, only 4bits needed +inline unsigned char _lg2( unsigned char c) { + return c&1 ? 0 : c&2 ? 1 : c&4 ? 2 : 3; +} + +inline char pin2Row(PinName pin) { + return rowPins[0] == pin ? 0 : rowPins[1] == pin ? 1 : rowPins[2] == pin ? 2 : 3; +} + +BusOut code(LED4, LED3, LED2, LED1); //show binary code of key + +void checkColumn(PinName pinPressed) { + { //debounce + DigitalIn in(pinPressed); + for (char c=0; c<100; ++c) { + if ( !in.read()) { + irqFinished=true; + return; // key not long enough pressed + } + wait_us(100); + } + } + // check column + DigitalOut p(pinPressed); + p = 0x1; + colBus.input(); + unsigned char col = colBus.read(); + if (col) { + col = _lg2(col); + { // blink to show key pressed + code = 0; + wait_ms(150); + code = 0xF; + wait_ms(150); + } + char row = pin2Row(pinPressed); + code = toBinary(row,col); +// printf("%d, %d, %c\r\n", row, col, toChar(row,col)); + } + irqFinished = true; +} + +void trigger27() { + checkColumn(p27); +} +void trigger28() { + checkColumn(p28); +} +void trigger29() { + checkColumn(p29); +} +void trigger30() { + checkColumn(p30); +} + +void checkRow() { + InterruptIn irqIn27(p27), irqIn28(p28), irqIn29(p29), irqIn30(p30); + irqIn27.rise( &trigger27); + irqIn28.rise( &trigger28); + irqIn29.rise( &trigger29); + irqIn30.rise( &trigger30); +} + +int main() { + while (1) { + start(); + irqFinished = false; + checkRow(); + while (!irqFinished); + } +}
diff -r 000000000000 -r 510bbea7c78e mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Dec 11 08:50:58 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/078e4b97a13e