Lightweight proportional text library for C12832 LCD. Easy to modify, fast, robust and compact. Nice font, good for text driven menus, messages, etc. Fell free to use and modify in any projects.
Documentation will be here later.
Usage sample:
Import programapp-board-lcd128
Sample usage of lightweight C12832 LCD library
lcd128menu.cpp@6:5cd32671a837, 2014-10-07 (annotated)
- Committer:
- medvdv
- Date:
- Tue Oct 07 20:50:41 2014 +0000
- Revision:
- 6:5cd32671a837
Experimental menu driven interface
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
medvdv | 6:5cd32671a837 | 1 | // |
medvdv | 6:5cd32671a837 | 2 | // MBED Application Board |
medvdv | 6:5cd32671a837 | 3 | // Lightweight Menu-driven Interface |
medvdv | 6:5cd32671a837 | 4 | // 2014, Alexander Medvedev, @medvdv |
medvdv | 6:5cd32671a837 | 5 | // |
medvdv | 6:5cd32671a837 | 6 | |
medvdv | 6:5cd32671a837 | 7 | #include "mbed.h" |
medvdv | 6:5cd32671a837 | 8 | |
medvdv | 6:5cd32671a837 | 9 | #include "lcd128lib.h" |
medvdv | 6:5cd32671a837 | 10 | #include "lcd128menu.h" |
medvdv | 6:5cd32671a837 | 11 | |
medvdv | 6:5cd32671a837 | 12 | /* |
medvdv | 6:5cd32671a837 | 13 | #define APPMENU_END 0 // End of menu |
medvdv | 6:5cd32671a837 | 14 | #define APPMENU_ACTION 1 // Standart item - action |
medvdv | 6:5cd32671a837 | 15 | #define APPMENU_BREAK 2 // Break line "----" |
medvdv | 6:5cd32671a837 | 16 | #define APPMENU_SUBMENU 3 // Enter to other menu |
medvdv | 6:5cd32671a837 | 17 | #define APPMENU_COMMENT 4 // Text comment, not active |
medvdv | 6:5cd32671a837 | 18 | #define APPMENU_CHECK 5 // Check box |
medvdv | 6:5cd32671a837 | 19 | #define APPMENU_RADIO 6 // One of radio buttons |
medvdv | 6:5cd32671a837 | 20 | #define APPMENU_NUMBER 7 // Integer number [minimum +step +2step ... maximum] |
medvdv | 6:5cd32671a837 | 21 | #define APPMENU_PROGRESS 8 // Float level [0.0 .. 1.0] |
medvdv | 6:5cd32671a837 | 22 | */ |
medvdv | 6:5cd32671a837 | 23 | |
medvdv | 6:5cd32671a837 | 24 | #define APPMENU_WIDTH (LCD_X-APPMENU_TAB*2) |
medvdv | 6:5cd32671a837 | 25 | |
medvdv | 6:5cd32671a837 | 26 | void lcd128draw(lcd128 * lcd, lcd128entry * entry, int row) |
medvdv | 6:5cd32671a837 | 27 | { |
medvdv | 6:5cd32671a837 | 28 | lcd->XY(APPMENU_TAB, row); |
medvdv | 6:5cd32671a837 | 29 | |
medvdv | 6:5cd32671a837 | 30 | lcd->Bold(entry->bold); |
medvdv | 6:5cd32671a837 | 31 | lcd->Underline(entry->underline); |
medvdv | 6:5cd32671a837 | 32 | |
medvdv | 6:5cd32671a837 | 33 | switch (entry->type) { |
medvdv | 6:5cd32671a837 | 34 | case 0: |
medvdv | 6:5cd32671a837 | 35 | default: |
medvdv | 6:5cd32671a837 | 36 | break; |
medvdv | 6:5cd32671a837 | 37 | |
medvdv | 6:5cd32671a837 | 38 | case 3: |
medvdv | 6:5cd32671a837 | 39 | lcd->Character(LCD_PLAY); |
medvdv | 6:5cd32671a837 | 40 | case 1: |
medvdv | 6:5cd32671a837 | 41 | case 4: |
medvdv | 6:5cd32671a837 | 42 | lcd->String(entry->name); |
medvdv | 6:5cd32671a837 | 43 | break; |
medvdv | 6:5cd32671a837 | 44 | |
medvdv | 6:5cd32671a837 | 45 | case 2: |
medvdv | 6:5cd32671a837 | 46 | lcd->Write(APPMENU_DELIMITER, entry->bold ? APPMENU_WIDTH/2 : APPMENU_WIDTH ); |
medvdv | 6:5cd32671a837 | 47 | break; |
medvdv | 6:5cd32671a837 | 48 | |
medvdv | 6:5cd32671a837 | 49 | case 5: |
medvdv | 6:5cd32671a837 | 50 | lcd->Character( ((bool*)entry->parameter)[0] ? LCD_CHECK_ON : LCD_CHECK_OFF ); |
medvdv | 6:5cd32671a837 | 51 | lcd->Character(LCD_SHORT_SPACE); |
medvdv | 6:5cd32671a837 | 52 | lcd->String(entry->name); |
medvdv | 6:5cd32671a837 | 53 | break; |
medvdv | 6:5cd32671a837 | 54 | |
medvdv | 6:5cd32671a837 | 55 | case 6: |
medvdv | 6:5cd32671a837 | 56 | lcd->Character( (((int*)entry->parameter)[0] == entry->id) ? LCD_RADIO_ON : LCD_RADIO_OFF ); |
medvdv | 6:5cd32671a837 | 57 | lcd->Character(LCD_SHORT_SPACE); |
medvdv | 6:5cd32671a837 | 58 | lcd->String(entry->name); |
medvdv | 6:5cd32671a837 | 59 | break; |
medvdv | 6:5cd32671a837 | 60 | |
medvdv | 6:5cd32671a837 | 61 | case 8: |
medvdv | 6:5cd32671a837 | 62 | lcd->Bar(entry->bold ? APPMENU_WIDTH/2 : APPMENU_WIDTH, *(float*)entry->parameter); |
medvdv | 6:5cd32671a837 | 63 | break; |
medvdv | 6:5cd32671a837 | 64 | } |
medvdv | 6:5cd32671a837 | 65 | |
medvdv | 6:5cd32671a837 | 66 | lcd->Bold(false); |
medvdv | 6:5cd32671a837 | 67 | lcd->Underline(false); |
medvdv | 6:5cd32671a837 | 68 | } |
medvdv | 6:5cd32671a837 | 69 | |
medvdv | 6:5cd32671a837 | 70 | int lcd128menu(lcd128 * lcd, lcd128entry * menu, int N, bool LastRow, |
medvdv | 6:5cd32671a837 | 71 | PinName pUp, PinName pDown, PinName pLeft, PinName pRight, PinName pFire) |
medvdv | 6:5cd32671a837 | 72 | { |
medvdv | 6:5cd32671a837 | 73 | if (N <= 0) return -1; |
medvdv | 6:5cd32671a837 | 74 | |
medvdv | 6:5cd32671a837 | 75 | BusIn joy(pUp, pDown, pLeft, pRight); |
medvdv | 6:5cd32671a837 | 76 | DigitalIn fire(pFire); |
medvdv | 6:5cd32671a837 | 77 | |
medvdv | 6:5cd32671a837 | 78 | lcd128entry * menuCurrent = menu; |
medvdv | 6:5cd32671a837 | 79 | int item = 0; |
medvdv | 6:5cd32671a837 | 80 | |
medvdv | 6:5cd32671a837 | 81 | do { |
medvdv | 6:5cd32671a837 | 82 | |
medvdv | 6:5cd32671a837 | 83 | lcd -> Clear(); |
medvdv | 6:5cd32671a837 | 84 | |
medvdv | 6:5cd32671a837 | 85 | lcd128draw(lcd, menuCurrent + item, 1); |
medvdv | 6:5cd32671a837 | 86 | |
medvdv | 6:5cd32671a837 | 87 | if (item > 0) lcd128draw(lcd, menuCurrent + item - 1, 0); |
medvdv | 6:5cd32671a837 | 88 | if (item < (N-1)) lcd128draw(lcd, menuCurrent + item + 1, 2); |
medvdv | 6:5cd32671a837 | 89 | if (item < (N-2)) if (LastRow) lcd128draw(lcd, menuCurrent + item + 2, 3); |
medvdv | 6:5cd32671a837 | 90 | |
medvdv | 6:5cd32671a837 | 91 | lcd -> InverseRow(1); |
medvdv | 6:5cd32671a837 | 92 | lcd -> InverseRow(0, 0x80); |
medvdv | 6:5cd32671a837 | 93 | |
medvdv | 6:5cd32671a837 | 94 | lcd -> Update(); |
medvdv | 6:5cd32671a837 | 95 | |
medvdv | 6:5cd32671a837 | 96 | wait_ms(100); |
medvdv | 6:5cd32671a837 | 97 | |
medvdv | 6:5cd32671a837 | 98 | while((joy == 0) && (fire == 0)) wait_ms(100); |
medvdv | 6:5cd32671a837 | 99 | |
medvdv | 6:5cd32671a837 | 100 | if (joy & 1) if(item > 0) item--; |
medvdv | 6:5cd32671a837 | 101 | if (joy & 2) if(item < (N-1)) item++; |
medvdv | 6:5cd32671a837 | 102 | |
medvdv | 6:5cd32671a837 | 103 | } while(1); |
medvdv | 6:5cd32671a837 | 104 | } |