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
lcd128lib.h@7:d73d65360196, 2017-01-14 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
medvdv | 0:6ac8f630d9a0 | 1 | // |
medvdv | 0:6ac8f630d9a0 | 2 | // MBED Application Board |
medvdv | 0:6ac8f630d9a0 | 3 | // Lightweight C12832 LCD library |
medvdv | 0:6ac8f630d9a0 | 4 | // 2014, Alexander Medvedev, @medvdv |
medvdv | 0:6ac8f630d9a0 | 5 | // |
medvdv | 0:6ac8f630d9a0 | 6 | |
medvdv | 0:6ac8f630d9a0 | 7 | // |
medvdv | 0:6ac8f630d9a0 | 8 | // BC12832 LCD |
medvdv | 0:6ac8f630d9a0 | 9 | // Base geometry: 128 x 32 px |
medvdv | 0:6ac8f630d9a0 | 10 | // X - [0..127] pixels |
medvdv | 0:6ac8f630d9a0 | 11 | // Y - [0..3] 8 bit rows |
medvdv | 0:6ac8f630d9a0 | 12 | // 512 byte total buffer size |
medvdv | 0:6ac8f630d9a0 | 13 | // |
medvdv | 0:6ac8f630d9a0 | 14 | |
medvdv | 5:ff31feb7d966 | 15 | #define LCD_X 128 // In pixels |
medvdv | 5:ff31feb7d966 | 16 | #define LCD_Y 4 // In rows by 8 pixels each |
medvdv | 5:ff31feb7d966 | 17 | #define LCD_SIZE 512 // In bytes, = LCD_X*LCD_Y |
medvdv | 1:17443d6d2740 | 18 | |
medvdv | 0:6ac8f630d9a0 | 19 | // |
medvdv | 0:6ac8f630d9a0 | 20 | // Proportional font |
medvdv | 0:6ac8f630d9a0 | 21 | // |
medvdv | 0:6ac8f630d9a0 | 22 | |
medvdv | 0:6ac8f630d9a0 | 23 | typedef struct { |
medvdv | 5:ff31feb7d966 | 24 | unsigned char first_code, glyphs_total; |
medvdv | 5:ff31feb7d966 | 25 | const unsigned char* widths; |
medvdv | 5:ff31feb7d966 | 26 | const unsigned char** glyphs; |
medvdv | 0:6ac8f630d9a0 | 27 | } lcd128font; |
medvdv | 0:6ac8f630d9a0 | 28 | |
medvdv | 1:17443d6d2740 | 29 | // |
medvdv | 1:17443d6d2740 | 30 | // Progress bar shape |
medvdv | 1:17443d6d2740 | 31 | // Drawed as BFFF...FFUU...UUUE |
medvdv | 1:17443d6d2740 | 32 | // B - Begin one |
medvdv | 1:17443d6d2740 | 33 | // F - Filled zone |
medvdv | 1:17443d6d2740 | 34 | // U - Empty zone |
medvdv | 1:17443d6d2740 | 35 | // E - End one |
medvdv | 1:17443d6d2740 | 36 | // |
medvdv | 1:17443d6d2740 | 37 | |
medvdv | 5:ff31feb7d966 | 38 | #define LCD_BAR_B 0x1c |
medvdv | 5:ff31feb7d966 | 39 | #define LCD_BAR_F 0x3e |
medvdv | 5:ff31feb7d966 | 40 | #define LCD_BAR_U 0x22 |
medvdv | 5:ff31feb7d966 | 41 | #define LCD_BAR_E 0x1c |
medvdv | 5:ff31feb7d966 | 42 | |
medvdv | 5:ff31feb7d966 | 43 | // |
medvdv | 5:ff31feb7d966 | 44 | // Special Glyphs for menu / interface |
medvdv | 5:ff31feb7d966 | 45 | // |
medvdv | 5:ff31feb7d966 | 46 | |
medvdv | 5:ff31feb7d966 | 47 | #define LCD_RADIO_OFF 128 |
medvdv | 5:ff31feb7d966 | 48 | #define LCD_RADIO_ON 129 |
medvdv | 6:5cd32671a837 | 49 | #define LCD_CHECK_OFF 130 |
medvdv | 6:5cd32671a837 | 50 | #define LCD_CHECK_ON 131 |
medvdv | 6:5cd32671a837 | 51 | #define LCD_SHORT_SPACE 132 |
medvdv | 6:5cd32671a837 | 52 | #define LCD_PLAY 133 |
medvdv | 6:5cd32671a837 | 53 | #define LCD_PAUSE 134 |
medvdv | 6:5cd32671a837 | 54 | #define LCD_FORWARD 135 |
medvdv | 6:5cd32671a837 | 55 | #define LCD_REVERSE 136 |
medvdv | 6:5cd32671a837 | 56 | #define LCD_BEGIN 137 |
medvdv | 6:5cd32671a837 | 57 | #define LCD_END 138 |
medvdv | 6:5cd32671a837 | 58 | #define LCD_PLAY_PAUSE 139 |
medvdv | 6:5cd32671a837 | 59 | #define LCD_CLOCK0 140 |
medvdv | 6:5cd32671a837 | 60 | #define LCD_CLOCK1 141 |
medvdv | 6:5cd32671a837 | 61 | #define LCD_CLOCK2 142 |
medvdv | 6:5cd32671a837 | 62 | #define LCD_CLOCK3 143 |
medvdv | 6:5cd32671a837 | 63 | #define LCD_CLOCK4 144 |
medvdv | 6:5cd32671a837 | 64 | #define LCD_CLOCK5 145 |
medvdv | 6:5cd32671a837 | 65 | #define LCD_CLOCK6 146 |
medvdv | 6:5cd32671a837 | 66 | #define LCD_CLOCK7 147 |
medvdv | 6:5cd32671a837 | 67 | |
medvdv | 6:5cd32671a837 | 68 | // |
medvdv | 6:5cd32671a837 | 69 | // Row text align |
medvdv | 6:5cd32671a837 | 70 | // |
medvdv | 6:5cd32671a837 | 71 | |
medvdv | 6:5cd32671a837 | 72 | #define LCD_ALIGN_LEFT 0 |
medvdv | 6:5cd32671a837 | 73 | #define LCD_ALIGN_CENTER 1 |
medvdv | 6:5cd32671a837 | 74 | #define LCD_ALIGN_RIGHT 2 |
medvdv | 1:17443d6d2740 | 75 | |
medvdv | 1:17443d6d2740 | 76 | // |
medvdv | 0:6ac8f630d9a0 | 77 | // lcd128 class |
medvdv | 0:6ac8f630d9a0 | 78 | // |
medvdv | 0:6ac8f630d9a0 | 79 | |
medvdv | 0:6ac8f630d9a0 | 80 | class lcd128 { |
medvdv | 0:6ac8f630d9a0 | 81 | |
medvdv | 0:6ac8f630d9a0 | 82 | // Interface with lcd |
medvdv | 0:6ac8f630d9a0 | 83 | SPI spi; |
medvdv | 0:6ac8f630d9a0 | 84 | DigitalOut rst, cs, a0; |
medvdv | 0:6ac8f630d9a0 | 85 | |
medvdv | 0:6ac8f630d9a0 | 86 | // Current font |
medvdv | 0:6ac8f630d9a0 | 87 | lcd128font font; |
medvdv | 0:6ac8f630d9a0 | 88 | |
medvdv | 1:17443d6d2740 | 89 | // Write options |
medvdv | 0:6ac8f630d9a0 | 90 | bool invert; |
medvdv | 0:6ac8f630d9a0 | 91 | bool bold; |
medvdv | 1:17443d6d2740 | 92 | bool underline; |
medvdv | 0:6ac8f630d9a0 | 93 | |
medvdv | 0:6ac8f630d9a0 | 94 | // buffer |
medvdv | 5:ff31feb7d966 | 95 | unsigned char buffer[LCD_SIZE]; |
medvdv | 0:6ac8f630d9a0 | 96 | |
medvdv | 0:6ac8f630d9a0 | 97 | // Cursor position |
medvdv | 0:6ac8f630d9a0 | 98 | int X, Y; |
medvdv | 0:6ac8f630d9a0 | 99 | |
medvdv | 4:1bd241d1fad0 | 100 | // SPI writer with data / command |
medvdv | 5:ff31feb7d966 | 101 | void write(unsigned char byte, bool cmd = false); |
medvdv | 0:6ac8f630d9a0 | 102 | |
medvdv | 0:6ac8f630d9a0 | 103 | public: |
medvdv | 0:6ac8f630d9a0 | 104 | |
medvdv | 0:6ac8f630d9a0 | 105 | // Supply LCD connected pin's here for your design |
medvdv | 6:5cd32671a837 | 106 | lcd128(PinName mosi = p5, PinName sclk = p7, PinName a0 = p8, PinName cs = p11, PinName rst = p6); |
medvdv | 0:6ac8f630d9a0 | 107 | |
medvdv | 0:6ac8f630d9a0 | 108 | // LCD control |
medvdv | 0:6ac8f630d9a0 | 109 | void Reset(); // Reset LCD, configure defaults |
medvdv | 0:6ac8f630d9a0 | 110 | void Power(bool power = true); // Power off / on |
medvdv | 0:6ac8f630d9a0 | 111 | void InverseMode(bool inverse = true); // Invert LCD off / on |
medvdv | 0:6ac8f630d9a0 | 112 | |
medvdv | 0:6ac8f630d9a0 | 113 | // Buffer -> LCD |
medvdv | 4:1bd241d1fad0 | 114 | void Update(); // Update LCD from buffer, actually shows drawed |
medvdv | 6:5cd32671a837 | 115 | |
medvdv | 6:5cd32671a837 | 116 | // All buffer operations |
medvdv | 3:c0e409cda493 | 117 | void Clear(int row = -1); // Clear all buffer or one concrete row |
medvdv | 6:5cd32671a837 | 118 | void InverseRow(int row = -1, unsigned char mask = 255); // Inverse all buffer or one concrete row |
medvdv | 0:6ac8f630d9a0 | 119 | |
medvdv | 0:6ac8f630d9a0 | 120 | // Write mode |
medvdv | 0:6ac8f630d9a0 | 121 | void Invert(bool invert = true); // Switch inverting of chars |
medvdv | 0:6ac8f630d9a0 | 122 | void Bold(bool bold = true); // Switch bold mode (repeat each char row twice) |
medvdv | 1:17443d6d2740 | 123 | void Underline(bool underline = true); // Switch underline mode (last pixel of row always on) |
medvdv | 0:6ac8f630d9a0 | 124 | |
medvdv | 0:6ac8f630d9a0 | 125 | // Cursor |
medvdv | 0:6ac8f630d9a0 | 126 | void XY(int x = 0, int y = 0); // Change write position X in pixels, Y in rows |
medvdv | 0:6ac8f630d9a0 | 127 | |
medvdv | 4:1bd241d1fad0 | 128 | // Vertical 8bit pixel row |
medvdv | 5:ff31feb7d966 | 129 | void Write(unsigned char byte); // One 8bit row |
medvdv | 5:ff31feb7d966 | 130 | void Write(unsigned char byte, int count); // One 8bit row * 'count' times |
medvdv | 5:ff31feb7d966 | 131 | void Write(unsigned char * data, int size); // 'size' 8bit rows |
medvdv | 5:ff31feb7d966 | 132 | void Write2(unsigned char * data, int size); // Bold: 'size' 8bit rows * 2 |
medvdv | 0:6ac8f630d9a0 | 133 | |
medvdv | 0:6ac8f630d9a0 | 134 | // Character drawing |
medvdv | 0:6ac8f630d9a0 | 135 | void Character(char chr); // Draw one font character (with invert and bold opt-s) |
medvdv | 0:6ac8f630d9a0 | 136 | // ! automaticaly does next line if char is wider then space left |
medvdv | 0:6ac8f630d9a0 | 137 | int CharacterWidth(char chr); // Calculate one character width (with bold opt-n) |
medvdv | 0:6ac8f630d9a0 | 138 | |
medvdv | 0:6ac8f630d9a0 | 139 | // String drawing |
medvdv | 0:6ac8f630d9a0 | 140 | void String(char* str); // Draw string proportionally |
medvdv | 0:6ac8f630d9a0 | 141 | int StringWidth(char* str); // Calculate string width in px |
medvdv | 0:6ac8f630d9a0 | 142 | |
medvdv | 6:5cd32671a837 | 143 | // Row drawer |
medvdv | 6:5cd32671a837 | 144 | void Row(int Y, char* str = "", bool inverse = false, int align = 0); // Clear one text row and draw string on it |
medvdv | 6:5cd32671a837 | 145 | |
medvdv | 6:5cd32671a837 | 146 | // Progress bar |
medvdv | 1:17443d6d2740 | 147 | void Bar(int width, float fill = 0.0); // Progress bar - one row, width pixels, fill - 0.0..1.0 |
medvdv | 0:6ac8f630d9a0 | 148 | }; |