SG12864A

Dependents:   SG12864A_TestProgram

Committer:
shintamainjp
Date:
Tue Oct 12 22:46:37 2010 +0000
Revision:
6:bc2da4c1c5a0
Parent:
5:4d86043f7942
First version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 5:4d86043f7942 1 /**
shintamainjp 5:4d86043f7942 2 * SG12864A Graphics LCD module driver class (Version 0.0.1)
shintamainjp 5:4d86043f7942 3 *
shintamainjp 5:4d86043f7942 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 5:4d86043f7942 5 * http://shinta.main.jp/
shintamainjp 5:4d86043f7942 6 *
shintamainjp 5:4d86043f7942 7 * See also ...
shintamainjp 5:4d86043f7942 8 * http://mbed.org/users/shintamainjp/notebook/sg12864asunlike-display-graphics-lcd-driver/
shintamainjp 5:4d86043f7942 9 */
shintamainjp 5:4d86043f7942 10
shintamainjp 5:4d86043f7942 11 #include "SG12864A.h"
shintamainjp 5:4d86043f7942 12
shintamainjp 5:4d86043f7942 13 #define setPixel(x,y) buffer[((COLUMNS * 2)* ((y) / 8)) + (x)] |= (1 << ((y) % 8))
shintamainjp 5:4d86043f7942 14 #define unsetPixel(x,y) buffer[((COLUMNS * 2)* ((y) / 8)) + (x)] &= ~(1 << ((y) % 8))
shintamainjp 5:4d86043f7942 15 #define swap(a,b) {int c=a;a=b;b=c;}
shintamainjp 5:4d86043f7942 16
shintamainjp 5:4d86043f7942 17 const uint8_t SG12864A::font5x7_data[] = {
shintamainjp 5:4d86043f7942 18 0x00, 0x00, 0x00, 0x00, 0x00, // (white space)
shintamainjp 5:4d86043f7942 19 0x00, 0x00, 0x5F, 0x00, 0x00, // !
shintamainjp 5:4d86043f7942 20 0x00, 0x07, 0x00, 0x07, 0x00, // "
shintamainjp 5:4d86043f7942 21 0x14, 0x7F, 0x14, 0x7F, 0x14, // #
shintamainjp 5:4d86043f7942 22 0x24, 0x2A, 0x7F, 0x2A, 0x12, // $
shintamainjp 5:4d86043f7942 23 0x23, 0x13, 0x08, 0x64, 0x62, // %
shintamainjp 5:4d86043f7942 24 0x36, 0x49, 0x55, 0x22, 0x50, // &
shintamainjp 5:4d86043f7942 25 0x00, 0x05, 0x03, 0x00, 0x00, // '
shintamainjp 5:4d86043f7942 26 0x00, 0x1C, 0x22, 0x41, 0x00, // (
shintamainjp 5:4d86043f7942 27 0x00, 0x41, 0x22, 0x1C, 0x00, // )
shintamainjp 5:4d86043f7942 28 0x08, 0x2A, 0x1C, 0x2A, 0x08, // *
shintamainjp 5:4d86043f7942 29 0x08, 0x08, 0x3E, 0x08, 0x08, // +
shintamainjp 5:4d86043f7942 30 0x00, 0x50, 0x30, 0x00, 0x00, // ,
shintamainjp 5:4d86043f7942 31 0x08, 0x08, 0x08, 0x08, 0x08, // -
shintamainjp 5:4d86043f7942 32 0x00, 0x60, 0x60, 0x00, 0x00, // .
shintamainjp 5:4d86043f7942 33 0x20, 0x10, 0x08, 0x04, 0x02, // /
shintamainjp 5:4d86043f7942 34 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
shintamainjp 5:4d86043f7942 35 0x00, 0x42, 0x7F, 0x40, 0x00, // 1
shintamainjp 5:4d86043f7942 36 0x42, 0x61, 0x51, 0x49, 0x46, // 2
shintamainjp 5:4d86043f7942 37 0x21, 0x41, 0x45, 0x4B, 0x31, // 3
shintamainjp 5:4d86043f7942 38 0x18, 0x14, 0x12, 0x7F, 0x10, // 4
shintamainjp 5:4d86043f7942 39 0x27, 0x45, 0x45, 0x45, 0x39, // 5
shintamainjp 5:4d86043f7942 40 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6
shintamainjp 5:4d86043f7942 41 0x01, 0x71, 0x09, 0x05, 0x03, // 7
shintamainjp 5:4d86043f7942 42 0x36, 0x49, 0x49, 0x49, 0x36, // 8
shintamainjp 5:4d86043f7942 43 0x06, 0x49, 0x49, 0x29, 0x1E, // 9
shintamainjp 5:4d86043f7942 44 0x00, 0x36, 0x36, 0x00, 0x00, // :
shintamainjp 5:4d86043f7942 45 0x00, 0x56, 0x36, 0x00, 0x00, // ;
shintamainjp 5:4d86043f7942 46 0x00, 0x08, 0x14, 0x22, 0x41, // <
shintamainjp 5:4d86043f7942 47 0x14, 0x14, 0x14, 0x14, 0x14, // =
shintamainjp 5:4d86043f7942 48 0x41, 0x22, 0x14, 0x08, 0x00, // >
shintamainjp 5:4d86043f7942 49 0x02, 0x01, 0x51, 0x09, 0x06, // ?
shintamainjp 5:4d86043f7942 50 0x32, 0x49, 0x79, 0x41, 0x3E, // @
shintamainjp 5:4d86043f7942 51 0x7E, 0x11, 0x11, 0x11, 0x7E, // A
shintamainjp 5:4d86043f7942 52 0x7F, 0x49, 0x49, 0x49, 0x36, // B
shintamainjp 5:4d86043f7942 53 0x3E, 0x41, 0x41, 0x41, 0x22, // C
shintamainjp 5:4d86043f7942 54 0x7F, 0x41, 0x41, 0x22, 0x1C, // D
shintamainjp 5:4d86043f7942 55 0x7F, 0x49, 0x49, 0x49, 0x41, // E
shintamainjp 5:4d86043f7942 56 0x7F, 0x09, 0x09, 0x01, 0x01, // F
shintamainjp 5:4d86043f7942 57 0x3E, 0x41, 0x41, 0x51, 0x32, // G
shintamainjp 5:4d86043f7942 58 0x7F, 0x08, 0x08, 0x08, 0x7F, // H
shintamainjp 5:4d86043f7942 59 0x00, 0x41, 0x7F, 0x41, 0x00, // I
shintamainjp 5:4d86043f7942 60 0x20, 0x40, 0x41, 0x3F, 0x01, // J
shintamainjp 5:4d86043f7942 61 0x7F, 0x08, 0x14, 0x22, 0x41, // K
shintamainjp 5:4d86043f7942 62 0x7F, 0x40, 0x40, 0x40, 0x40, // L
shintamainjp 5:4d86043f7942 63 0x7F, 0x02, 0x04, 0x02, 0x7F, // M
shintamainjp 5:4d86043f7942 64 0x7F, 0x04, 0x08, 0x10, 0x7F, // N
shintamainjp 5:4d86043f7942 65 0x3E, 0x41, 0x41, 0x41, 0x3E, // O
shintamainjp 5:4d86043f7942 66 0x7F, 0x09, 0x09, 0x09, 0x06, // P
shintamainjp 5:4d86043f7942 67 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
shintamainjp 5:4d86043f7942 68 0x7F, 0x09, 0x19, 0x29, 0x46, // R
shintamainjp 5:4d86043f7942 69 0x46, 0x49, 0x49, 0x49, 0x31, // S
shintamainjp 5:4d86043f7942 70 0x01, 0x01, 0x7F, 0x01, 0x01, // T
shintamainjp 5:4d86043f7942 71 0x3F, 0x40, 0x40, 0x40, 0x3F, // U
shintamainjp 5:4d86043f7942 72 0x1F, 0x20, 0x40, 0x20, 0x1F, // V
shintamainjp 5:4d86043f7942 73 0x7F, 0x20, 0x18, 0x20, 0x7F, // W
shintamainjp 5:4d86043f7942 74 0x63, 0x14, 0x08, 0x14, 0x63, // X
shintamainjp 5:4d86043f7942 75 0x03, 0x04, 0x78, 0x04, 0x03, // Y
shintamainjp 5:4d86043f7942 76 0x61, 0x51, 0x49, 0x45, 0x43, // Z
shintamainjp 5:4d86043f7942 77 0x00, 0x00, 0x7F, 0x41, 0x41, // [
shintamainjp 5:4d86043f7942 78 0x02, 0x04, 0x08, 0x10, 0x20, // /
shintamainjp 5:4d86043f7942 79 0x41, 0x41, 0x7F, 0x00, 0x00, // ]
shintamainjp 5:4d86043f7942 80 0x04, 0x02, 0x01, 0x02, 0x04, // ^
shintamainjp 5:4d86043f7942 81 0x40, 0x40, 0x40, 0x40, 0x40, // _
shintamainjp 5:4d86043f7942 82 0x00, 0x01, 0x02, 0x04, 0x00, // `
shintamainjp 5:4d86043f7942 83 0x20, 0x54, 0x54, 0x54, 0x78, // a
shintamainjp 5:4d86043f7942 84 0x7F, 0x48, 0x44, 0x44, 0x38, // b
shintamainjp 5:4d86043f7942 85 0x38, 0x44, 0x44, 0x44, 0x20, // c
shintamainjp 5:4d86043f7942 86 0x38, 0x44, 0x44, 0x48, 0x7F, // d
shintamainjp 5:4d86043f7942 87 0x38, 0x54, 0x54, 0x54, 0x18, // e
shintamainjp 5:4d86043f7942 88 0x08, 0x7E, 0x09, 0x01, 0x02, // f
shintamainjp 5:4d86043f7942 89 0x08, 0x14, 0x54, 0x54, 0x3C, // g
shintamainjp 5:4d86043f7942 90 0x7F, 0x08, 0x04, 0x04, 0x78, // h
shintamainjp 5:4d86043f7942 91 0x00, 0x44, 0x7D, 0x40, 0x00, // i
shintamainjp 5:4d86043f7942 92 0x20, 0x40, 0x44, 0x3D, 0x00, // j
shintamainjp 5:4d86043f7942 93 0x00, 0x7F, 0x10, 0x28, 0x44, // k
shintamainjp 5:4d86043f7942 94 0x00, 0x41, 0x7F, 0x40, 0x00, // l
shintamainjp 5:4d86043f7942 95 0x7C, 0x04, 0x18, 0x04, 0x78, // m
shintamainjp 5:4d86043f7942 96 0x7C, 0x08, 0x04, 0x04, 0x78, // n
shintamainjp 5:4d86043f7942 97 0x38, 0x44, 0x44, 0x44, 0x38, // o
shintamainjp 5:4d86043f7942 98 0x7C, 0x14, 0x14, 0x14, 0x08, // p
shintamainjp 5:4d86043f7942 99 0x08, 0x14, 0x14, 0x18, 0x7C, // q
shintamainjp 5:4d86043f7942 100 0x7C, 0x08, 0x04, 0x04, 0x08, // r
shintamainjp 5:4d86043f7942 101 0x48, 0x54, 0x54, 0x54, 0x20, // s
shintamainjp 5:4d86043f7942 102 0x04, 0x3F, 0x44, 0x40, 0x20, // t
shintamainjp 5:4d86043f7942 103 0x3C, 0x40, 0x40, 0x20, 0x7C, // u
shintamainjp 5:4d86043f7942 104 0x1C, 0x20, 0x40, 0x20, 0x1C, // v
shintamainjp 5:4d86043f7942 105 0x3C, 0x40, 0x30, 0x40, 0x3C, // w
shintamainjp 5:4d86043f7942 106 0x44, 0x28, 0x10, 0x28, 0x44, // x
shintamainjp 5:4d86043f7942 107 0x0C, 0x50, 0x50, 0x50, 0x3C, // y
shintamainjp 5:4d86043f7942 108 0x44, 0x64, 0x54, 0x4C, 0x44, // z
shintamainjp 5:4d86043f7942 109 0x00, 0x08, 0x36, 0x41, 0x00, // {
shintamainjp 5:4d86043f7942 110 0x00, 0x00, 0x7F, 0x00, 0x00, // |
shintamainjp 5:4d86043f7942 111 0x00, 0x41, 0x36, 0x08, 0x00, // }
shintamainjp 5:4d86043f7942 112 0x08, 0x08, 0x2A, 0x1C, 0x08, // ->
shintamainjp 5:4d86043f7942 113 0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
shintamainjp 5:4d86043f7942 114 };
shintamainjp 5:4d86043f7942 115
shintamainjp 5:4d86043f7942 116 SG12864A::SG12864A(PinName di,
shintamainjp 5:4d86043f7942 117 PinName rw,
shintamainjp 5:4d86043f7942 118 PinName en,
shintamainjp 5:4d86043f7942 119 PinName db0,
shintamainjp 5:4d86043f7942 120 PinName db1,
shintamainjp 5:4d86043f7942 121 PinName db2,
shintamainjp 5:4d86043f7942 122 PinName db3,
shintamainjp 5:4d86043f7942 123 PinName db4,
shintamainjp 5:4d86043f7942 124 PinName db5,
shintamainjp 5:4d86043f7942 125 PinName db6,
shintamainjp 5:4d86043f7942 126 PinName db7,
shintamainjp 5:4d86043f7942 127 PinName cs1,
shintamainjp 5:4d86043f7942 128 PinName cs2,
shintamainjp 5:4d86043f7942 129 PinName res)
shintamainjp 5:4d86043f7942 130 :
shintamainjp 5:4d86043f7942 131 ioDI(di),
shintamainjp 5:4d86043f7942 132 ioRW(rw),
shintamainjp 5:4d86043f7942 133 ioEN(en),
shintamainjp 5:4d86043f7942 134 ioDB(db0, db1, db2, db3, db4, db5, db6, db7),
shintamainjp 5:4d86043f7942 135 ioCS1(cs1),
shintamainjp 5:4d86043f7942 136 ioCS2(cs2),
shintamainjp 5:4d86043f7942 137 ioRES(res) {
shintamainjp 5:4d86043f7942 138 bufferClear();
shintamainjp 5:4d86043f7942 139 setDirectionToWrite();
shintamainjp 5:4d86043f7942 140 }
shintamainjp 5:4d86043f7942 141
shintamainjp 5:4d86043f7942 142 SG12864A::~SG12864A() {
shintamainjp 5:4d86043f7942 143 }
shintamainjp 5:4d86043f7942 144
shintamainjp 5:4d86043f7942 145 void SG12864A::bufferPush(void) {
shintamainjp 5:4d86043f7942 146 for (uint8_t i = 0; i < PAGES; i++) {
shintamainjp 5:4d86043f7942 147 // CS1
shintamainjp 5:4d86043f7942 148 setPageAddress(SG12864A::CS1, i);
shintamainjp 5:4d86043f7942 149 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 5:4d86043f7942 150 for (uint8_t j = 0; j < COLUMNS; j++) {
shintamainjp 5:4d86043f7942 151 writeData(CS1, buffer[0 + ((COLUMNS * 2) * i) + j]);
shintamainjp 5:4d86043f7942 152 }
shintamainjp 5:4d86043f7942 153 // CS2
shintamainjp 5:4d86043f7942 154 setPageAddress(SG12864A::CS2, i);
shintamainjp 5:4d86043f7942 155 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 5:4d86043f7942 156 for (uint8_t j = 0; j < COLUMNS; j++) {
shintamainjp 5:4d86043f7942 157 writeData(CS2, buffer[COLUMNS + ((COLUMNS * 2) * i) + j]);
shintamainjp 5:4d86043f7942 158 }
shintamainjp 5:4d86043f7942 159 }
shintamainjp 5:4d86043f7942 160 }
shintamainjp 5:4d86043f7942 161
shintamainjp 5:4d86043f7942 162 void SG12864A::bufferPull(void) {
shintamainjp 5:4d86043f7942 163 }
shintamainjp 5:4d86043f7942 164
shintamainjp 5:4d86043f7942 165 void SG12864A::bufferClear(bool reverse) {
shintamainjp 5:4d86043f7942 166 for (int i = 0; i < sizeof(buffer); i++) {
shintamainjp 5:4d86043f7942 167 if (reverse) {
shintamainjp 5:4d86043f7942 168 buffer[i] = 0xFF;
shintamainjp 5:4d86043f7942 169 } else {
shintamainjp 5:4d86043f7942 170 buffer[i] = 0x00;
shintamainjp 5:4d86043f7942 171 }
shintamainjp 5:4d86043f7942 172 }
shintamainjp 5:4d86043f7942 173 }
shintamainjp 5:4d86043f7942 174
shintamainjp 5:4d86043f7942 175 void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
shintamainjp 5:4d86043f7942 176 /*
shintamainjp 5:4d86043f7942 177 * Bresenham's line algorithm
shintamainjp 5:4d86043f7942 178 */
shintamainjp 5:4d86043f7942 179 bool steep = abs(y2 - y1) > abs(x2 - x1);
shintamainjp 5:4d86043f7942 180 if (steep) {
shintamainjp 5:4d86043f7942 181 swap(x1, y1);
shintamainjp 5:4d86043f7942 182 swap(x2, y2);
shintamainjp 5:4d86043f7942 183 }
shintamainjp 5:4d86043f7942 184 if (x1 > x2) {
shintamainjp 5:4d86043f7942 185 swap(x1, x2);
shintamainjp 5:4d86043f7942 186 swap(y1, y2);
shintamainjp 5:4d86043f7942 187 }
shintamainjp 5:4d86043f7942 188 int deltax = x2 - x1;
shintamainjp 5:4d86043f7942 189 int deltay = abs(y2 - y1);
shintamainjp 5:4d86043f7942 190 int error = deltax / 2;
shintamainjp 5:4d86043f7942 191 int ystep;
shintamainjp 5:4d86043f7942 192 int y = y1;
shintamainjp 5:4d86043f7942 193 if (y1 < y2) {
shintamainjp 5:4d86043f7942 194 ystep = 1;
shintamainjp 5:4d86043f7942 195 } else {
shintamainjp 5:4d86043f7942 196 ystep = -1;
shintamainjp 5:4d86043f7942 197 }
shintamainjp 5:4d86043f7942 198 for (int x = x1; x <= x2; x++) {
shintamainjp 5:4d86043f7942 199 if (steep) {
shintamainjp 5:4d86043f7942 200 if (reverse) {
shintamainjp 5:4d86043f7942 201 unsetPixel(y, x);
shintamainjp 5:4d86043f7942 202 } else {
shintamainjp 5:4d86043f7942 203 setPixel(y, x);
shintamainjp 5:4d86043f7942 204 }
shintamainjp 5:4d86043f7942 205 } else {
shintamainjp 5:4d86043f7942 206 if (reverse) {
shintamainjp 5:4d86043f7942 207 unsetPixel(x, y);
shintamainjp 5:4d86043f7942 208 } else {
shintamainjp 5:4d86043f7942 209 setPixel(x, y);
shintamainjp 5:4d86043f7942 210 }
shintamainjp 5:4d86043f7942 211 }
shintamainjp 5:4d86043f7942 212 error = error - deltay;
shintamainjp 5:4d86043f7942 213 if (error < 0) {
shintamainjp 5:4d86043f7942 214 y = y + ystep;
shintamainjp 5:4d86043f7942 215 error = error + deltax;
shintamainjp 5:4d86043f7942 216 }
shintamainjp 5:4d86043f7942 217 }
shintamainjp 5:4d86043f7942 218 }
shintamainjp 5:4d86043f7942 219
shintamainjp 5:4d86043f7942 220 void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
shintamainjp 5:4d86043f7942 221 for (int x = x1; x <= x2; x++) {
shintamainjp 5:4d86043f7942 222 if (reverse) {
shintamainjp 5:4d86043f7942 223 unsetPixel(x, y1);
shintamainjp 5:4d86043f7942 224 unsetPixel(x, y2);
shintamainjp 5:4d86043f7942 225 } else {
shintamainjp 5:4d86043f7942 226 setPixel(x, y1);
shintamainjp 5:4d86043f7942 227 setPixel(x, y2);
shintamainjp 5:4d86043f7942 228 }
shintamainjp 5:4d86043f7942 229 }
shintamainjp 5:4d86043f7942 230 for (int y = y1; y <= y2; y++) {
shintamainjp 5:4d86043f7942 231 if (reverse) {
shintamainjp 5:4d86043f7942 232 unsetPixel(x1, y);
shintamainjp 5:4d86043f7942 233 unsetPixel(x2, y);
shintamainjp 5:4d86043f7942 234 } else {
shintamainjp 5:4d86043f7942 235 setPixel(x1, y);
shintamainjp 5:4d86043f7942 236 setPixel(x2, y);
shintamainjp 5:4d86043f7942 237 }
shintamainjp 5:4d86043f7942 238 }
shintamainjp 5:4d86043f7942 239 }
shintamainjp 5:4d86043f7942 240
shintamainjp 5:4d86043f7942 241 void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
shintamainjp 5:4d86043f7942 242 for (int x = x1; x <= x2; x++) {
shintamainjp 5:4d86043f7942 243 for (int y = y1; y <= y2; y++) {
shintamainjp 5:4d86043f7942 244 if (reverse) {
shintamainjp 5:4d86043f7942 245 unsetPixel(x, y);
shintamainjp 5:4d86043f7942 246 } else {
shintamainjp 5:4d86043f7942 247 setPixel(x, y);
shintamainjp 5:4d86043f7942 248 }
shintamainjp 5:4d86043f7942 249 }
shintamainjp 5:4d86043f7942 250 }
shintamainjp 5:4d86043f7942 251 }
shintamainjp 5:4d86043f7942 252
shintamainjp 5:4d86043f7942 253 void SG12864A::bufferDrawString(uint8_t x, uint8_t y, char * str, bool reverse) {
shintamainjp 5:4d86043f7942 254 char *p = str;
shintamainjp 5:4d86043f7942 255 int cnt = 0;
shintamainjp 5:4d86043f7942 256 while (*p) {
shintamainjp 5:4d86043f7942 257 bufferDrawChar(x + (FONT_X * cnt), y, *p, reverse);
shintamainjp 5:4d86043f7942 258 p++;
shintamainjp 5:4d86043f7942 259 cnt++;
shintamainjp 5:4d86043f7942 260 }
shintamainjp 5:4d86043f7942 261 }
shintamainjp 5:4d86043f7942 262
shintamainjp 5:4d86043f7942 263 void SG12864A::bufferDrawChar(uint8_t x, uint8_t y, char c, bool reverse) {
shintamainjp 5:4d86043f7942 264 if ((FONT_MIN_CODE <= c) &&(c <= FONT_MAX_CODE)) {
shintamainjp 5:4d86043f7942 265 int aofs = (c - FONT_MIN_CODE) * FONT_X;
shintamainjp 5:4d86043f7942 266 for (int i = 0; i < FONT_X; i++) {
shintamainjp 5:4d86043f7942 267 uint8_t pat = font5x7_data[aofs + i];
shintamainjp 5:4d86043f7942 268 for (int j = 0; j < FONT_Y; j++) {
shintamainjp 5:4d86043f7942 269 if (pat & (1 << j)) {
shintamainjp 5:4d86043f7942 270 if (reverse) {
shintamainjp 5:4d86043f7942 271 unsetPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 272 } else {
shintamainjp 5:4d86043f7942 273 setPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 274 }
shintamainjp 5:4d86043f7942 275 } else {
shintamainjp 5:4d86043f7942 276 if (reverse) {
shintamainjp 5:4d86043f7942 277 setPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 278 } else {
shintamainjp 5:4d86043f7942 279 unsetPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 280 }
shintamainjp 5:4d86043f7942 281 }
shintamainjp 5:4d86043f7942 282 }
shintamainjp 5:4d86043f7942 283 }
shintamainjp 5:4d86043f7942 284 } else {
shintamainjp 5:4d86043f7942 285 for (int i = 0; i < FONT_X; i++) {
shintamainjp 5:4d86043f7942 286 uint8_t pat = (i % 2) ? 0x55 : 0xAA;
shintamainjp 5:4d86043f7942 287 for (int j = 0; j < FONT_Y; j++) {
shintamainjp 5:4d86043f7942 288 if (pat & (1 << j)) {
shintamainjp 5:4d86043f7942 289 if (reverse) {
shintamainjp 5:4d86043f7942 290 unsetPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 291 } else {
shintamainjp 5:4d86043f7942 292 setPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 293 }
shintamainjp 5:4d86043f7942 294 } else {
shintamainjp 5:4d86043f7942 295 if (reverse) {
shintamainjp 5:4d86043f7942 296 setPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 297 } else {
shintamainjp 5:4d86043f7942 298 unsetPixel(x + i, y + j);
shintamainjp 5:4d86043f7942 299 }
shintamainjp 5:4d86043f7942 300 }
shintamainjp 5:4d86043f7942 301 }
shintamainjp 5:4d86043f7942 302 }
shintamainjp 5:4d86043f7942 303 }
shintamainjp 5:4d86043f7942 304 }
shintamainjp 5:4d86043f7942 305
shintamainjp 5:4d86043f7942 306 void SG12864A::bufferDrawCheckbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool state, bool reverse) {
shintamainjp 5:4d86043f7942 307 bufferDrawBox(x1, y1, x2, y2, reverse);
shintamainjp 5:4d86043f7942 308 if (state) {
shintamainjp 5:4d86043f7942 309 bufferDrawLine(x1, y1, x2, y2, reverse);
shintamainjp 5:4d86043f7942 310 bufferDrawLine(x1, y2, x2, y1, reverse);
shintamainjp 5:4d86043f7942 311 }
shintamainjp 5:4d86043f7942 312 }
shintamainjp 5:4d86043f7942 313
shintamainjp 5:4d86043f7942 314 void SG12864A::bufferDrawProgressbar(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, int min, int max, int value, bool reverse) {
shintamainjp 5:4d86043f7942 315 bufferDrawBox(x1, y1, x2, y2, reverse);
shintamainjp 5:4d86043f7942 316 if ((value < min) || (max < value)) {
shintamainjp 5:4d86043f7942 317 return;
shintamainjp 5:4d86043f7942 318 }
shintamainjp 5:4d86043f7942 319 int tmp_max = max - min;
shintamainjp 5:4d86043f7942 320 int tmp_val = value - min;
shintamainjp 5:4d86043f7942 321 int pix = ((x2 - x1) * tmp_val) / tmp_max;
shintamainjp 5:4d86043f7942 322 bufferFillBox(x1 + 1, y1 + 1, x1 + pix - 1, y2 - 1, reverse);
shintamainjp 5:4d86043f7942 323 }
shintamainjp 5:4d86043f7942 324
shintamainjp 5:4d86043f7942 325 /**
shintamainjp 5:4d86043f7942 326 * High Level Interface.
shintamainjp 5:4d86043f7942 327 *
shintamainjp 5:4d86043f7942 328 * Reset display module.
shintamainjp 5:4d86043f7942 329 */
shintamainjp 5:4d86043f7942 330 void SG12864A::reset(void) {
shintamainjp 5:4d86043f7942 331 reset(true);
shintamainjp 5:4d86043f7942 332 wait_ms(200);
shintamainjp 5:4d86043f7942 333 reset(false);
shintamainjp 5:4d86043f7942 334 wait_ms(200);
shintamainjp 5:4d86043f7942 335
shintamainjp 5:4d86043f7942 336 setDisplayOnOff(SG12864A::CS1, true);
shintamainjp 5:4d86043f7942 337 setDisplayOnOff(SG12864A::CS2, true);
shintamainjp 5:4d86043f7942 338 setDisplayStartLine(SG12864A::CS1, 0);
shintamainjp 5:4d86043f7942 339 setDisplayStartLine(SG12864A::CS2, 0);
shintamainjp 5:4d86043f7942 340 setPageAddress(SG12864A::CS1, 0);
shintamainjp 5:4d86043f7942 341 setPageAddress(SG12864A::CS2, 0);
shintamainjp 5:4d86043f7942 342 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 5:4d86043f7942 343 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 5:4d86043f7942 344 }
shintamainjp 5:4d86043f7942 345
shintamainjp 5:4d86043f7942 346 /**
shintamainjp 5:4d86043f7942 347 * High Level Interface.
shintamainjp 5:4d86043f7942 348 *
shintamainjp 5:4d86043f7942 349 * Clear display module.
shintamainjp 5:4d86043f7942 350 */
shintamainjp 5:4d86043f7942 351 void SG12864A::clear(void) {
shintamainjp 5:4d86043f7942 352 for (uint8_t page = 0; page < PAGES; page++) {
shintamainjp 5:4d86043f7942 353 for (uint8_t column = 0; column < COLUMNS; column++) {
shintamainjp 5:4d86043f7942 354 // CS1
shintamainjp 5:4d86043f7942 355 setPageAddress(SG12864A::CS1, page);
shintamainjp 5:4d86043f7942 356 setColumnAddress(SG12864A::CS1, column);
shintamainjp 5:4d86043f7942 357 writeData(CS1, 0x00);
shintamainjp 5:4d86043f7942 358 // CS2
shintamainjp 5:4d86043f7942 359 setPageAddress(SG12864A::CS2, page);
shintamainjp 5:4d86043f7942 360 setColumnAddress(SG12864A::CS2, column);
shintamainjp 5:4d86043f7942 361 writeData(CS2, 0x00);
shintamainjp 5:4d86043f7942 362 }
shintamainjp 5:4d86043f7942 363 }
shintamainjp 5:4d86043f7942 364 // CS1
shintamainjp 5:4d86043f7942 365 setPageAddress(SG12864A::CS1, 0);
shintamainjp 5:4d86043f7942 366 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 5:4d86043f7942 367 writeData(CS1, 0x00);
shintamainjp 5:4d86043f7942 368 // CS2
shintamainjp 5:4d86043f7942 369 setPageAddress(SG12864A::CS2, 0);
shintamainjp 5:4d86043f7942 370 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 5:4d86043f7942 371 writeData(CS2, 0x00);
shintamainjp 5:4d86043f7942 372 }
shintamainjp 5:4d86043f7942 373
shintamainjp 5:4d86043f7942 374 /**
shintamainjp 5:4d86043f7942 375 * Middle Level Interface.
shintamainjp 5:4d86043f7942 376 *
shintamainjp 5:4d86043f7942 377 * Set display on/off.
shintamainjp 5:4d86043f7942 378 *
shintamainjp 5:4d86043f7942 379 * @param t Target (CS1, CS2).
shintamainjp 5:4d86043f7942 380 * @param on ON/OFF (true, false).
shintamainjp 5:4d86043f7942 381 */
shintamainjp 5:4d86043f7942 382 void SG12864A::setDisplayOnOff(Target t, bool on) {
shintamainjp 5:4d86043f7942 383 setDirectionToWrite();
shintamainjp 5:4d86043f7942 384 uint8_t c = 0x3e | (on ? 0x01 : 0x00);
shintamainjp 5:4d86043f7942 385 write(t, SG12864A::Instruction, c);
shintamainjp 5:4d86043f7942 386 wait_us(1);
shintamainjp 5:4d86043f7942 387 }
shintamainjp 5:4d86043f7942 388
shintamainjp 5:4d86043f7942 389 /**
shintamainjp 5:4d86043f7942 390 * Middle Level Interface.
shintamainjp 5:4d86043f7942 391 *
shintamainjp 5:4d86043f7942 392 * Set display start line.
shintamainjp 5:4d86043f7942 393 *
shintamainjp 5:4d86043f7942 394 * @param t Target (CS1, CS2).
shintamainjp 5:4d86043f7942 395 * @param addr Display start line (0-63).
shintamainjp 5:4d86043f7942 396 */
shintamainjp 5:4d86043f7942 397 void SG12864A::setDisplayStartLine(Target t, uint8_t addr) {
shintamainjp 5:4d86043f7942 398 setDirectionToWrite();
shintamainjp 5:4d86043f7942 399 uint8_t c = 0xc0 | (addr & 0x3f);
shintamainjp 5:4d86043f7942 400 write(t, SG12864A::Instruction, c);
shintamainjp 5:4d86043f7942 401 wait_us(1);
shintamainjp 5:4d86043f7942 402 }
shintamainjp 5:4d86043f7942 403
shintamainjp 5:4d86043f7942 404 /**
shintamainjp 5:4d86043f7942 405 * Middle Level Interface.
shintamainjp 5:4d86043f7942 406 *
shintamainjp 5:4d86043f7942 407 * Set page address.
shintamainjp 5:4d86043f7942 408 *
shintamainjp 5:4d86043f7942 409 * @param t Target (CS1, CS2).
shintamainjp 5:4d86043f7942 410 * @param addr Page address(0-7).
shintamainjp 5:4d86043f7942 411 */
shintamainjp 5:4d86043f7942 412 void SG12864A::setPageAddress(Target t, uint8_t addr) {
shintamainjp 5:4d86043f7942 413 setDirectionToWrite();
shintamainjp 5:4d86043f7942 414 uint8_t c = 0xb8 | (addr & 0x07);
shintamainjp 5:4d86043f7942 415 write(t, SG12864A::Instruction, c);
shintamainjp 5:4d86043f7942 416 wait_us(1);
shintamainjp 5:4d86043f7942 417 }
shintamainjp 5:4d86043f7942 418
shintamainjp 5:4d86043f7942 419 /**
shintamainjp 5:4d86043f7942 420 * Middle Level Interface.
shintamainjp 5:4d86043f7942 421 *
shintamainjp 5:4d86043f7942 422 * Set column address.
shintamainjp 5:4d86043f7942 423 *
shintamainjp 5:4d86043f7942 424 * @param t Target. (CS1, CS2)
shintamainjp 5:4d86043f7942 425 * @param addr Column address (0-63).
shintamainjp 5:4d86043f7942 426 */
shintamainjp 5:4d86043f7942 427 void SG12864A::setColumnAddress(Target t, uint8_t addr) {
shintamainjp 5:4d86043f7942 428 setDirectionToWrite();
shintamainjp 5:4d86043f7942 429 uint8_t c = 0x40 | (addr & 0x3f);
shintamainjp 5:4d86043f7942 430 write(t, SG12864A::Instruction, c);
shintamainjp 5:4d86043f7942 431 wait_us(1);
shintamainjp 5:4d86043f7942 432 }
shintamainjp 5:4d86043f7942 433
shintamainjp 5:4d86043f7942 434 /**
shintamainjp 5:4d86043f7942 435 * Middle Level Interface.
shintamainjp 5:4d86043f7942 436 */
shintamainjp 5:4d86043f7942 437 void SG12864A::readStatus(Target t, uint8_t *c) {
shintamainjp 5:4d86043f7942 438 setDirectionToRead();
shintamainjp 5:4d86043f7942 439 read(t, SG12864A::Instruction, c);
shintamainjp 5:4d86043f7942 440 wait_us(1);
shintamainjp 5:4d86043f7942 441 }
shintamainjp 5:4d86043f7942 442
shintamainjp 5:4d86043f7942 443 /**
shintamainjp 5:4d86043f7942 444 * Middle Level Interface.
shintamainjp 5:4d86043f7942 445 */
shintamainjp 5:4d86043f7942 446 void SG12864A::writeData(Target t, uint8_t c) {
shintamainjp 5:4d86043f7942 447 setDirectionToWrite();
shintamainjp 5:4d86043f7942 448 write(t, SG12864A::Data, c);
shintamainjp 5:4d86043f7942 449 wait_us(1);
shintamainjp 5:4d86043f7942 450 }
shintamainjp 5:4d86043f7942 451
shintamainjp 5:4d86043f7942 452 /**
shintamainjp 5:4d86043f7942 453 * Middle Level Interface.
shintamainjp 5:4d86043f7942 454 */
shintamainjp 5:4d86043f7942 455 void SG12864A::readData(Target t, uint8_t *c) {
shintamainjp 5:4d86043f7942 456 setDirectionToRead();
shintamainjp 5:4d86043f7942 457 read(t, SG12864A::Data, c);
shintamainjp 5:4d86043f7942 458 wait_us(1);
shintamainjp 5:4d86043f7942 459 }
shintamainjp 5:4d86043f7942 460
shintamainjp 5:4d86043f7942 461 /**
shintamainjp 5:4d86043f7942 462 * Low Level Interface.
shintamainjp 5:4d86043f7942 463 */
shintamainjp 5:4d86043f7942 464 void SG12864A::setDirectionToRead() {
shintamainjp 5:4d86043f7942 465 ioDB.input();
shintamainjp 5:4d86043f7942 466 ioRW = 1;
shintamainjp 5:4d86043f7942 467 }
shintamainjp 5:4d86043f7942 468
shintamainjp 5:4d86043f7942 469 /**
shintamainjp 5:4d86043f7942 470 * Low Level Interface.
shintamainjp 5:4d86043f7942 471 */
shintamainjp 5:4d86043f7942 472 void SG12864A::setDirectionToWrite() {
shintamainjp 5:4d86043f7942 473 ioDB.output();
shintamainjp 5:4d86043f7942 474 ioRW = 0;
shintamainjp 5:4d86043f7942 475 }
shintamainjp 5:4d86043f7942 476
shintamainjp 5:4d86043f7942 477 /**
shintamainjp 5:4d86043f7942 478 * Low Level Interface.
shintamainjp 5:4d86043f7942 479 */
shintamainjp 5:4d86043f7942 480 void SG12864A::write(Target t, Mode m, uint8_t c) {
shintamainjp 5:4d86043f7942 481 switch (t) {
shintamainjp 5:4d86043f7942 482 case CS1:
shintamainjp 5:4d86043f7942 483 ioCS1 = 1;
shintamainjp 5:4d86043f7942 484 ioCS2 = 0;
shintamainjp 5:4d86043f7942 485 break;
shintamainjp 5:4d86043f7942 486 case CS2:
shintamainjp 5:4d86043f7942 487 ioCS1 = 0;
shintamainjp 5:4d86043f7942 488 ioCS2 = 1;
shintamainjp 5:4d86043f7942 489 break;
shintamainjp 5:4d86043f7942 490 }
shintamainjp 5:4d86043f7942 491 switch (m) {
shintamainjp 5:4d86043f7942 492 case Data:
shintamainjp 5:4d86043f7942 493 ioDI = 1;
shintamainjp 5:4d86043f7942 494 break;
shintamainjp 5:4d86043f7942 495 case Instruction:
shintamainjp 5:4d86043f7942 496 ioDI = 0;
shintamainjp 5:4d86043f7942 497 break;
shintamainjp 5:4d86043f7942 498 }
shintamainjp 5:4d86043f7942 499 ioDB = c;
shintamainjp 5:4d86043f7942 500 wait_us(1);
shintamainjp 5:4d86043f7942 501 ioEN = 1;
shintamainjp 5:4d86043f7942 502 wait_us(1);
shintamainjp 5:4d86043f7942 503 ioEN = 0;
shintamainjp 5:4d86043f7942 504 wait_us(5);
shintamainjp 5:4d86043f7942 505 }
shintamainjp 5:4d86043f7942 506
shintamainjp 5:4d86043f7942 507 /**
shintamainjp 5:4d86043f7942 508 * Low Level Interface.
shintamainjp 5:4d86043f7942 509 */
shintamainjp 5:4d86043f7942 510 void SG12864A::read(Target t, Mode m, uint8_t *c) {
shintamainjp 5:4d86043f7942 511 // TODO
shintamainjp 5:4d86043f7942 512 }
shintamainjp 5:4d86043f7942 513
shintamainjp 5:4d86043f7942 514 /**
shintamainjp 5:4d86043f7942 515 * Low Level Interface.
shintamainjp 5:4d86043f7942 516 */
shintamainjp 5:4d86043f7942 517 void SG12864A::reset(bool b) {
shintamainjp 5:4d86043f7942 518 if (b) {
shintamainjp 5:4d86043f7942 519 ioRES = 0;
shintamainjp 5:4d86043f7942 520 } else {
shintamainjp 5:4d86043f7942 521 ioRES = 1;
shintamainjp 5:4d86043f7942 522 }
shintamainjp 5:4d86043f7942 523 }