Display text on LCD displays (even on multiple ones). Allow to create windows (frames) on display, and to combine them (split, add, duplicate, scroll). See http://mbed.org/users/hlipka/notebook/lcdwindow/ for more information.

Dependents:   Mbell

Committer:
hlipka
Date:
Tue Jan 04 22:10:41 2011 +0000
Revision:
6:7ba288afed38
Child:
7:b472970bd8f6
added initial driver for SED1335 based displays (text mode only, no fancy stuff, 320x240 pixels)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 6:7ba288afed38 1 /*
hlipka 6:7ba288afed38 2 * mbed LCDWindow library
hlipka 6:7ba288afed38 3 * Copyright (c) 2010 Hendrik Lipka
hlipka 6:7ba288afed38 4 *
hlipka 6:7ba288afed38 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
hlipka 6:7ba288afed38 6 * of this software and associated documentation files (the "Software"), to deal
hlipka 6:7ba288afed38 7 * in the Software without restriction, including without limitation the rights
hlipka 6:7ba288afed38 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
hlipka 6:7ba288afed38 9 * copies of the Software, and to permit persons to whom the Software is
hlipka 6:7ba288afed38 10 * furnished to do so, subject to the following conditions:
hlipka 6:7ba288afed38 11 *
hlipka 6:7ba288afed38 12 * The above copyright notice and this permission notice shall be included in
hlipka 6:7ba288afed38 13 * all copies or substantial portions of the Software.
hlipka 6:7ba288afed38 14 *
hlipka 6:7ba288afed38 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
hlipka 6:7ba288afed38 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
hlipka 6:7ba288afed38 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
hlipka 6:7ba288afed38 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
hlipka 6:7ba288afed38 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
hlipka 6:7ba288afed38 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
hlipka 6:7ba288afed38 21 * THE SOFTWARE.
hlipka 6:7ba288afed38 22 */
hlipka 6:7ba288afed38 23
hlipka 6:7ba288afed38 24 #include "sed1335text.h"
hlipka 6:7ba288afed38 25
hlipka 6:7ba288afed38 26 #include "BusOut.h"
hlipka 6:7ba288afed38 27 #include "DigitalOut.h"
hlipka 6:7ba288afed38 28 #include "wait_api.h"
hlipka 6:7ba288afed38 29
hlipka 6:7ba288afed38 30 void SED1335TextLCD::writeText(const unsigned int column, const unsigned int row, const char text[]) {
hlipka 6:7ba288afed38 31 int i=0;
hlipka 6:7ba288afed38 32
hlipka 6:7ba288afed38 33 int pos=row*getColumns()+column;
hlipka 6:7ba288afed38 34
hlipka 6:7ba288afed38 35 sendCmd(0x46); // set cursor addr
hlipka 6:7ba288afed38 36 sendData(pos&0xff);
hlipka 6:7ba288afed38 37 sendData((pos&0xff00)>>8);
hlipka 6:7ba288afed38 38
hlipka 6:7ba288afed38 39 sendCmd(0x42);
hlipka 6:7ba288afed38 40 while (text[i]!=0) {
hlipka 6:7ba288afed38 41 sendData(text[i]);
hlipka 6:7ba288afed38 42 i++;
hlipka 6:7ba288afed38 43 }
hlipka 6:7ba288afed38 44 }
hlipka 6:7ba288afed38 45
hlipka 6:7ba288afed38 46 void SED1335TextLCD::clear() {
hlipka 6:7ba288afed38 47 _guard->take();
hlipka 6:7ba288afed38 48
hlipka 6:7ba288afed38 49 ::printf("start clear\n");
hlipka 6:7ba288afed38 50 // first block
hlipka 6:7ba288afed38 51 sendCmd(0x46); // set cursor addr
hlipka 6:7ba288afed38 52 sendData(0x00); // start of RAM
hlipka 6:7ba288afed38 53 sendData(0x00);
hlipka 6:7ba288afed38 54 wait_ms(1);
hlipka 6:7ba288afed38 55
hlipka 6:7ba288afed38 56 sendCmd(0x42); // write to memory
hlipka 6:7ba288afed38 57 for (int i=0;i<40*30;i++)
hlipka 6:7ba288afed38 58 sendData(0x20); // send space
hlipka 6:7ba288afed38 59 wait_ms(1);
hlipka 6:7ba288afed38 60
hlipka 6:7ba288afed38 61 // second block
hlipka 6:7ba288afed38 62 sendCmd(0x46); // set cursor addr
hlipka 6:7ba288afed38 63 sendData(0x00); // start of RAM
hlipka 6:7ba288afed38 64 sendData(0x10);
hlipka 6:7ba288afed38 65 wait_ms(1);
hlipka 6:7ba288afed38 66
hlipka 6:7ba288afed38 67 sendCmd(0x42); // write to memory
hlipka 6:7ba288afed38 68 for (int i=0;i<40*30*8;i++)
hlipka 6:7ba288afed38 69 sendData(0x00); // send space
hlipka 6:7ba288afed38 70 wait_ms(1);
hlipka 6:7ba288afed38 71
hlipka 6:7ba288afed38 72 // third block
hlipka 6:7ba288afed38 73 sendCmd(0x46); // set cursor addr
hlipka 6:7ba288afed38 74 sendData(0x00); // start of RAM
hlipka 6:7ba288afed38 75 sendData(0x08);
hlipka 6:7ba288afed38 76 wait_ms(1);
hlipka 6:7ba288afed38 77
hlipka 6:7ba288afed38 78 sendCmd(0x42); // write to memory
hlipka 6:7ba288afed38 79 for (int i=0;i<40*30;i++)
hlipka 6:7ba288afed38 80 sendData(0x00); // send space
hlipka 6:7ba288afed38 81 wait_ms(1);
hlipka 6:7ba288afed38 82
hlipka 6:7ba288afed38 83 sendCmd(0x46); // set cursor addr
hlipka 6:7ba288afed38 84 sendData(0x00); // start of RAM
hlipka 6:7ba288afed38 85 sendData(0x00);
hlipka 6:7ba288afed38 86
hlipka 6:7ba288afed38 87 ::printf("end clear\n");
hlipka 6:7ba288afed38 88 _guard->release();
hlipka 6:7ba288afed38 89 }
hlipka 6:7ba288afed38 90
hlipka 6:7ba288afed38 91
hlipka 6:7ba288afed38 92 void SED1335TextLCD::character(int column, int row, int c){
hlipka 6:7ba288afed38 93 _guard->take();
hlipka 6:7ba288afed38 94 _guard->release();
hlipka 6:7ba288afed38 95 }
hlipka 6:7ba288afed38 96
hlipka 6:7ba288afed38 97 SED1335TextLCD::SED1335TextLCD
hlipka 6:7ba288afed38 98 (const unsigned int columns, const unsigned int rows, BusOut *data, const PinName read, const PinName write, const PinName cs, const PinName a0, const PinName reset)
hlipka 6:7ba288afed38 99 :TextLCDBase(columns, rows) {
hlipka 6:7ba288afed38 100 _data=data;
hlipka 6:7ba288afed38 101 _rd=new DigitalOut(read);
hlipka 6:7ba288afed38 102 _wr=new DigitalOut(write);
hlipka 6:7ba288afed38 103 _a0=new DigitalOut(a0);
hlipka 6:7ba288afed38 104 _cs=new DigitalOut(cs);
hlipka 6:7ba288afed38 105 _reset=new DigitalOut(reset);
hlipka 6:7ba288afed38 106 wait_ms(10);
hlipka 6:7ba288afed38 107 }
hlipka 6:7ba288afed38 108
hlipka 6:7ba288afed38 109 void SED1335TextLCD::init() {
hlipka 6:7ba288afed38 110 ::printf("reset");
hlipka 6:7ba288afed38 111 _reset->write(0);
hlipka 6:7ba288afed38 112 wait_ms(2);
hlipka 6:7ba288afed38 113 _reset->write(1);
hlipka 6:7ba288afed38 114 wait_ms(10);
hlipka 6:7ba288afed38 115 ::printf(" finished\n");
hlipka 6:7ba288afed38 116
hlipka 6:7ba288afed38 117 sendCmd(0x40); // SYSTEM SET
hlipka 6:7ba288afed38 118 sendData(0x30); // p1 set cg rom
hlipka 6:7ba288afed38 119 sendData(0x87); // p2
hlipka 6:7ba288afed38 120 sendData(0x7); // p3
hlipka 6:7ba288afed38 121 sendData(0x27); // p4
hlipka 6:7ba288afed38 122 sendData(0x2f); // p5
hlipka 6:7ba288afed38 123 sendData(0xef); // p6
hlipka 6:7ba288afed38 124 sendData(0x28); // p7
hlipka 6:7ba288afed38 125 sendData(0x0); // p8
hlipka 6:7ba288afed38 126 wait_ms(1);
hlipka 6:7ba288afed38 127
hlipka 6:7ba288afed38 128 sendCmd(0x44); // SCROLL
hlipka 6:7ba288afed38 129 sendData(0x00); // first block at 0
hlipka 6:7ba288afed38 130 sendData(0x00);
hlipka 6:7ba288afed38 131 sendData(0xf0); // 240 lines
hlipka 6:7ba288afed38 132 sendData(0x00); // second block at 0x1000
hlipka 6:7ba288afed38 133 sendData(0x10);
hlipka 6:7ba288afed38 134 sendData(0xf0); // 240 lines
hlipka 6:7ba288afed38 135 sendData(0x00); // third block at 0x800
hlipka 6:7ba288afed38 136 sendData(0x08);
hlipka 6:7ba288afed38 137 wait_ms(1);
hlipka 6:7ba288afed38 138
hlipka 6:7ba288afed38 139 sendCmd(0x5a); // HDOT SCR
hlipka 6:7ba288afed38 140 sendData(0x0);
hlipka 6:7ba288afed38 141
hlipka 6:7ba288afed38 142
hlipka 6:7ba288afed38 143 sendCmd(0x5b); // OVLAY
hlipka 6:7ba288afed38 144 sendData(0x01); // 2 layers, text, x-or
hlipka 6:7ba288afed38 145 wait_ms(1);
hlipka 6:7ba288afed38 146
hlipka 6:7ba288afed38 147 sendCmd(0x59); // DISP on
hlipka 6:7ba288afed38 148 sendData(0x54); // all layers on, cursor off
hlipka 6:7ba288afed38 149 // sendData(0x56); // all layers on, cursor flashing
hlipka 6:7ba288afed38 150 wait_ms(1);
hlipka 6:7ba288afed38 151
hlipka 6:7ba288afed38 152 clear();
hlipka 6:7ba288afed38 153
hlipka 6:7ba288afed38 154 sendCmd(0x5d); // CSR FORM
hlipka 6:7ba288afed38 155 sendData(0x04); // 8 pixels wide
hlipka 6:7ba288afed38 156 sendData(0x86); // 2 pixel high, block cursor
hlipka 6:7ba288afed38 157 wait_ms(1);
hlipka 6:7ba288afed38 158
hlipka 6:7ba288afed38 159 sendCmd(0x4c); // CSR DIR right
hlipka 6:7ba288afed38 160 wait_ms(1);
hlipka 6:7ba288afed38 161
hlipka 6:7ba288afed38 162 }
hlipka 6:7ba288afed38 163
hlipka 6:7ba288afed38 164 void SED1335TextLCD::sendCmd(const unsigned char cmd) {
hlipka 6:7ba288afed38 165 ::printf("c->%x\n",cmd);
hlipka 6:7ba288afed38 166 _rd->write(1);
hlipka 6:7ba288afed38 167 _wr->write(1);
hlipka 6:7ba288afed38 168 _a0->write(1);
hlipka 6:7ba288afed38 169 _cs->write(0);
hlipka 6:7ba288afed38 170 // address setup time is 0
hlipka 6:7ba288afed38 171 sendByte(cmd);
hlipka 6:7ba288afed38 172 wait_us(10);
hlipka 6:7ba288afed38 173 }
hlipka 6:7ba288afed38 174
hlipka 6:7ba288afed38 175 void SED1335TextLCD::sendData(const unsigned char cmd) {
hlipka 6:7ba288afed38 176 // ::printf("d");
hlipka 6:7ba288afed38 177 _rd->write(1);
hlipka 6:7ba288afed38 178 _wr->write(1);
hlipka 6:7ba288afed38 179 _a0->write(0);
hlipka 6:7ba288afed38 180 _cs->write(0);
hlipka 6:7ba288afed38 181 // address setup time is 0
hlipka 6:7ba288afed38 182 sendByte(cmd);
hlipka 6:7ba288afed38 183 wait_us(10);
hlipka 6:7ba288afed38 184 }
hlipka 6:7ba288afed38 185
hlipka 6:7ba288afed38 186 void SED1335TextLCD::sendByte(const unsigned char byte) {
hlipka 6:7ba288afed38 187 // ::printf("->%x\n",byte);
hlipka 6:7ba288afed38 188 // display reads with rising flank of /wr
hlipka 6:7ba288afed38 189 // first, set data, then set /wr low (no timing needed)
hlipka 6:7ba288afed38 190 _data->write(byte);
hlipka 6:7ba288afed38 191 _wr->write(0);
hlipka 6:7ba288afed38 192 // wait for setup
hlipka 6:7ba288afed38 193 wait_us(1);
hlipka 6:7ba288afed38 194 // set /wr back to high
hlipka 6:7ba288afed38 195 _wr->write(1);
hlipka 6:7ba288afed38 196 // address / data hold time is 10 / 5 ns, so its handled by executing normal code :)
hlipka 6:7ba288afed38 197 }