SG12864A

Dependents:   SG12864A_TestProgram

Committer:
shintamainjp
Date:
Tue Aug 10 12:36:05 2010 +0000
Revision:
4:200d1ea4e76e
Parent:
3:86e7fba29623
Child:
5:4d86043f7942

        

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