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.
lcd128menu.cpp
00001 // 00002 // MBED Application Board 00003 // Lightweight Menu-driven Interface 00004 // 2014, Alexander Medvedev, @medvdv 00005 // 00006 00007 #include "mbed.h" 00008 00009 #include "lcd128lib.h" 00010 #include "lcd128menu.h" 00011 00012 /* 00013 #define APPMENU_END 0 // End of menu 00014 #define APPMENU_ACTION 1 // Standart item - action 00015 #define APPMENU_BREAK 2 // Break line "----" 00016 #define APPMENU_SUBMENU 3 // Enter to other menu 00017 #define APPMENU_COMMENT 4 // Text comment, not active 00018 #define APPMENU_CHECK 5 // Check box 00019 #define APPMENU_RADIO 6 // One of radio buttons 00020 #define APPMENU_NUMBER 7 // Integer number [minimum +step +2step ... maximum] 00021 #define APPMENU_PROGRESS 8 // Float level [0.0 .. 1.0] 00022 */ 00023 00024 #define APPMENU_WIDTH (LCD_X-APPMENU_TAB*2) 00025 00026 void lcd128draw(lcd128 * lcd, lcd128entry * entry, int row) 00027 { 00028 lcd->XY(APPMENU_TAB, row); 00029 00030 lcd->Bold(entry->bold); 00031 lcd->Underline(entry->underline); 00032 00033 switch (entry->type) { 00034 case 0: 00035 default: 00036 break; 00037 00038 case 3: 00039 lcd->Character(LCD_PLAY); 00040 case 1: 00041 case 4: 00042 lcd->String(entry->name); 00043 break; 00044 00045 case 2: 00046 lcd->Write(APPMENU_DELIMITER, entry->bold ? APPMENU_WIDTH/2 : APPMENU_WIDTH ); 00047 break; 00048 00049 case 5: 00050 lcd->Character( ((bool*)entry->parameter)[0] ? LCD_CHECK_ON : LCD_CHECK_OFF ); 00051 lcd->Character(LCD_SHORT_SPACE); 00052 lcd->String(entry->name); 00053 break; 00054 00055 case 6: 00056 lcd->Character( (((int*)entry->parameter)[0] == entry->id) ? LCD_RADIO_ON : LCD_RADIO_OFF ); 00057 lcd->Character(LCD_SHORT_SPACE); 00058 lcd->String(entry->name); 00059 break; 00060 00061 case 8: 00062 lcd->Bar(entry->bold ? APPMENU_WIDTH/2 : APPMENU_WIDTH, *(float*)entry->parameter); 00063 break; 00064 } 00065 00066 lcd->Bold(false); 00067 lcd->Underline(false); 00068 } 00069 00070 int lcd128menu(lcd128 * lcd, lcd128entry * menu, int N, bool LastRow, 00071 PinName pUp, PinName pDown, PinName pLeft, PinName pRight, PinName pFire) 00072 { 00073 if (N <= 0) return -1; 00074 00075 BusIn joy(pUp, pDown, pLeft, pRight); 00076 DigitalIn fire(pFire); 00077 00078 lcd128entry * menuCurrent = menu; 00079 int item = 0; 00080 00081 do { 00082 00083 lcd -> Clear(); 00084 00085 lcd128draw(lcd, menuCurrent + item, 1); 00086 00087 if (item > 0) lcd128draw(lcd, menuCurrent + item - 1, 0); 00088 if (item < (N-1)) lcd128draw(lcd, menuCurrent + item + 1, 2); 00089 if (item < (N-2)) if (LastRow) lcd128draw(lcd, menuCurrent + item + 2, 3); 00090 00091 lcd -> InverseRow(1); 00092 lcd -> InverseRow(0, 0x80); 00093 00094 lcd -> Update(); 00095 00096 wait_ms(100); 00097 00098 while((joy == 0) && (fire == 0)) wait_ms(100); 00099 00100 if (joy & 1) if(item > 0) item--; 00101 if (joy & 2) if(item < (N-1)) item++; 00102 00103 } while(1); 00104 }
Generated on Sun Jul 31 2022 20:15:31 by 1.7.2