Lluis Nadal
/
Lcd_Custom_Char
Loads eight custom characters to LCD
main.cpp@0:639529b48adf, 2010-10-15 (annotated)
- Committer:
- lnadal
- Date:
- Fri Oct 15 19:14:01 2010 +0000
- Revision:
- 0:639529b48adf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lnadal | 0:639529b48adf | 1 | |
lnadal | 0:639529b48adf | 2 | /* Lcd_Custom_Char |
lnadal | 0:639529b48adf | 3 | |
lnadal | 0:639529b48adf | 4 | Author: Lluis Nadal. |
lnadal | 0:639529b48adf | 5 | Date: 15th October 2010. |
lnadal | 0:639529b48adf | 6 | |
lnadal | 0:639529b48adf | 7 | Up to 8 characters can be programmed in CGRAM, but because CGRAM is a RAM, characters are lost |
lnadal | 0:639529b48adf | 8 | on power off and must be reloaded on power on. |
lnadal | 0:639529b48adf | 9 | Assuming 2x16 LCD with HD44780 Hitachi controller compatible. |
lnadal | 0:639529b48adf | 10 | |
lnadal | 0:639529b48adf | 11 | */ |
lnadal | 0:639529b48adf | 12 | |
lnadal | 0:639529b48adf | 13 | #include "mbed.h" |
lnadal | 0:639529b48adf | 14 | #include "TextLCD.h" |
lnadal | 0:639529b48adf | 15 | |
lnadal | 0:639529b48adf | 16 | |
lnadal | 0:639529b48adf | 17 | // Defines LCD connections. |
lnadal | 0:639529b48adf | 18 | TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d4, d5, d6, d7 |
lnadal | 0:639529b48adf | 19 | |
lnadal | 0:639529b48adf | 20 | // Defines 8 custom characters. |
lnadal | 0:639529b48adf | 21 | char custom_char[8][8] = { |
lnadal | 0:639529b48adf | 22 | {0x07,0x08,0x1F,0x08,0x1F,0x08,0x07,0x00}, // Euro sign. |
lnadal | 0:639529b48adf | 23 | {0x00,0x0E,0x11,0x11,0x11,0x0A,0x1B,0x00}, // Ohm sign. |
lnadal | 0:639529b48adf | 24 | {0x00,0x00,0x00,0x12,0x12,0x12,0x1C,0x10}, // Micro sign. |
lnadal | 0:639529b48adf | 25 | {0x00,0x00,0x1F,0x0A,0x0A,0x0A,0x0A,0x00}, // Pi sign. |
lnadal | 0:639529b48adf | 26 | {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}, // Degree sign. |
lnadal | 0:639529b48adf | 27 | {0x0E,0x04,0x0E,0x15,0x015,0x0E,0x04,0x0E},// Phi sign. |
lnadal | 0:639529b48adf | 28 | {0x04,0x0E,0x15,0x04,0x04,0x04,0x04,0x04}, // Arrow up. |
lnadal | 0:639529b48adf | 29 | {0x04,0x04,0x04,0x04,0x04,0x15,0x0E,0x04} // Arrow down. |
lnadal | 0:639529b48adf | 30 | }; |
lnadal | 0:639529b48adf | 31 | |
lnadal | 0:639529b48adf | 32 | |
lnadal | 0:639529b48adf | 33 | // Defines LCD bus to write data. |
lnadal | 0:639529b48adf | 34 | BusOut Lcd_pins(p27, p28, p29, p30); // d4, d5, d6, d7 |
lnadal | 0:639529b48adf | 35 | |
lnadal | 0:639529b48adf | 36 | DigitalOut rs_pin(p24); // LCD pin rs (register select.) |
lnadal | 0:639529b48adf | 37 | DigitalOut e_pin(p26); // LCD pin e (enable). |
lnadal | 0:639529b48adf | 38 | |
lnadal | 0:639529b48adf | 39 | |
lnadal | 0:639529b48adf | 40 | // Because we use 4 bit LCD, data must be sent in two steps. |
lnadal | 0:639529b48adf | 41 | void writePort(int value) { |
lnadal | 0:639529b48adf | 42 | |
lnadal | 0:639529b48adf | 43 | Lcd_pins = value >> 4; // Shifts 4 bit right. |
lnadal | 0:639529b48adf | 44 | wait(0.000040f); // Wait 40us. |
lnadal | 0:639529b48adf | 45 | e_pin = 0; |
lnadal | 0:639529b48adf | 46 | wait(0.000040f); |
lnadal | 0:639529b48adf | 47 | e_pin = 1; |
lnadal | 0:639529b48adf | 48 | Lcd_pins = value; |
lnadal | 0:639529b48adf | 49 | wait(0.000040f); |
lnadal | 0:639529b48adf | 50 | e_pin = 0; |
lnadal | 0:639529b48adf | 51 | wait(0.000040f); |
lnadal | 0:639529b48adf | 52 | e_pin = 1; |
lnadal | 0:639529b48adf | 53 | } |
lnadal | 0:639529b48adf | 54 | |
lnadal | 0:639529b48adf | 55 | |
lnadal | 0:639529b48adf | 56 | |
lnadal | 0:639529b48adf | 57 | int main() { |
lnadal | 0:639529b48adf | 58 | |
lnadal | 0:639529b48adf | 59 | |
lnadal | 0:639529b48adf | 60 | lcd.cls(); |
lnadal | 0:639529b48adf | 61 | lcd.printf("Loading..."); |
lnadal | 0:639529b48adf | 62 | wait(2); |
lnadal | 0:639529b48adf | 63 | |
lnadal | 0:639529b48adf | 64 | |
lnadal | 0:639529b48adf | 65 | for (int j=0; j<8; j++) { |
lnadal | 0:639529b48adf | 66 | |
lnadal | 0:639529b48adf | 67 | rs_pin = 0; // We send a command. |
lnadal | 0:639529b48adf | 68 | |
lnadal | 0:639529b48adf | 69 | /* 0X40 is the initial CGRAM address. Because each character needs a total amount of 8 memory |
lnadal | 0:639529b48adf | 70 | locations, we increment addres in 8 units after each character. |
lnadal | 0:639529b48adf | 71 | */ |
lnadal | 0:639529b48adf | 72 | writePort(0x40+8*j); |
lnadal | 0:639529b48adf | 73 | |
lnadal | 0:639529b48adf | 74 | |
lnadal | 0:639529b48adf | 75 | // Writes data. |
lnadal | 0:639529b48adf | 76 | rs_pin = 1; // We send data. |
lnadal | 0:639529b48adf | 77 | |
lnadal | 0:639529b48adf | 78 | |
lnadal | 0:639529b48adf | 79 | for (int i=0; i<8; i++) { |
lnadal | 0:639529b48adf | 80 | writePort(custom_char[j][i]); |
lnadal | 0:639529b48adf | 81 | } |
lnadal | 0:639529b48adf | 82 | } |
lnadal | 0:639529b48adf | 83 | |
lnadal | 0:639529b48adf | 84 | |
lnadal | 0:639529b48adf | 85 | |
lnadal | 0:639529b48adf | 86 | lcd.cls(); |
lnadal | 0:639529b48adf | 87 | wait(0.010); |
lnadal | 0:639529b48adf | 88 | |
lnadal | 0:639529b48adf | 89 | lcd.printf("Custom character"); |
lnadal | 0:639529b48adf | 90 | lcd.locate(0,1); |
lnadal | 0:639529b48adf | 91 | |
lnadal | 0:639529b48adf | 92 | // Prints loaded custom characters. ASCII codes 0 to 7. |
lnadal | 0:639529b48adf | 93 | for (int j=0; j<8; j++) { |
lnadal | 0:639529b48adf | 94 | lcd.putc(j); |
lnadal | 0:639529b48adf | 95 | } |
lnadal | 0:639529b48adf | 96 | |
lnadal | 0:639529b48adf | 97 | } |