asdasdasd

Dependencies:   mbed

Fork of FINAL_PROJECT_4180 by Gedeon Nyengele

Committer:
xemnas214
Date:
Wed Nov 23 01:07:10 2016 +0000
Revision:
14:ca57ad53761b
Parent:
12:5cb9ffad1ad7
iotlockkkk;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyengele 12:5cb9ffad1ad7 1 /**
nyengele 12:5cb9ffad1ad7 2 * Driver for Keypad devices
nyengele 12:5cb9ffad1ad7 3 * @author Gedeon Nyengele
nyengele 12:5cb9ffad1ad7 4 * @version 1.0
nyengele 12:5cb9ffad1ad7 5 * @date 5/7/2015
nyengele 12:5cb9ffad1ad7 6 */
nyengele 12:5cb9ffad1ad7 7
nyengele 12:5cb9ffad1ad7 8 #ifndef KEYPAD_H
nyengele 12:5cb9ffad1ad7 9 #define KEYPAD_H
nyengele 12:5cb9ffad1ad7 10 #include "mbed.h"
nyengele 12:5cb9ffad1ad7 11
nyengele 12:5cb9ffad1ad7 12 template<unsigned char nRows, unsigned char nCols>
nyengele 12:5cb9ffad1ad7 13 class Keypad
nyengele 12:5cb9ffad1ad7 14 {
nyengele 12:5cb9ffad1ad7 15 public:
nyengele 12:5cb9ffad1ad7 16 Keypad(char matrix[nRows][nCols], BusInOut* rows, BusInOut* cols);
nyengele 12:5cb9ffad1ad7 17 char getKeyChar(); // Get the value of the pressed key
nyengele 12:5cb9ffad1ad7 18 char getKeyChar(void (*wait_ms_fn)(int millis));
nyengele 12:5cb9ffad1ad7 19 ~Keypad(){};
nyengele 12:5cb9ffad1ad7 20 enum BTN_STATE { RELEASE, DEBOUNCE_PRESS, PRESSED, DEBOUNCE_RELEASE, DONE };
nyengele 12:5cb9ffad1ad7 21
nyengele 12:5cb9ffad1ad7 22 private:
nyengele 12:5cb9ffad1ad7 23 int getKey();
nyengele 12:5cb9ffad1ad7 24
nyengele 12:5cb9ffad1ad7 25 protected:
nyengele 12:5cb9ffad1ad7 26 char _matrix[nRows][nCols];
nyengele 12:5cb9ffad1ad7 27 BusInOut* _cols;
nyengele 12:5cb9ffad1ad7 28 BusInOut* _rows;
nyengele 12:5cb9ffad1ad7 29 };
nyengele 12:5cb9ffad1ad7 30
nyengele 12:5cb9ffad1ad7 31 /** --------------------------------------------------------------------------
nyengele 12:5cb9ffad1ad7 32 * Constructor
nyengele 12:5cb9ffad1ad7 33 *----------------------------------------------------------------------------
nyengele 12:5cb9ffad1ad7 34 */
nyengele 12:5cb9ffad1ad7 35 template<unsigned char nRows, unsigned char nCols>
nyengele 12:5cb9ffad1ad7 36 Keypad<nRows, nCols>::Keypad(char matrix[nRows][nCols], BusInOut* rows, BusInOut* cols)
nyengele 12:5cb9ffad1ad7 37 {
nyengele 12:5cb9ffad1ad7 38
nyengele 12:5cb9ffad1ad7 39 // Copy keypad matrix
nyengele 12:5cb9ffad1ad7 40 for (int i = 0; i < nRows; i++) {
nyengele 12:5cb9ffad1ad7 41 for (int j = 0; j < nCols; j++) {
nyengele 12:5cb9ffad1ad7 42 _matrix[i][j] = matrix[i][j];
nyengele 12:5cb9ffad1ad7 43 }
nyengele 12:5cb9ffad1ad7 44 }
nyengele 12:5cb9ffad1ad7 45
nyengele 12:5cb9ffad1ad7 46 // Create data bus for row pins
nyengele 12:5cb9ffad1ad7 47 _rows = rows;
nyengele 12:5cb9ffad1ad7 48
nyengele 12:5cb9ffad1ad7 49 // Create data bus for column pins
nyengele 12:5cb9ffad1ad7 50 _cols = cols;
nyengele 12:5cb9ffad1ad7 51 }
nyengele 12:5cb9ffad1ad7 52
nyengele 12:5cb9ffad1ad7 53 template<unsigned char nRows, unsigned char nCols>
nyengele 12:5cb9ffad1ad7 54 char Keypad<nRows, nCols>::getKeyChar(void (*wait_ms_fn)(int millis)) {
nyengele 12:5cb9ffad1ad7 55 int key;
nyengele 12:5cb9ffad1ad7 56 int temp_key = 0;
nyengele 12:5cb9ffad1ad7 57 bool done = false;
nyengele 12:5cb9ffad1ad7 58 BTN_STATE state = RELEASE;
nyengele 12:5cb9ffad1ad7 59
nyengele 12:5cb9ffad1ad7 60 while(!done) {
nyengele 12:5cb9ffad1ad7 61 switch(state) {
nyengele 12:5cb9ffad1ad7 62 case RELEASE:
nyengele 12:5cb9ffad1ad7 63 key = getKey();
nyengele 12:5cb9ffad1ad7 64 if (key < 0) {
nyengele 12:5cb9ffad1ad7 65 state = RELEASE;
nyengele 12:5cb9ffad1ad7 66 } else {
nyengele 12:5cb9ffad1ad7 67 state = DEBOUNCE_PRESS;
nyengele 12:5cb9ffad1ad7 68 temp_key = key;
nyengele 12:5cb9ffad1ad7 69 }
nyengele 12:5cb9ffad1ad7 70 break;
nyengele 12:5cb9ffad1ad7 71
nyengele 12:5cb9ffad1ad7 72 case DEBOUNCE_PRESS:
nyengele 12:5cb9ffad1ad7 73 if (wait_ms_fn == 0) wait_ms(30);
nyengele 12:5cb9ffad1ad7 74 else wait_ms_fn(30);
nyengele 12:5cb9ffad1ad7 75 key = getKey();
nyengele 12:5cb9ffad1ad7 76 if (key == temp_key) {
nyengele 12:5cb9ffad1ad7 77 state = PRESSED;
nyengele 12:5cb9ffad1ad7 78 } else {
nyengele 12:5cb9ffad1ad7 79 state = RELEASE;
nyengele 12:5cb9ffad1ad7 80 }
nyengele 12:5cb9ffad1ad7 81 break;
nyengele 12:5cb9ffad1ad7 82
nyengele 12:5cb9ffad1ad7 83 case PRESSED:
nyengele 12:5cb9ffad1ad7 84 key = getKey();
nyengele 12:5cb9ffad1ad7 85 if (key == temp_key) {
nyengele 12:5cb9ffad1ad7 86 state = PRESSED;
nyengele 12:5cb9ffad1ad7 87 } else {
nyengele 12:5cb9ffad1ad7 88 state = DEBOUNCE_RELEASE;
nyengele 12:5cb9ffad1ad7 89 }
nyengele 12:5cb9ffad1ad7 90 break;
nyengele 12:5cb9ffad1ad7 91
nyengele 12:5cb9ffad1ad7 92 case DEBOUNCE_RELEASE:
nyengele 12:5cb9ffad1ad7 93 if (wait_ms_fn == 0) wait_ms(30);
nyengele 12:5cb9ffad1ad7 94 else wait_ms_fn(30);
nyengele 12:5cb9ffad1ad7 95 key = getKey();
nyengele 12:5cb9ffad1ad7 96 if (key == temp_key) {
nyengele 12:5cb9ffad1ad7 97 state = PRESSED;
nyengele 12:5cb9ffad1ad7 98 } else {
nyengele 12:5cb9ffad1ad7 99 state = RELEASE;
nyengele 12:5cb9ffad1ad7 100 done = true;
nyengele 12:5cb9ffad1ad7 101 }
nyengele 12:5cb9ffad1ad7 102 }
nyengele 12:5cb9ffad1ad7 103 }
nyengele 12:5cb9ffad1ad7 104
nyengele 12:5cb9ffad1ad7 105 return (char) temp_key;
nyengele 12:5cb9ffad1ad7 106 }
nyengele 12:5cb9ffad1ad7 107
nyengele 12:5cb9ffad1ad7 108 /** --------------------------------------------------------------------------
nyengele 12:5cb9ffad1ad7 109 * Get Key Character
nyengele 12:5cb9ffad1ad7 110 *----------------------------------------------------------------------------
nyengele 12:5cb9ffad1ad7 111 */
nyengele 12:5cb9ffad1ad7 112 template<unsigned char nRows, unsigned char nCols>
nyengele 12:5cb9ffad1ad7 113 char Keypad<nRows, nCols>::getKeyChar()
nyengele 12:5cb9ffad1ad7 114 {
nyengele 12:5cb9ffad1ad7 115 return getKeyChar(0);
nyengele 12:5cb9ffad1ad7 116 }
nyengele 12:5cb9ffad1ad7 117
nyengele 12:5cb9ffad1ad7 118
nyengele 12:5cb9ffad1ad7 119 // HELPER FUNCTIONS
nyengele 12:5cb9ffad1ad7 120
nyengele 12:5cb9ffad1ad7 121 template<unsigned char nRows, unsigned char nCols>
nyengele 12:5cb9ffad1ad7 122 int Keypad<nRows, nCols>::getKey()
nyengele 12:5cb9ffad1ad7 123 {
nyengele 12:5cb9ffad1ad7 124 int rowVal = (1 << nRows) - 1;
nyengele 12:5cb9ffad1ad7 125 int colVal = (1 << nCols) - 1;
nyengele 12:5cb9ffad1ad7 126 int row = -1, col = -1;
nyengele 12:5cb9ffad1ad7 127 unsigned int temp;
nyengele 12:5cb9ffad1ad7 128
nyengele 12:5cb9ffad1ad7 129 // Read rows
nyengele 12:5cb9ffad1ad7 130 _cols->output();
nyengele 12:5cb9ffad1ad7 131 _cols->write(0);
nyengele 12:5cb9ffad1ad7 132 _rows->input();
nyengele 12:5cb9ffad1ad7 133 _rows->mode(PullUp);
nyengele 12:5cb9ffad1ad7 134 wait_us(5);
nyengele 12:5cb9ffad1ad7 135 rowVal = _rows->read();
nyengele 12:5cb9ffad1ad7 136
nyengele 12:5cb9ffad1ad7 137 //Read colums
nyengele 12:5cb9ffad1ad7 138 _rows->output();
nyengele 12:5cb9ffad1ad7 139 _rows->write(0);
nyengele 12:5cb9ffad1ad7 140 _cols->input();
nyengele 12:5cb9ffad1ad7 141 _cols->mode(PullUp);
nyengele 12:5cb9ffad1ad7 142 wait_us(5);
nyengele 12:5cb9ffad1ad7 143 colVal = _cols->read();
nyengele 12:5cb9ffad1ad7 144
nyengele 12:5cb9ffad1ad7 145 // Signal no key press
nyengele 12:5cb9ffad1ad7 146 if (rowVal == ((1 << nRows) - 1) || colVal == ((1 << nCols) - 1) )
nyengele 12:5cb9ffad1ad7 147 return -1;
nyengele 12:5cb9ffad1ad7 148
nyengele 12:5cb9ffad1ad7 149 // Find row number
nyengele 12:5cb9ffad1ad7 150 temp = rowVal ^ ((1 << nRows) - 1);
nyengele 12:5cb9ffad1ad7 151 for (int i = 0; i < nRows; i++) {
nyengele 12:5cb9ffad1ad7 152
nyengele 12:5cb9ffad1ad7 153 if ((temp & (1 << i)) > 0) {
nyengele 12:5cb9ffad1ad7 154 row = i;
nyengele 12:5cb9ffad1ad7 155 break;
nyengele 12:5cb9ffad1ad7 156 }
nyengele 12:5cb9ffad1ad7 157 }
nyengele 12:5cb9ffad1ad7 158
nyengele 12:5cb9ffad1ad7 159 // Find column number
nyengele 12:5cb9ffad1ad7 160 temp = colVal ^ ((1 << nCols) - 1);
nyengele 12:5cb9ffad1ad7 161 for (int i = 0; i < nCols; i++) {
nyengele 12:5cb9ffad1ad7 162 if ((temp & (1 << i)) > 0) {
nyengele 12:5cb9ffad1ad7 163 col = i;
nyengele 12:5cb9ffad1ad7 164 break;
nyengele 12:5cb9ffad1ad7 165 }
nyengele 12:5cb9ffad1ad7 166 }
nyengele 12:5cb9ffad1ad7 167
nyengele 12:5cb9ffad1ad7 168 if (row == -1 || col == -1)
nyengele 12:5cb9ffad1ad7 169 return -1;
nyengele 12:5cb9ffad1ad7 170 else {
nyengele 12:5cb9ffad1ad7 171 return _matrix[row][col];
nyengele 12:5cb9ffad1ad7 172 }
nyengele 12:5cb9ffad1ad7 173 }
nyengele 12:5cb9ffad1ad7 174
nyengele 12:5cb9ffad1ad7 175 #endif // KEYPAD_H