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.

Dependents:   app-board-lcd128

Documentation will be here later.

Usage sample:

Import programapp-board-lcd128

Sample usage of lightweight C12832 LCD library

Committer:
medvdv
Date:
Sat Jan 14 14:52:41 2017 +0000
Revision:
7:d73d65360196
Parent:
6:5cd32671a837
New revision

Who changed what in which revision?

UserRevisionLine numberNew 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 }