Library used during 1 day workshops presented by Skool and ARM Hungary in 2015.

Fork of Skool_wkshp_lib2015 by Laszlo Vagasi

Committer:
lvagasi
Date:
Fri Sep 25 13:48:39 2015 +0000
Revision:
0:3ad0af8abf43
Child:
1:68d1a8c4970b
First version. Trying to put together all the necessary stuff into one single library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lvagasi 0:3ad0af8abf43 1 #include "mbed.h"
lvagasi 0:3ad0af8abf43 2 #include "keypad.h"
lvagasi 0:3ad0af8abf43 3
lvagasi 0:3ad0af8abf43 4 GPIO_InitTypeDef keypadInit;
lvagasi 0:3ad0af8abf43 5 volatile uint32_t Index = 0xFF;
lvagasi 0:3ad0af8abf43 6 volatile uint32_t new_key = 0;
lvagasi 0:3ad0af8abf43 7
lvagasi 0:3ad0af8abf43 8
lvagasi 0:3ad0af8abf43 9 void EXTI9_5_IRQHandler(void) {
lvagasi 0:3ad0af8abf43 10 HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
lvagasi 0:3ad0af8abf43 11 if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != 0) {
lvagasi 0:3ad0af8abf43 12 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
lvagasi 0:3ad0af8abf43 13 HAL_GPIO_EXTI_Callback(0);
lvagasi 0:3ad0af8abf43 14 } else if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6) != 0) {
lvagasi 0:3ad0af8abf43 15 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6);
lvagasi 0:3ad0af8abf43 16 HAL_GPIO_EXTI_Callback(1);
lvagasi 0:3ad0af8abf43 17 } else if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_7) != 0) {
lvagasi 0:3ad0af8abf43 18 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
lvagasi 0:3ad0af8abf43 19 HAL_GPIO_EXTI_Callback(4);
lvagasi 0:3ad0af8abf43 20 } else if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_8) != 0) {
lvagasi 0:3ad0af8abf43 21 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);
lvagasi 0:3ad0af8abf43 22 HAL_GPIO_EXTI_Callback(2);
lvagasi 0:3ad0af8abf43 23 } else if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_9) != 0) {
lvagasi 0:3ad0af8abf43 24 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);
lvagasi 0:3ad0af8abf43 25 HAL_GPIO_EXTI_Callback(3);
lvagasi 0:3ad0af8abf43 26 }
lvagasi 0:3ad0af8abf43 27 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_RESET); // All cols are driven Low for resume IRQ operation
lvagasi 0:3ad0af8abf43 28 HAL_NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
lvagasi 0:3ad0af8abf43 29 }
lvagasi 0:3ad0af8abf43 30
lvagasi 0:3ad0af8abf43 31 void HAL_GPIO_EXTI_Callback(uint16_t pin) {
lvagasi 0:3ad0af8abf43 32 int col;
lvagasi 0:3ad0af8abf43 33 int temp;
lvagasi 0:3ad0af8abf43 34
lvagasi 0:3ad0af8abf43 35 keypadInit.Pin = rows[0] | rows[1] | rows[2] | rows[3];
lvagasi 0:3ad0af8abf43 36 keypadInit.Mode = GPIO_MODE_INPUT;
lvagasi 0:3ad0af8abf43 37 keypadInit.Pull = GPIO_PULLUP;
lvagasi 0:3ad0af8abf43 38 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 39 for (col = 0; col < ncols; col++) {
lvagasi 0:3ad0af8abf43 40 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET); // All cols are driven High
lvagasi 0:3ad0af8abf43 41 HAL_GPIO_WritePin(GPIOC, cols[col], GPIO_PIN_RESET); // 1 col is driven Low
lvagasi 0:3ad0af8abf43 42 wait_ms(25);
lvagasi 0:3ad0af8abf43 43 temp = (GPIOC->IDR & 0x0360);
lvagasi 0:3ad0af8abf43 44 switch (temp) {
lvagasi 0:3ad0af8abf43 45 case 0x0340: Index = col;
lvagasi 0:3ad0af8abf43 46 break;
lvagasi 0:3ad0af8abf43 47 case 0x0320: Index = 4 + col;
lvagasi 0:3ad0af8abf43 48 break;
lvagasi 0:3ad0af8abf43 49 case 0x0260: Index = 8 + col;
lvagasi 0:3ad0af8abf43 50 break;
lvagasi 0:3ad0af8abf43 51 case 0x0160: Index = 12 + col;
lvagasi 0:3ad0af8abf43 52 break;
lvagasi 0:3ad0af8abf43 53 default: Index = 0xFF;
lvagasi 0:3ad0af8abf43 54 break;
lvagasi 0:3ad0af8abf43 55 }
lvagasi 0:3ad0af8abf43 56 if (Index != 0xFF) {
lvagasi 0:3ad0af8abf43 57 break;
lvagasi 0:3ad0af8abf43 58 }
lvagasi 0:3ad0af8abf43 59 }
lvagasi 0:3ad0af8abf43 60 // Wait for the release of the key
lvagasi 0:3ad0af8abf43 61 while ((GPIOC->IDR & 0x0360) != 0x0360) {}
lvagasi 0:3ad0af8abf43 62 new_key++;
lvagasi 0:3ad0af8abf43 63 }
lvagasi 0:3ad0af8abf43 64
lvagasi 0:3ad0af8abf43 65 void Init_keypad(void) {
lvagasi 0:3ad0af8abf43 66 __GPIOC_CLK_ENABLE();
lvagasi 0:3ad0af8abf43 67 keypadInit.Pin = cols[0] | cols[1] | cols[2];
lvagasi 0:3ad0af8abf43 68 keypadInit.Mode = GPIO_MODE_OUTPUT_OD;
lvagasi 0:3ad0af8abf43 69 keypadInit.Pull = GPIO_NOPULL;
lvagasi 0:3ad0af8abf43 70 keypadInit.Speed = GPIO_SPEED_MEDIUM;
lvagasi 0:3ad0af8abf43 71 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 72
lvagasi 0:3ad0af8abf43 73 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 74 HAL_GPIO_WritePin(GPIOC, cols[2], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 75
lvagasi 0:3ad0af8abf43 76 keypadInit.Pin = rows[0] | rows[1] | rows[2] | rows[3];
lvagasi 0:3ad0af8abf43 77 keypadInit.Mode = GPIO_MODE_INPUT;
lvagasi 0:3ad0af8abf43 78 keypadInit.Pull = GPIO_PULLUP;
lvagasi 0:3ad0af8abf43 79 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 80 keypadInit.Pin = rows[3];
lvagasi 0:3ad0af8abf43 81 keypadInit.Mode = GPIO_MODE_IT_FALLING;
lvagasi 0:3ad0af8abf43 82 keypadInit.Pull = GPIO_PULLUP;
lvagasi 0:3ad0af8abf43 83 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 84 NVIC_SetVector(EXTI9_5_IRQn, (uint32_t)EXTI9_5_IRQHandler);
lvagasi 0:3ad0af8abf43 85 HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
lvagasi 0:3ad0af8abf43 86 }
lvagasi 0:3ad0af8abf43 87
lvagasi 0:3ad0af8abf43 88 int Poll_keypad_vert(void) {
lvagasi 0:3ad0af8abf43 89 int temp;
lvagasi 0:3ad0af8abf43 90 int retval = 0xFF;
lvagasi 0:3ad0af8abf43 91
lvagasi 0:3ad0af8abf43 92 keypadInit.Pin = rows[0] | rows[1] | rows[2] | rows[3];
lvagasi 0:3ad0af8abf43 93 keypadInit.Mode = GPIO_MODE_INPUT;
lvagasi 0:3ad0af8abf43 94 keypadInit.Pull = GPIO_PULLUP;
lvagasi 0:3ad0af8abf43 95 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 96 //Poll the keys
lvagasi 0:3ad0af8abf43 97 while (retval == 0xFF) {
lvagasi 0:3ad0af8abf43 98 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 99 HAL_GPIO_WritePin(GPIOC, cols[1], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 100 wait_ms(25);
lvagasi 0:3ad0af8abf43 101 temp = (GPIOC->IDR & 0x0160);
lvagasi 0:3ad0af8abf43 102 switch (temp) {
lvagasi 0:3ad0af8abf43 103 case 0x0140: retval = 0x01;
lvagasi 0:3ad0af8abf43 104 break;
lvagasi 0:3ad0af8abf43 105 case 0x0120: retval = 0x05;
lvagasi 0:3ad0af8abf43 106 break;
lvagasi 0:3ad0af8abf43 107 case 0x0060: retval = 0x09;
lvagasi 0:3ad0af8abf43 108 break;
lvagasi 0:3ad0af8abf43 109 default: retval = 0xFF;
lvagasi 0:3ad0af8abf43 110 break;
lvagasi 0:3ad0af8abf43 111 }
lvagasi 0:3ad0af8abf43 112 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 113 HAL_GPIO_WritePin(GPIOC, cols[2], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 114 wait_ms(25);
lvagasi 0:3ad0af8abf43 115 if ((GPIOC->IDR & 0x0200) == 0x0000) retval = 0x0E;
lvagasi 0:3ad0af8abf43 116 }
lvagasi 0:3ad0af8abf43 117 // Wait for the release of the key
lvagasi 0:3ad0af8abf43 118 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 119 if (retval < 0x0E) {
lvagasi 0:3ad0af8abf43 120 HAL_GPIO_WritePin(GPIOC, cols[1], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 121 } else {
lvagasi 0:3ad0af8abf43 122 HAL_GPIO_WritePin(GPIOC, cols[2], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 123 }
lvagasi 0:3ad0af8abf43 124 while ((GPIOC->IDR & 0x0360) != 0x0360) {}
lvagasi 0:3ad0af8abf43 125 return retval;
lvagasi 0:3ad0af8abf43 126 }
lvagasi 0:3ad0af8abf43 127
lvagasi 0:3ad0af8abf43 128 int Poll_keypad_yesno(void) {
lvagasi 0:3ad0af8abf43 129 int retval = 0xFF;
lvagasi 0:3ad0af8abf43 130
lvagasi 0:3ad0af8abf43 131 keypadInit.Pin = rows[0] | rows[1] | rows[2] | rows[3];
lvagasi 0:3ad0af8abf43 132 keypadInit.Mode = GPIO_MODE_INPUT;
lvagasi 0:3ad0af8abf43 133 keypadInit.Pull = GPIO_PULLUP;
lvagasi 0:3ad0af8abf43 134 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 135
lvagasi 0:3ad0af8abf43 136 while (retval == 0xFF) {
lvagasi 0:3ad0af8abf43 137 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 138 HAL_GPIO_WritePin(GPIOC, cols[0], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 139 wait_ms(25);
lvagasi 0:3ad0af8abf43 140 if ((GPIOC->IDR & 0x0200) == 0x0000) retval = 0x0C;
lvagasi 0:3ad0af8abf43 141 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 142 HAL_GPIO_WritePin(GPIOC, cols[2], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 143 wait_ms(25);
lvagasi 0:3ad0af8abf43 144 if ((GPIOC->IDR & 0x0200) == 0x0000) retval = 0x0E;
lvagasi 0:3ad0af8abf43 145 }
lvagasi 0:3ad0af8abf43 146 // Wait for the release of the key
lvagasi 0:3ad0af8abf43 147 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET);
lvagasi 0:3ad0af8abf43 148 if (retval == 0x0C) {
lvagasi 0:3ad0af8abf43 149 HAL_GPIO_WritePin(GPIOC, cols[0], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 150 } else {
lvagasi 0:3ad0af8abf43 151 HAL_GPIO_WritePin(GPIOC, cols[2], GPIO_PIN_RESET);
lvagasi 0:3ad0af8abf43 152 }
lvagasi 0:3ad0af8abf43 153 while ((GPIOC->IDR & 0x0360) != 0x0360) {}
lvagasi 0:3ad0af8abf43 154 return retval;
lvagasi 0:3ad0af8abf43 155 }
lvagasi 0:3ad0af8abf43 156
lvagasi 0:3ad0af8abf43 157 int Poll_keypad_full(void) {
lvagasi 0:3ad0af8abf43 158 int col, temp;
lvagasi 0:3ad0af8abf43 159 int retval = 0xFF;
lvagasi 0:3ad0af8abf43 160
lvagasi 0:3ad0af8abf43 161 keypadInit.Pin = rows[0] | rows[1] | rows[2] | rows[3];
lvagasi 0:3ad0af8abf43 162 keypadInit.Mode = GPIO_MODE_INPUT;
lvagasi 0:3ad0af8abf43 163 keypadInit.Pull = GPIO_PULLUP;
lvagasi 0:3ad0af8abf43 164 HAL_GPIO_Init(GPIOC, &keypadInit);
lvagasi 0:3ad0af8abf43 165 //Poll the keys
lvagasi 0:3ad0af8abf43 166 while (retval == 0xFF) {
lvagasi 0:3ad0af8abf43 167 for (col = 0; col < ncols; col++) {
lvagasi 0:3ad0af8abf43 168 HAL_GPIO_WritePin(GPIOC, cols[0] | cols[1] | cols[2], GPIO_PIN_SET); // All cols are driven High
lvagasi 0:3ad0af8abf43 169 HAL_GPIO_WritePin(GPIOC, cols[col], GPIO_PIN_RESET); // 1 col is driven Low
lvagasi 0:3ad0af8abf43 170 wait_ms(25);
lvagasi 0:3ad0af8abf43 171 temp = (GPIOC->IDR & 0x0360);
lvagasi 0:3ad0af8abf43 172 switch (temp) {
lvagasi 0:3ad0af8abf43 173 case 0x0340: retval = col;
lvagasi 0:3ad0af8abf43 174 break;
lvagasi 0:3ad0af8abf43 175 case 0x0320: retval = 4 + col;
lvagasi 0:3ad0af8abf43 176 break;
lvagasi 0:3ad0af8abf43 177 case 0x0260: retval = 8 + col;
lvagasi 0:3ad0af8abf43 178 break;
lvagasi 0:3ad0af8abf43 179 case 0x0160: retval = 12 + col;
lvagasi 0:3ad0af8abf43 180 break;
lvagasi 0:3ad0af8abf43 181 default: retval = 0xFF;
lvagasi 0:3ad0af8abf43 182 break;
lvagasi 0:3ad0af8abf43 183 }
lvagasi 0:3ad0af8abf43 184 if (retval != 0xFF) {
lvagasi 0:3ad0af8abf43 185 break;
lvagasi 0:3ad0af8abf43 186 }
lvagasi 0:3ad0af8abf43 187 }
lvagasi 0:3ad0af8abf43 188 }
lvagasi 0:3ad0af8abf43 189 // Wait for the release of the key
lvagasi 0:3ad0af8abf43 190 while ((GPIOC->IDR & 0x0360) != 0x0360) {}
lvagasi 0:3ad0af8abf43 191 return Keytable[retval];
lvagasi 0:3ad0af8abf43 192 }