Class for driving the ST7066U controller in Crystalfontz LCD display CFAH1602B-YYH-JT
ST7066U.h@0:7b026bd883f8, 2012-07-10 (annotated)
- Committer:
- lawless
- Date:
- Tue Jul 10 19:40:35 2012 +0000
- Revision:
- 0:7b026bd883f8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lawless | 0:7b026bd883f8 | 1 | |
lawless | 0:7b026bd883f8 | 2 | class ST7066U { |
lawless | 0:7b026bd883f8 | 3 | |
lawless | 0:7b026bd883f8 | 4 | private : |
lawless | 0:7b026bd883f8 | 5 | DigitalOut *rs, *rw, *e, *db0, *db1, *db2, *db3, *db4, *db5, *db6, *db7; |
lawless | 0:7b026bd883f8 | 6 | uint8_t lines_bit, font_bit; |
lawless | 0:7b026bd883f8 | 7 | |
lawless | 0:7b026bd883f8 | 8 | public : |
lawless | 0:7b026bd883f8 | 9 | ST7066U () { |
lawless | 0:7b026bd883f8 | 10 | rs = new DigitalOut(p5); |
lawless | 0:7b026bd883f8 | 11 | rw = new DigitalOut(p6); |
lawless | 0:7b026bd883f8 | 12 | e = new DigitalOut(p7); |
lawless | 0:7b026bd883f8 | 13 | db0 = new DigitalOut(p8); |
lawless | 0:7b026bd883f8 | 14 | db1 = new DigitalOut(p9); |
lawless | 0:7b026bd883f8 | 15 | db2 = new DigitalOut(p10); |
lawless | 0:7b026bd883f8 | 16 | db3 = new DigitalOut(p11); |
lawless | 0:7b026bd883f8 | 17 | db4 = new DigitalOut(p12); |
lawless | 0:7b026bd883f8 | 18 | db5 = new DigitalOut(p13); |
lawless | 0:7b026bd883f8 | 19 | db6 = new DigitalOut(p14); |
lawless | 0:7b026bd883f8 | 20 | db7 = new DigitalOut(p15); |
lawless | 0:7b026bd883f8 | 21 | |
lawless | 0:7b026bd883f8 | 22 | font_bit = 0; |
lawless | 0:7b026bd883f8 | 23 | lines_bit = 0; |
lawless | 0:7b026bd883f8 | 24 | |
lawless | 0:7b026bd883f8 | 25 | wait(0.040); // LCD initialisation takes 40ms. |
lawless | 0:7b026bd883f8 | 26 | } |
lawless | 0:7b026bd883f8 | 27 | |
lawless | 0:7b026bd883f8 | 28 | void rows(int l) { |
lawless | 0:7b026bd883f8 | 29 | if(l == 1) |
lawless | 0:7b026bd883f8 | 30 | lines_bit = 0; |
lawless | 0:7b026bd883f8 | 31 | else if (l == 2) |
lawless | 0:7b026bd883f8 | 32 | lines_bit = 8; |
lawless | 0:7b026bd883f8 | 33 | |
lawless | 0:7b026bd883f8 | 34 | instruction(32 | 16 | lines_bit | font_bit); |
lawless | 0:7b026bd883f8 | 35 | } |
lawless | 0:7b026bd883f8 | 36 | |
lawless | 0:7b026bd883f8 | 37 | void font(int f) { |
lawless | 0:7b026bd883f8 | 38 | if(f == 0) |
lawless | 0:7b026bd883f8 | 39 | font_bit = 0; |
lawless | 0:7b026bd883f8 | 40 | else if (f == 1) |
lawless | 0:7b026bd883f8 | 41 | font_bit = 4; |
lawless | 0:7b026bd883f8 | 42 | |
lawless | 0:7b026bd883f8 | 43 | instruction(32 | 16 | lines_bit | font_bit); |
lawless | 0:7b026bd883f8 | 44 | } |
lawless | 0:7b026bd883f8 | 45 | |
lawless | 0:7b026bd883f8 | 46 | |
lawless | 0:7b026bd883f8 | 47 | void write(int c, int nrs) { |
lawless | 0:7b026bd883f8 | 48 | int old_rs = rs->read(); |
lawless | 0:7b026bd883f8 | 49 | // Should check Busy Flag here. |
lawless | 0:7b026bd883f8 | 50 | rs->write(nrs); |
lawless | 0:7b026bd883f8 | 51 | e->write(1); // E must be on for min 480ns then drop to zero. Trigger is on falling signal. |
lawless | 0:7b026bd883f8 | 52 | db0->write(c & 1); |
lawless | 0:7b026bd883f8 | 53 | db1->write(c>>1 & 1); |
lawless | 0:7b026bd883f8 | 54 | db2->write(c>>2 & 1); |
lawless | 0:7b026bd883f8 | 55 | db3->write(c>>3 & 1); |
lawless | 0:7b026bd883f8 | 56 | db4->write(c>>4 & 1); |
lawless | 0:7b026bd883f8 | 57 | db5->write(c>>5 & 1); |
lawless | 0:7b026bd883f8 | 58 | db6->write(c>>6 & 1); |
lawless | 0:7b026bd883f8 | 59 | db7->write(c>>7 & 1); |
lawless | 0:7b026bd883f8 | 60 | |
lawless | 0:7b026bd883f8 | 61 | // added extra wait state |
lawless | 0:7b026bd883f8 | 62 | wait(0.000001); // Needed the equivalent of this on the Raspberry Pi. |
lawless | 0:7b026bd883f8 | 63 | |
lawless | 0:7b026bd883f8 | 64 | // Tdsw Data Setup Width time at least 80ns. No need for delay on slow processor. |
lawless | 0:7b026bd883f8 | 65 | e->write(0); // = 0; // Strobe. |
lawless | 0:7b026bd883f8 | 66 | // Th Data Hold time at least 10ns. No need for delay on slow processor. |
lawless | 0:7b026bd883f8 | 67 | wait(0.000037); // Most instructions take 37us. May not need this delay if Busy Flag checked at top. |
lawless | 0:7b026bd883f8 | 68 | rs->write(old_rs); |
lawless | 0:7b026bd883f8 | 69 | } |
lawless | 0:7b026bd883f8 | 70 | |
lawless | 0:7b026bd883f8 | 71 | void data(uint8_t c) { |
lawless | 0:7b026bd883f8 | 72 | write(c, 1); |
lawless | 0:7b026bd883f8 | 73 | } |
lawless | 0:7b026bd883f8 | 74 | void instruction(uint8_t c) { |
lawless | 0:7b026bd883f8 | 75 | write(c, 0); |
lawless | 0:7b026bd883f8 | 76 | } |
lawless | 0:7b026bd883f8 | 77 | |
lawless | 0:7b026bd883f8 | 78 | void clear(void) { |
lawless | 0:7b026bd883f8 | 79 | instruction(1); |
lawless | 0:7b026bd883f8 | 80 | wait(0.00152); // clear takes 1.52 ms. |
lawless | 0:7b026bd883f8 | 81 | } |
lawless | 0:7b026bd883f8 | 82 | void home(void) { |
lawless | 0:7b026bd883f8 | 83 | instruction(2); |
lawless | 0:7b026bd883f8 | 84 | wait(0.00152); // home takes 1.52 ms. |
lawless | 0:7b026bd883f8 | 85 | } |
lawless | 0:7b026bd883f8 | 86 | |
lawless | 0:7b026bd883f8 | 87 | void str_at(const char *str, uint8_t x = 0, uint8_t y = 0) { |
lawless | 0:7b026bd883f8 | 88 | uint8_t *c = (uint8_t *) str; |
lawless | 0:7b026bd883f8 | 89 | ddram(y * 0x40 + x); |
lawless | 0:7b026bd883f8 | 90 | for (uint8_t i = 0; i < 80 && (*c); i++) { // Will never write more than 80 chars. |
lawless | 0:7b026bd883f8 | 91 | data(*c); |
lawless | 0:7b026bd883f8 | 92 | c++; |
lawless | 0:7b026bd883f8 | 93 | } |
lawless | 0:7b026bd883f8 | 94 | } |
lawless | 0:7b026bd883f8 | 95 | |
lawless | 0:7b026bd883f8 | 96 | void row0(const char *str, uint8_t x = 0) { |
lawless | 0:7b026bd883f8 | 97 | str_at(str, x, 0); |
lawless | 0:7b026bd883f8 | 98 | } |
lawless | 0:7b026bd883f8 | 99 | |
lawless | 0:7b026bd883f8 | 100 | void row1(const char *str, uint8_t x = 0) { |
lawless | 0:7b026bd883f8 | 101 | str_at(str, x, 1); |
lawless | 0:7b026bd883f8 | 102 | } |
lawless | 0:7b026bd883f8 | 103 | |
lawless | 0:7b026bd883f8 | 104 | void str(const char *str) { |
lawless | 0:7b026bd883f8 | 105 | str_at(str); |
lawless | 0:7b026bd883f8 | 106 | } |
lawless | 0:7b026bd883f8 | 107 | |
lawless | 0:7b026bd883f8 | 108 | void on() { |
lawless | 0:7b026bd883f8 | 109 | instruction(0x0C); // 0000 1DCB Display=1 Cursor=0 Blink=0 |
lawless | 0:7b026bd883f8 | 110 | |
lawless | 0:7b026bd883f8 | 111 | } |
lawless | 0:7b026bd883f8 | 112 | |
lawless | 0:7b026bd883f8 | 113 | void off() { |
lawless | 0:7b026bd883f8 | 114 | instruction(0x08); // 0000 1DCB Display=0 Cursor=0 Blink=0 |
lawless | 0:7b026bd883f8 | 115 | } |
lawless | 0:7b026bd883f8 | 116 | |
lawless | 0:7b026bd883f8 | 117 | void cgram(uint8_t a) { |
lawless | 0:7b026bd883f8 | 118 | instruction(0x40 | a); |
lawless | 0:7b026bd883f8 | 119 | } |
lawless | 0:7b026bd883f8 | 120 | |
lawless | 0:7b026bd883f8 | 121 | void ddram(uint8_t a) { |
lawless | 0:7b026bd883f8 | 122 | instruction(0x80 | a); |
lawless | 0:7b026bd883f8 | 123 | } |
lawless | 0:7b026bd883f8 | 124 | |
lawless | 0:7b026bd883f8 | 125 | }; |
lawless | 0:7b026bd883f8 | 126 | /* |
lawless | 0:7b026bd883f8 | 127 | Crystalfontz CFAH1602BTMIJT 16x2 LCD display. |
lawless | 0:7b026bd883f8 | 128 | http://www.coolcomponents.co.uk/catalog/blue-16x2-display-p-151.html (also part of mbed starter kit). |
lawless | 0:7b026bd883f8 | 129 | |
lawless | 0:7b026bd883f8 | 130 | Sitronix ST7066U functions (compatible with Hitachi HD44780). |
lawless | 0:7b026bd883f8 | 131 | CFAH1602BTMIJT_v1.0.pdf |
lawless | 0:7b026bd883f8 | 132 | http://www.crystalfontz.com/controllers/ST7066U.pdf |
lawless | 0:7b026bd883f8 | 133 | |
lawless | 0:7b026bd883f8 | 134 | LCD initialisation takes 40ms. |
lawless | 0:7b026bd883f8 | 135 | |
lawless | 0:7b026bd883f8 | 136 | Instruction RS RW 7 6 5 4 3 2 1 0 Time (270kHz) |
lawless | 0:7b026bd883f8 | 137 | Clear Display 0 0 0 0 0 0 0 0 0 1 1.52 ms Clear, Home, Entry Mode = Increment. |
lawless | 0:7b026bd883f8 | 138 | Return Home 0 0 0 0 0 0 0 0 1 x 1.52 ms. |
lawless | 0:7b026bd883f8 | 139 | Entry Mode Set 0 0 0 0 0 0 0 1 I S .037ms Increment cursor, Shift display (shift cursor). |
lawless | 0:7b026bd883f8 | 140 | Display On/Off 0 0 0 0 0 0 1 D C P .037ms Display on, Cursor on, Position on. |
lawless | 0:7b026bd883f8 | 141 | Cursor or Display Shift 0 0 0 0 0 1 D R x x .037ms Display shift (cursor shift), Right (left). |
lawless | 0:7b026bd883f8 | 142 | Function Set 0 0 0 0 1 D N F x x .037ms Data interface 8 (4) bits, Number of lines 2 (1), Font 5x11 if 1 line (5x8). |
lawless | 0:7b026bd883f8 | 143 | Set CGRAM address 0 0 0 1 A A A A A A .037ms Set 6 bit CGRAM address in address counter. |
lawless | 0:7b026bd883f8 | 144 | Set DDRAM address 0 0 1 A A A A A A A .037ms Set 7 bit DDRAM address in address counter. |
lawless | 0:7b026bd883f8 | 145 | Read Busy Flag and addr 0 1 F A A A A A A A .000ms Read Busy Flag and address counter. |
lawless | 0:7b026bd883f8 | 146 | Write data to RAM 1 0 A A A A A A A A .037ms Write data to RAM (DDRAM or CGRAM). Must do Set address first. |
lawless | 0:7b026bd883f8 | 147 | Read data from RAM 1 1 A A A A A A A A .037ms Read data from internal RAM (DDRAM or CGRAM). Must do Set address first. |
lawless | 0:7b026bd883f8 | 148 | */ |