SG12864A

Dependents:   SG12864A_TestProgram

Committer:
shintamainjp
Date:
Tue Jul 20 03:59:17 2010 +0000
Revision:
1:aacd73a4e7ee
Parent:
0:238f2d048222
Child:
2:91c03e41c927

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:238f2d048222 1 /**
shintamainjp 0:238f2d048222 2 * SG12864A Graphics LCD module driver class (Version 0.0.1)
shintamainjp 0:238f2d048222 3 *
shintamainjp 0:238f2d048222 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:238f2d048222 5 * http://shinta.main.jp/
shintamainjp 0:238f2d048222 6 */
shintamainjp 0:238f2d048222 7
shintamainjp 0:238f2d048222 8 #include "SG12864A.h"
shintamainjp 0:238f2d048222 9
shintamainjp 1:aacd73a4e7ee 10 #define setPixel(x,y) buffer[((COLUMNS * 2)* (y / 8)) + x] |= (1 << (y % 8))
shintamainjp 1:aacd73a4e7ee 11 #define unsetPixel(x,y) buffer[((COLUMNS * 2)* (y / 8)) + x] &= ~(1 << (y % 8))
shintamainjp 1:aacd73a4e7ee 12 #define swap(a,b) {int c=a;a=b;b=c;}
shintamainjp 1:aacd73a4e7ee 13
shintamainjp 0:238f2d048222 14 SG12864A::SG12864A(PinName di,
shintamainjp 0:238f2d048222 15 PinName rw,
shintamainjp 0:238f2d048222 16 PinName en,
shintamainjp 0:238f2d048222 17 PinName db0,
shintamainjp 0:238f2d048222 18 PinName db1,
shintamainjp 0:238f2d048222 19 PinName db2,
shintamainjp 0:238f2d048222 20 PinName db3,
shintamainjp 0:238f2d048222 21 PinName db4,
shintamainjp 0:238f2d048222 22 PinName db5,
shintamainjp 0:238f2d048222 23 PinName db6,
shintamainjp 0:238f2d048222 24 PinName db7,
shintamainjp 0:238f2d048222 25 PinName cs1,
shintamainjp 0:238f2d048222 26 PinName cs2,
shintamainjp 0:238f2d048222 27 PinName res)
shintamainjp 0:238f2d048222 28 :
shintamainjp 0:238f2d048222 29 ioDI(di),
shintamainjp 0:238f2d048222 30 ioRW(rw),
shintamainjp 0:238f2d048222 31 ioEN(en),
shintamainjp 0:238f2d048222 32 ioDB(db0, db1, db2, db3, db4, db5, db6, db7),
shintamainjp 0:238f2d048222 33 ioCS1(cs1),
shintamainjp 0:238f2d048222 34 ioCS2(cs2),
shintamainjp 0:238f2d048222 35 ioRES(res) {
shintamainjp 1:aacd73a4e7ee 36 bufferClear();
shintamainjp 0:238f2d048222 37 setDirectionToWrite();
shintamainjp 0:238f2d048222 38 }
shintamainjp 0:238f2d048222 39
shintamainjp 0:238f2d048222 40 SG12864A::~SG12864A() {
shintamainjp 0:238f2d048222 41 }
shintamainjp 0:238f2d048222 42
shintamainjp 1:aacd73a4e7ee 43 void SG12864A::bufferPush(void) {
shintamainjp 1:aacd73a4e7ee 44 for (uint8_t i = 0; i < PAGES; i++) {
shintamainjp 1:aacd73a4e7ee 45 // CS1
shintamainjp 1:aacd73a4e7ee 46 setPageAddress(SG12864A::CS1, i);
shintamainjp 1:aacd73a4e7ee 47 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 1:aacd73a4e7ee 48 for (uint8_t j = 0; j < COLUMNS; j++) {
shintamainjp 1:aacd73a4e7ee 49 writeData(CS1, buffer[0 + ((COLUMNS * 2) * i) + j]);
shintamainjp 1:aacd73a4e7ee 50 }
shintamainjp 1:aacd73a4e7ee 51 // CS2
shintamainjp 1:aacd73a4e7ee 52 setPageAddress(SG12864A::CS2, i);
shintamainjp 1:aacd73a4e7ee 53 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 1:aacd73a4e7ee 54 for (uint8_t j = 0; j < COLUMNS; j++) {
shintamainjp 1:aacd73a4e7ee 55 writeData(CS2, buffer[COLUMNS + ((COLUMNS * 2) * i) + j]);
shintamainjp 1:aacd73a4e7ee 56 }
shintamainjp 1:aacd73a4e7ee 57 }
shintamainjp 1:aacd73a4e7ee 58 }
shintamainjp 1:aacd73a4e7ee 59
shintamainjp 1:aacd73a4e7ee 60 void SG12864A::bufferPull(void) {
shintamainjp 1:aacd73a4e7ee 61 }
shintamainjp 1:aacd73a4e7ee 62
shintamainjp 1:aacd73a4e7ee 63 void SG12864A::bufferClear(void) {
shintamainjp 1:aacd73a4e7ee 64 for (int i = 0; i < sizeof(buffer); i++) {
shintamainjp 1:aacd73a4e7ee 65 buffer[i] = 0x00;
shintamainjp 1:aacd73a4e7ee 66 }
shintamainjp 1:aacd73a4e7ee 67 }
shintamainjp 1:aacd73a4e7ee 68
shintamainjp 1:aacd73a4e7ee 69 void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
shintamainjp 1:aacd73a4e7ee 70 /*
shintamainjp 1:aacd73a4e7ee 71 * Bresenham's line algorithm
shintamainjp 1:aacd73a4e7ee 72 */
shintamainjp 1:aacd73a4e7ee 73 bool steep = abs(y2 - y1) > abs(x2 - x1);
shintamainjp 1:aacd73a4e7ee 74 if (steep) {
shintamainjp 1:aacd73a4e7ee 75 swap(x1, y1);
shintamainjp 1:aacd73a4e7ee 76 swap(x2, y2);
shintamainjp 1:aacd73a4e7ee 77 }
shintamainjp 1:aacd73a4e7ee 78 if (x1 > x2) {
shintamainjp 1:aacd73a4e7ee 79 swap(x1, x2);
shintamainjp 1:aacd73a4e7ee 80 swap(y1, y2);
shintamainjp 1:aacd73a4e7ee 81 }
shintamainjp 1:aacd73a4e7ee 82 int deltax = x2 - x1;
shintamainjp 1:aacd73a4e7ee 83 int deltay = abs(y2 - y1);
shintamainjp 1:aacd73a4e7ee 84 int error = deltax / 2;
shintamainjp 1:aacd73a4e7ee 85 int ystep;
shintamainjp 1:aacd73a4e7ee 86 int y = y1;
shintamainjp 1:aacd73a4e7ee 87 if (y1 < y2) {
shintamainjp 1:aacd73a4e7ee 88 ystep = 1;
shintamainjp 1:aacd73a4e7ee 89 } else {
shintamainjp 1:aacd73a4e7ee 90 ystep = -1;
shintamainjp 1:aacd73a4e7ee 91 }
shintamainjp 1:aacd73a4e7ee 92 for (int x = x1; x <= x2; x++) {
shintamainjp 1:aacd73a4e7ee 93 if (steep) {
shintamainjp 1:aacd73a4e7ee 94 setPixel(y,x);
shintamainjp 1:aacd73a4e7ee 95 } else {
shintamainjp 1:aacd73a4e7ee 96 setPixel(x,y);
shintamainjp 1:aacd73a4e7ee 97 }
shintamainjp 1:aacd73a4e7ee 98 error = error - deltay;
shintamainjp 1:aacd73a4e7ee 99 if (error < 0) {
shintamainjp 1:aacd73a4e7ee 100 y = y + ystep;
shintamainjp 1:aacd73a4e7ee 101 error = error + deltax;
shintamainjp 1:aacd73a4e7ee 102 }
shintamainjp 1:aacd73a4e7ee 103 }
shintamainjp 1:aacd73a4e7ee 104 }
shintamainjp 1:aacd73a4e7ee 105
shintamainjp 1:aacd73a4e7ee 106 void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
shintamainjp 1:aacd73a4e7ee 107 for (int x = x1; x <= x2; x++) {
shintamainjp 1:aacd73a4e7ee 108 setPixel(x, y1);
shintamainjp 1:aacd73a4e7ee 109 setPixel(x, y2);
shintamainjp 1:aacd73a4e7ee 110 }
shintamainjp 1:aacd73a4e7ee 111 for (int y = y1; y <= y2; y++) {
shintamainjp 1:aacd73a4e7ee 112 setPixel(x1, y);
shintamainjp 1:aacd73a4e7ee 113 setPixel(x2, y);
shintamainjp 1:aacd73a4e7ee 114 }
shintamainjp 1:aacd73a4e7ee 115 }
shintamainjp 1:aacd73a4e7ee 116
shintamainjp 1:aacd73a4e7ee 117 void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
shintamainjp 1:aacd73a4e7ee 118 for (int x = x1; x <= x2; x++) {
shintamainjp 1:aacd73a4e7ee 119 for (int y = y1; y <= y2; y++) {
shintamainjp 1:aacd73a4e7ee 120 setPixel(x, y);
shintamainjp 1:aacd73a4e7ee 121 }
shintamainjp 1:aacd73a4e7ee 122 }
shintamainjp 1:aacd73a4e7ee 123 }
shintamainjp 1:aacd73a4e7ee 124
shintamainjp 0:238f2d048222 125 /**
shintamainjp 0:238f2d048222 126 * High Level Interface.
shintamainjp 0:238f2d048222 127 *
shintamainjp 0:238f2d048222 128 * Reset display module.
shintamainjp 0:238f2d048222 129 */
shintamainjp 0:238f2d048222 130 void SG12864A::reset(void) {
shintamainjp 0:238f2d048222 131 reset(true);
shintamainjp 0:238f2d048222 132 wait_ms(200);
shintamainjp 0:238f2d048222 133 reset(false);
shintamainjp 0:238f2d048222 134 wait_ms(200);
shintamainjp 0:238f2d048222 135
shintamainjp 0:238f2d048222 136 setDisplayOnOff(SG12864A::CS1, true);
shintamainjp 0:238f2d048222 137 setDisplayOnOff(SG12864A::CS2, true);
shintamainjp 0:238f2d048222 138 setDisplayStartLine(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 139 setDisplayStartLine(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 140 setPageAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 141 setPageAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 142 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 143 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 144 }
shintamainjp 0:238f2d048222 145
shintamainjp 0:238f2d048222 146 /**
shintamainjp 0:238f2d048222 147 * High Level Interface.
shintamainjp 0:238f2d048222 148 *
shintamainjp 0:238f2d048222 149 * Clear display module.
shintamainjp 0:238f2d048222 150 */
shintamainjp 0:238f2d048222 151 void SG12864A::clear(void) {
shintamainjp 0:238f2d048222 152 for (uint8_t page = 0; page < PAGES; page++) {
shintamainjp 0:238f2d048222 153 for (uint8_t column = 0; column < COLUMNS; column++) {
shintamainjp 0:238f2d048222 154 // CS1
shintamainjp 0:238f2d048222 155 setPageAddress(SG12864A::CS1, page);
shintamainjp 0:238f2d048222 156 setColumnAddress(SG12864A::CS1, column);
shintamainjp 0:238f2d048222 157 writeData(CS1, 0x00);
shintamainjp 0:238f2d048222 158 // CS2
shintamainjp 0:238f2d048222 159 setPageAddress(SG12864A::CS2, page);
shintamainjp 0:238f2d048222 160 setColumnAddress(SG12864A::CS2, column);
shintamainjp 0:238f2d048222 161 writeData(CS2, 0x00);
shintamainjp 0:238f2d048222 162 }
shintamainjp 0:238f2d048222 163 }
shintamainjp 0:238f2d048222 164 // CS1
shintamainjp 0:238f2d048222 165 setPageAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 166 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 167 writeData(CS1, 0x00);
shintamainjp 0:238f2d048222 168 // CS2
shintamainjp 0:238f2d048222 169 setPageAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 170 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 171 writeData(CS2, 0x00);
shintamainjp 0:238f2d048222 172 }
shintamainjp 0:238f2d048222 173
shintamainjp 0:238f2d048222 174 /**
shintamainjp 0:238f2d048222 175 * Middle Level Interface.
shintamainjp 0:238f2d048222 176 *
shintamainjp 0:238f2d048222 177 * Set display on/off.
shintamainjp 0:238f2d048222 178 *
shintamainjp 0:238f2d048222 179 * @param t Target (CS1, CS2).
shintamainjp 0:238f2d048222 180 * @param on ON/OFF (true, false).
shintamainjp 0:238f2d048222 181 */
shintamainjp 0:238f2d048222 182 void SG12864A::setDisplayOnOff(Target t, bool on) {
shintamainjp 0:238f2d048222 183 setDirectionToWrite();
shintamainjp 0:238f2d048222 184 uint8_t c = 0x3e | (on ? 0x01 : 0x00);
shintamainjp 0:238f2d048222 185 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 186 wait_us(1);
shintamainjp 0:238f2d048222 187 }
shintamainjp 0:238f2d048222 188
shintamainjp 0:238f2d048222 189 /**
shintamainjp 0:238f2d048222 190 * Middle Level Interface.
shintamainjp 0:238f2d048222 191 *
shintamainjp 0:238f2d048222 192 * Set display start line.
shintamainjp 0:238f2d048222 193 *
shintamainjp 0:238f2d048222 194 * @param t Target (CS1, CS2).
shintamainjp 0:238f2d048222 195 * @param addr Display start line (0-63).
shintamainjp 0:238f2d048222 196 */
shintamainjp 0:238f2d048222 197 void SG12864A::setDisplayStartLine(Target t, uint8_t addr) {
shintamainjp 0:238f2d048222 198 setDirectionToWrite();
shintamainjp 0:238f2d048222 199 uint8_t c = 0xc0 | (addr & 0x3f);
shintamainjp 0:238f2d048222 200 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 201 wait_us(1);
shintamainjp 0:238f2d048222 202 }
shintamainjp 0:238f2d048222 203
shintamainjp 0:238f2d048222 204 /**
shintamainjp 0:238f2d048222 205 * Middle Level Interface.
shintamainjp 0:238f2d048222 206 *
shintamainjp 0:238f2d048222 207 * Set page address.
shintamainjp 0:238f2d048222 208 *
shintamainjp 0:238f2d048222 209 * @param t Target (CS1, CS2).
shintamainjp 0:238f2d048222 210 * @param addr Page address(0-7).
shintamainjp 0:238f2d048222 211 */
shintamainjp 0:238f2d048222 212 void SG12864A::setPageAddress(Target t, uint8_t addr) {
shintamainjp 0:238f2d048222 213 setDirectionToWrite();
shintamainjp 0:238f2d048222 214 uint8_t c = 0xb8 | (addr & 0x07);
shintamainjp 0:238f2d048222 215 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 216 wait_us(1);
shintamainjp 0:238f2d048222 217 }
shintamainjp 0:238f2d048222 218
shintamainjp 0:238f2d048222 219 /**
shintamainjp 0:238f2d048222 220 * Middle Level Interface.
shintamainjp 0:238f2d048222 221 *
shintamainjp 0:238f2d048222 222 * Set column address.
shintamainjp 0:238f2d048222 223 *
shintamainjp 0:238f2d048222 224 * @param t Target. (CS1, CS2)
shintamainjp 0:238f2d048222 225 * @param addr Column address (0-63).
shintamainjp 0:238f2d048222 226 */
shintamainjp 0:238f2d048222 227 void SG12864A::setColumnAddress(Target t, uint8_t addr) {
shintamainjp 0:238f2d048222 228 setDirectionToWrite();
shintamainjp 0:238f2d048222 229 uint8_t c = 0x40 | (addr & 0x3f);
shintamainjp 0:238f2d048222 230 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 231 wait_us(1);
shintamainjp 0:238f2d048222 232 }
shintamainjp 0:238f2d048222 233
shintamainjp 0:238f2d048222 234 /**
shintamainjp 0:238f2d048222 235 * Middle Level Interface.
shintamainjp 0:238f2d048222 236 */
shintamainjp 0:238f2d048222 237 void SG12864A::readStatus(Target t, uint8_t *c) {
shintamainjp 0:238f2d048222 238 setDirectionToRead();
shintamainjp 0:238f2d048222 239 read(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 240 wait_us(1);
shintamainjp 0:238f2d048222 241 }
shintamainjp 0:238f2d048222 242
shintamainjp 0:238f2d048222 243 /**
shintamainjp 0:238f2d048222 244 * Middle Level Interface.
shintamainjp 0:238f2d048222 245 */
shintamainjp 0:238f2d048222 246 void SG12864A::writeData(Target t, uint8_t c) {
shintamainjp 0:238f2d048222 247 setDirectionToWrite();
shintamainjp 0:238f2d048222 248 write(t, SG12864A::Data, c);
shintamainjp 0:238f2d048222 249 wait_us(1);
shintamainjp 0:238f2d048222 250 }
shintamainjp 0:238f2d048222 251
shintamainjp 0:238f2d048222 252 /**
shintamainjp 0:238f2d048222 253 * Middle Level Interface.
shintamainjp 0:238f2d048222 254 */
shintamainjp 0:238f2d048222 255 void SG12864A::readData(Target t, uint8_t *c) {
shintamainjp 0:238f2d048222 256 setDirectionToRead();
shintamainjp 0:238f2d048222 257 read(t, SG12864A::Data, c);
shintamainjp 0:238f2d048222 258 wait_us(1);
shintamainjp 0:238f2d048222 259 }
shintamainjp 0:238f2d048222 260
shintamainjp 0:238f2d048222 261 /**
shintamainjp 0:238f2d048222 262 * Low Level Interface.
shintamainjp 0:238f2d048222 263 */
shintamainjp 0:238f2d048222 264 void SG12864A::setDirectionToRead() {
shintamainjp 0:238f2d048222 265 ioDB.input();
shintamainjp 0:238f2d048222 266 ioRW = 1;
shintamainjp 0:238f2d048222 267 }
shintamainjp 0:238f2d048222 268
shintamainjp 0:238f2d048222 269 /**
shintamainjp 0:238f2d048222 270 * Low Level Interface.
shintamainjp 0:238f2d048222 271 */
shintamainjp 0:238f2d048222 272 void SG12864A::setDirectionToWrite() {
shintamainjp 0:238f2d048222 273 ioDB.output();
shintamainjp 0:238f2d048222 274 ioRW = 0;
shintamainjp 0:238f2d048222 275 }
shintamainjp 0:238f2d048222 276
shintamainjp 0:238f2d048222 277 /**
shintamainjp 0:238f2d048222 278 * Low Level Interface.
shintamainjp 0:238f2d048222 279 */
shintamainjp 0:238f2d048222 280 void SG12864A::write(Target t, Mode m, uint8_t c) {
shintamainjp 0:238f2d048222 281 switch (t) {
shintamainjp 0:238f2d048222 282 case CS1:
shintamainjp 0:238f2d048222 283 ioCS1 = 1;
shintamainjp 0:238f2d048222 284 ioCS2 = 0;
shintamainjp 0:238f2d048222 285 break;
shintamainjp 0:238f2d048222 286 case CS2:
shintamainjp 0:238f2d048222 287 ioCS1 = 0;
shintamainjp 0:238f2d048222 288 ioCS2 = 1;
shintamainjp 0:238f2d048222 289 break;
shintamainjp 0:238f2d048222 290 }
shintamainjp 0:238f2d048222 291 switch (m) {
shintamainjp 0:238f2d048222 292 case Data:
shintamainjp 0:238f2d048222 293 ioDI = 1;
shintamainjp 0:238f2d048222 294 break;
shintamainjp 0:238f2d048222 295 case Instruction:
shintamainjp 0:238f2d048222 296 ioDI = 0;
shintamainjp 0:238f2d048222 297 break;
shintamainjp 0:238f2d048222 298 }
shintamainjp 0:238f2d048222 299 ioDB = c;
shintamainjp 0:238f2d048222 300 wait_us(1);
shintamainjp 0:238f2d048222 301 ioEN = 1;
shintamainjp 0:238f2d048222 302 wait_us(1);
shintamainjp 0:238f2d048222 303 ioEN = 0;
shintamainjp 0:238f2d048222 304 wait_us(5);
shintamainjp 0:238f2d048222 305 }
shintamainjp 0:238f2d048222 306
shintamainjp 0:238f2d048222 307 /**
shintamainjp 0:238f2d048222 308 * Low Level Interface.
shintamainjp 0:238f2d048222 309 */
shintamainjp 0:238f2d048222 310 void SG12864A::read(Target t, Mode m, uint8_t *c) {
shintamainjp 0:238f2d048222 311 // TODO
shintamainjp 0:238f2d048222 312 }
shintamainjp 0:238f2d048222 313
shintamainjp 0:238f2d048222 314 /**
shintamainjp 0:238f2d048222 315 * Low Level Interface.
shintamainjp 0:238f2d048222 316 */
shintamainjp 0:238f2d048222 317 void SG12864A::reset(bool b) {
shintamainjp 0:238f2d048222 318 if (b) {
shintamainjp 0:238f2d048222 319 ioRES = 0;
shintamainjp 0:238f2d048222 320 } else {
shintamainjp 0:238f2d048222 321 ioRES = 1;
shintamainjp 0:238f2d048222 322 }
shintamainjp 0:238f2d048222 323 }