Class for driving the ST7066U controller in Crystalfontz LCD display CFAH1602B-YYH-JT

Committer:
lawless
Date:
Tue Jul 10 19:40:35 2012 +0000
Revision:
0:7b026bd883f8

        

Who changed what in which revision?

UserRevisionLine numberNew 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 */