Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:9b11b0e69ff4, 2018-01-05 (annotated)
- Committer:
- hudakz
- Date:
- Fri Jan 05 14:49:58 2018 +0000
- Revision:
- 3:9b11b0e69ff4
- Parent:
- 2:92f4dad1b937
Rather than polling digital inputs, buttons are implemented utilizng interrupts.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 0:f7514c3f33b6 | 1 | /* |
hudakz | 0:f7514c3f33b6 | 2 | * An example of using the Menu library - Simple Menu system with push buttons. |
hudakz | 0:f7514c3f33b6 | 3 | * |
hudakz | 0:f7514c3f33b6 | 4 | * The Menu library was created to facilitate designs with a display and push buttons. |
hudakz | 0:f7514c3f33b6 | 5 | * - number of menus and push buttons is practically not limited by the software |
hudakz | 0:f7514c3f33b6 | 6 | * - function of individual push buttons varies depending on the selected menu |
hudakz | 0:f7514c3f33b6 | 7 | * |
hudakz | 0:f7514c3f33b6 | 8 | * --------------------------------- |
hudakz | 0:f7514c3f33b6 | 9 | * | | |
hudakz | 0:f7514c3f33b6 | 10 | * | ---------------------------- | |
hudakz | 0:f7514c3f33b6 | 11 | * | | | | |
hudakz | 0:f7514c3f33b6 | 12 | * | | | | |
hudakz | 0:f7514c3f33b6 | 13 | * | | | | |
hudakz | 0:f7514c3f33b6 | 14 | * | | Display | | |
hudakz | 0:f7514c3f33b6 | 15 | * | | | | |
hudakz | 0:f7514c3f33b6 | 16 | * | | | | |
hudakz | 0:f7514c3f33b6 | 17 | * | | | | |
hudakz | 0:f7514c3f33b6 | 18 | * | ---------------------------- | |
hudakz | 0:f7514c3f33b6 | 19 | * | O O O O | |
hudakz | 0:f7514c3f33b6 | 20 | * | Btn1 Btn2 Btn3 Btn4 | |
hudakz | 0:f7514c3f33b6 | 21 | * | | |
hudakz | 0:f7514c3f33b6 | 22 | * ---------------------------------- |
hudakz | 3:9b11b0e69ff4 | 23 | * |
hudakz | 0:f7514c3f33b6 | 24 | * Each push button must be connected to an mbed digital input pin and the ground. |
hudakz | 0:f7514c3f33b6 | 25 | * |
hudakz | 0:f7514c3f33b6 | 26 | * |
hudakz | 0:f7514c3f33b6 | 27 | * ------------------------- |
hudakz | 0:f7514c3f33b6 | 28 | * | |
hudakz | 0:f7514c3f33b6 | 29 | * | mbed board |
hudakz | 0:f7514c3f33b6 | 30 | * | |
hudakz | 0:f7514c3f33b6 | 31 | * ------------------------- |
hudakz | 0:f7514c3f33b6 | 32 | * | Input pin |
hudakz | 0:f7514c3f33b6 | 33 | * | |
hudakz | 0:f7514c3f33b6 | 34 | * o |
hudakz | 0:f7514c3f33b6 | 35 | * / Button ... |
hudakz | 0:f7514c3f33b6 | 36 | * o |
hudakz | 0:f7514c3f33b6 | 37 | * | |
hudakz | 0:f7514c3f33b6 | 38 | * --- |
hudakz | 0:f7514c3f33b6 | 39 | * GND |
hudakz | 0:f7514c3f33b6 | 40 | * |
hudakz | 0:f7514c3f33b6 | 41 | * |
hudakz | 3:9b11b0e69ff4 | 42 | * NOTE: When creating a MenuSystem the constructor automatically connects |
hudakz | 3:9b11b0e69ff4 | 43 | * an internal pull-up resistor to each PushButton input used by the MenuSytem. |
hudakz | 0:f7514c3f33b6 | 44 | */ |
hudakz | 0:f7514c3f33b6 | 45 | |
hudakz | 0:f7514c3f33b6 | 46 | #include "mbed.h" |
hudakz | 0:f7514c3f33b6 | 47 | #include "Menu.h" |
hudakz | 0:f7514c3f33b6 | 48 | |
hudakz | 0:f7514c3f33b6 | 49 | Serial pc(USBTX, USBRX); |
hudakz | 0:f7514c3f33b6 | 50 | |
hudakz | 0:f7514c3f33b6 | 51 | /* |
hudakz | 3:9b11b0e69ff4 | 52 | * Variables used in this example |
hudakz | 0:f7514c3f33b6 | 53 | */ |
hudakz | 0:f7514c3f33b6 | 54 | int setpoint; |
hudakz | 0:f7514c3f33b6 | 55 | int* p_setpoint; |
hudakz | 0:f7514c3f33b6 | 56 | int loSetpoint = 20; |
hudakz | 0:f7514c3f33b6 | 57 | int hiSetpoint = 50; |
hudakz | 0:f7514c3f33b6 | 58 | |
hudakz | 0:f7514c3f33b6 | 59 | /* |
hudakz | 3:9b11b0e69ff4 | 60 | * Define push buttons to be used in menu. |
hudakz | 0:f7514c3f33b6 | 61 | */ |
hudakz | 0:f7514c3f33b6 | 62 | #if defined(TARGET_LPC1768) |
hudakz | 3:9b11b0e69ff4 | 63 | PushButton btnMode(p21), btnMore(p22), btnLess(p23), btnSave(p24); |
hudakz | 3:9b11b0e69ff4 | 64 | #else |
hudakz | 3:9b11b0e69ff4 | 65 | PushButton btnMode(D2), btnMore(D3), btnLess(D4), btnSave(D5); |
hudakz | 0:f7514c3f33b6 | 66 | #endif |
hudakz | 0:f7514c3f33b6 | 67 | |
hudakz | 3:9b11b0e69ff4 | 68 | |
hudakz | 0:f7514c3f33b6 | 69 | /* |
hudakz | 3:9b11b0e69ff4 | 70 | * Define an array of PushButton pointers initialized with push buttons created above. |
hudakz | 0:f7514c3f33b6 | 71 | */ |
hudakz | 3:9b11b0e69ff4 | 72 | PushButton* buttons[] = {&btnMode, &btnMore, &btnLess, &btnSave}; |
hudakz | 3:9b11b0e69ff4 | 73 | |
hudakz | 0:f7514c3f33b6 | 74 | |
hudakz | 0:f7514c3f33b6 | 75 | /* |
hudakz | 0:f7514c3f33b6 | 76 | * Create a menu system object associated with the push buttons |
hudakz | 0:f7514c3f33b6 | 77 | */ |
hudakz | 3:9b11b0e69ff4 | 78 | MenuSystem menuSystem(buttons, 4 /*, 300 */); // name of the array, number of buttons, (debounce time in ms) |
hudakz | 0:f7514c3f33b6 | 79 | |
hudakz | 0:f7514c3f33b6 | 80 | /* |
hudakz | 0:f7514c3f33b6 | 81 | * Create as many menus as you need. |
hudakz | 0:f7514c3f33b6 | 82 | * |
hudakz | 0:f7514c3f33b6 | 83 | * In this example we create the following three menus: |
hudakz | 3:9b11b0e69ff4 | 84 | * 1. Main |
hudakz | 3:9b11b0e69ff4 | 85 | * 2. Set high setpoint |
hudakz | 3:9b11b0e69ff4 | 86 | * 3. Set low setpoint |
hudakz | 0:f7514c3f33b6 | 87 | * |
hudakz | 3:9b11b0e69ff4 | 88 | * NOTE: The function of individual push buttons will vary depending on the actually opened menu. |
hudakz | 0:f7514c3f33b6 | 89 | */ |
hudakz | 0:f7514c3f33b6 | 90 | Menu menuMain(menuSystem); |
hudakz | 0:f7514c3f33b6 | 91 | Menu menuSetHiSetpoint(menuSystem); |
hudakz | 0:f7514c3f33b6 | 92 | Menu menuSetLoSetpoint(menuSystem); |
hudakz | 0:f7514c3f33b6 | 93 | |
hudakz | 0:f7514c3f33b6 | 94 | /* |
hudakz | 0:f7514c3f33b6 | 95 | * Declare all functions to be called on 'button pressed' events |
hudakz | 0:f7514c3f33b6 | 96 | */ |
hudakz | 0:f7514c3f33b6 | 97 | void openMenu_Main(void); |
hudakz | 0:f7514c3f33b6 | 98 | void openMenu_SetHiSetpoint(void); |
hudakz | 0:f7514c3f33b6 | 99 | void openMenu_SetLoSetpoint(void); |
hudakz | 0:f7514c3f33b6 | 100 | void incrementSetpoint(void); |
hudakz | 0:f7514c3f33b6 | 101 | void decrementSetpoint(void); |
hudakz | 0:f7514c3f33b6 | 102 | void saveSetpoint(void); |
hudakz | 0:f7514c3f33b6 | 103 | |
hudakz | 0:f7514c3f33b6 | 104 | /** |
hudakz | 0:f7514c3f33b6 | 105 | * @brief |
hudakz | 0:f7514c3f33b6 | 106 | * @note |
hudakz | 0:f7514c3f33b6 | 107 | * @param |
hudakz | 0:f7514c3f33b6 | 108 | * @retval |
hudakz | 0:f7514c3f33b6 | 109 | */ |
hudakz | 0:f7514c3f33b6 | 110 | int main(void) { |
hudakz | 0:f7514c3f33b6 | 111 | |
hudakz | 0:f7514c3f33b6 | 112 | // Attach 'button pressed' event handler functions to the individual push buttons. |
hudakz | 1:cc0fa853f718 | 113 | // NOTE: It is not compulsory to attach a function to all push buttons in each menu. |
hudakz | 0:f7514c3f33b6 | 114 | // |
hudakz | 0:f7514c3f33b6 | 115 | |
hudakz | 0:f7514c3f33b6 | 116 | // 'Main' menu: |
hudakz | 3:9b11b0e69ff4 | 117 | menuMain.attach(buttons[0], openMenu_SetHiSetpoint); |
hudakz | 0:f7514c3f33b6 | 118 | |
hudakz | 0:f7514c3f33b6 | 119 | // |
hudakz | 0:f7514c3f33b6 | 120 | // 'Set High Setpoint' menu: |
hudakz | 3:9b11b0e69ff4 | 121 | menuSetHiSetpoint.attach(buttons[0], openMenu_SetLoSetpoint); |
hudakz | 3:9b11b0e69ff4 | 122 | menuSetHiSetpoint.attach(buttons[1], incrementSetpoint); |
hudakz | 3:9b11b0e69ff4 | 123 | menuSetHiSetpoint.attach(buttons[2], decrementSetpoint); |
hudakz | 3:9b11b0e69ff4 | 124 | menuSetHiSetpoint.attach(buttons[3], saveSetpoint); |
hudakz | 0:f7514c3f33b6 | 125 | |
hudakz | 0:f7514c3f33b6 | 126 | // |
hudakz | 0:f7514c3f33b6 | 127 | // 'Set Low Setpoint' menu: |
hudakz | 3:9b11b0e69ff4 | 128 | menuSetLoSetpoint.attach(buttons[0], openMenu_Main); |
hudakz | 3:9b11b0e69ff4 | 129 | menuSetLoSetpoint.attach(buttons[1], incrementSetpoint); |
hudakz | 3:9b11b0e69ff4 | 130 | menuSetLoSetpoint.attach(buttons[2], decrementSetpoint); |
hudakz | 3:9b11b0e69ff4 | 131 | menuSetLoSetpoint.attach(buttons[3], saveSetpoint); |
hudakz | 0:f7514c3f33b6 | 132 | |
hudakz | 3:9b11b0e69ff4 | 133 | openMenu_Main(); // open 'Main' menu |
hudakz | 0:f7514c3f33b6 | 134 | |
hudakz | 0:f7514c3f33b6 | 135 | while(1) { |
hudakz | 3:9b11b0e69ff4 | 136 | // When a button is pressed a flag is set immediately via an interrupt service routine. |
hudakz | 3:9b11b0e69ff4 | 137 | // But the assigned handler is called later on here by the 'handleButtons()' function. |
hudakz | 3:9b11b0e69ff4 | 138 | menuSystem.handleButtons(); |
hudakz | 0:f7514c3f33b6 | 139 | |
hudakz | 3:9b11b0e69ff4 | 140 | //.. Your main code |
hudakz | 0:f7514c3f33b6 | 141 | } |
hudakz | 0:f7514c3f33b6 | 142 | } |
hudakz | 0:f7514c3f33b6 | 143 | |
hudakz | 0:f7514c3f33b6 | 144 | /* |
hudakz | 0:f7514c3f33b6 | 145 | * Lets define te menu functions: |
hudakz | 0:f7514c3f33b6 | 146 | |
hudakz | 0:f7514c3f33b6 | 147 | * NOTE: For the sake of simplicity, in this example we do not connect any display to the mbed. |
hudakz | 0:f7514c3f33b6 | 148 | * Instead we'll utilize a serial terminal running on the connected PC. |
hudakz | 0:f7514c3f33b6 | 149 | */ |
hudakz | 0:f7514c3f33b6 | 150 | |
hudakz | 0:f7514c3f33b6 | 151 | /** |
hudakz | 0:f7514c3f33b6 | 152 | * @brief |
hudakz | 0:f7514c3f33b6 | 153 | * @note None |
hudakz | 0:f7514c3f33b6 | 154 | * @param None |
hudakz | 0:f7514c3f33b6 | 155 | * @retval None |
hudakz | 0:f7514c3f33b6 | 156 | */ |
hudakz | 0:f7514c3f33b6 | 157 | void openMenu_Main(void) { |
hudakz | 0:f7514c3f33b6 | 158 | menuSystem.open(menuMain); // activate the menu |
hudakz | 0:f7514c3f33b6 | 159 | pc.printf("---------------------------------------------------\r\n"); |
hudakz | 3:9b11b0e69ff4 | 160 | pc.printf("Main menu:\r\n"); |
hudakz | 3:9b11b0e69ff4 | 161 | pc.printf("Press 'Mode' to open 'High setpoint' menu.\r\n"); |
hudakz | 0:f7514c3f33b6 | 162 | pc.printf("hiSetpoint = %i\r\n", hiSetpoint); |
hudakz | 3:9b11b0e69ff4 | 163 | pc.printf("loSetpoint = %i\r\n", loSetpoint); |
hudakz | 0:f7514c3f33b6 | 164 | pc.printf("\r\n"); |
hudakz | 0:f7514c3f33b6 | 165 | } |
hudakz | 0:f7514c3f33b6 | 166 | |
hudakz | 0:f7514c3f33b6 | 167 | /** |
hudakz | 0:f7514c3f33b6 | 168 | * @brief |
hudakz | 0:f7514c3f33b6 | 169 | * @note |
hudakz | 0:f7514c3f33b6 | 170 | * @param |
hudakz | 0:f7514c3f33b6 | 171 | * @retval |
hudakz | 0:f7514c3f33b6 | 172 | */ |
hudakz | 0:f7514c3f33b6 | 173 | void openMenu_SetHiSetpoint(void) { |
hudakz | 0:f7514c3f33b6 | 174 | menuSystem.open(menuSetHiSetpoint); // activate the menu |
hudakz | 0:f7514c3f33b6 | 175 | pc.printf("---------------------------------------------------\r\n"); |
hudakz | 0:f7514c3f33b6 | 176 | pc.printf("High setpoint menu:\r\n"); |
hudakz | 3:9b11b0e69ff4 | 177 | pc.printf("Press 'Mode' to open 'Low setpoint' menu.\r\n"); |
hudakz | 0:f7514c3f33b6 | 178 | pc.printf("Press 'More' to increment high setpoint.\r\n"); |
hudakz | 0:f7514c3f33b6 | 179 | pc.printf("Press 'Less' to decrement high setpoint.\r\n"); |
hudakz | 0:f7514c3f33b6 | 180 | pc.printf("Press 'Save' to save the setoint.\r\n"); |
hudakz | 0:f7514c3f33b6 | 181 | pc.printf("\r\n"); |
hudakz | 0:f7514c3f33b6 | 182 | |
hudakz | 0:f7514c3f33b6 | 183 | p_setpoint = &hiSetpoint; |
hudakz | 0:f7514c3f33b6 | 184 | setpoint = hiSetpoint; |
hudakz | 0:f7514c3f33b6 | 185 | } |
hudakz | 0:f7514c3f33b6 | 186 | |
hudakz | 0:f7514c3f33b6 | 187 | /** |
hudakz | 0:f7514c3f33b6 | 188 | * @brief |
hudakz | 0:f7514c3f33b6 | 189 | * @note |
hudakz | 0:f7514c3f33b6 | 190 | * @param |
hudakz | 0:f7514c3f33b6 | 191 | * @retval |
hudakz | 0:f7514c3f33b6 | 192 | */ |
hudakz | 0:f7514c3f33b6 | 193 | void openMenu_SetLoSetpoint(void) { |
hudakz | 0:f7514c3f33b6 | 194 | menuSystem.open(menuSetLoSetpoint); // activate the menu |
hudakz | 0:f7514c3f33b6 | 195 | pc.printf("---------------------------------------------------\r\n"); |
hudakz | 0:f7514c3f33b6 | 196 | pc.printf("Low setpoint menu:\r\n"); |
hudakz | 3:9b11b0e69ff4 | 197 | pc.printf("Press 'Mode' to open 'Main' menu.\r\n"); |
hudakz | 0:f7514c3f33b6 | 198 | pc.printf("Press 'More' to increment low setpoint.\r\n"); |
hudakz | 0:f7514c3f33b6 | 199 | pc.printf("Press 'Less' to decrement low setpoint.\r\n"); |
hudakz | 0:f7514c3f33b6 | 200 | pc.printf("Press 'Save' to save the setpoint.\r\n"); |
hudakz | 0:f7514c3f33b6 | 201 | pc.printf("\r\n"); |
hudakz | 0:f7514c3f33b6 | 202 | |
hudakz | 0:f7514c3f33b6 | 203 | p_setpoint = &loSetpoint; |
hudakz | 0:f7514c3f33b6 | 204 | setpoint = loSetpoint; |
hudakz | 0:f7514c3f33b6 | 205 | } |
hudakz | 0:f7514c3f33b6 | 206 | |
hudakz | 0:f7514c3f33b6 | 207 | /** |
hudakz | 0:f7514c3f33b6 | 208 | * @brief |
hudakz | 0:f7514c3f33b6 | 209 | * @note |
hudakz | 0:f7514c3f33b6 | 210 | * @param |
hudakz | 0:f7514c3f33b6 | 211 | * @retval |
hudakz | 0:f7514c3f33b6 | 212 | */ |
hudakz | 0:f7514c3f33b6 | 213 | void incrementSetpoint(void) { |
hudakz | 0:f7514c3f33b6 | 214 | setpoint++; |
hudakz | 0:f7514c3f33b6 | 215 | pc.printf("Setpoint incremented\r\n"); |
hudakz | 0:f7514c3f33b6 | 216 | pc.printf("setpoint = %i\r\n", setpoint); |
hudakz | 0:f7514c3f33b6 | 217 | } |
hudakz | 0:f7514c3f33b6 | 218 | |
hudakz | 0:f7514c3f33b6 | 219 | /** |
hudakz | 0:f7514c3f33b6 | 220 | * @brief |
hudakz | 0:f7514c3f33b6 | 221 | * @note |
hudakz | 0:f7514c3f33b6 | 222 | * @param |
hudakz | 0:f7514c3f33b6 | 223 | * @retval |
hudakz | 0:f7514c3f33b6 | 224 | */ |
hudakz | 0:f7514c3f33b6 | 225 | void decrementSetpoint(void) { |
hudakz | 0:f7514c3f33b6 | 226 | setpoint--; |
hudakz | 0:f7514c3f33b6 | 227 | pc.printf("Setpoint decremented\r\n"); |
hudakz | 0:f7514c3f33b6 | 228 | pc.printf("setpoint = %i\r\n", setpoint); |
hudakz | 0:f7514c3f33b6 | 229 | } |
hudakz | 0:f7514c3f33b6 | 230 | |
hudakz | 0:f7514c3f33b6 | 231 | |
hudakz | 0:f7514c3f33b6 | 232 | /** |
hudakz | 0:f7514c3f33b6 | 233 | * @brief |
hudakz | 0:f7514c3f33b6 | 234 | * @note |
hudakz | 0:f7514c3f33b6 | 235 | * @param |
hudakz | 0:f7514c3f33b6 | 236 | * @retval |
hudakz | 0:f7514c3f33b6 | 237 | */ |
hudakz | 0:f7514c3f33b6 | 238 | void saveSetpoint(void) { |
hudakz | 0:f7514c3f33b6 | 239 | *p_setpoint = setpoint; |
hudakz | 0:f7514c3f33b6 | 240 | pc.printf("Setpoint saved\r\n"); |
hudakz | 0:f7514c3f33b6 | 241 | pc.printf("\r\n"); |
hudakz | 0:f7514c3f33b6 | 242 | } |
hudakz | 0:f7514c3f33b6 | 243 | |
hudakz | 0:f7514c3f33b6 | 244 | |
hudakz | 0:f7514c3f33b6 | 245 | |
hudakz | 3:9b11b0e69ff4 | 246 |