SG12864A

Dependents:   SG12864A_TestProgram

Committer:
shintamainjp
Date:
Tue Jul 20 07:23:15 2010 +0000
Revision:
3:86e7fba29623
Parent:
2:91c03e41c927
Child:
4:200d1ea4e76e

        

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