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 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 };