SG12864A

Dependents:   SG12864A_TestProgram

Committer:
shintamainjp
Date:
Tue Jul 20 05:30:47 2010 +0000
Revision:
2:91c03e41c927
Parent:
1:aacd73a4e7ee
Child:
3:86e7fba29623

        

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 1:aacd73a4e7ee 162 void SG12864A::bufferClear(void) {
shintamainjp 1:aacd73a4e7ee 163 for (int i = 0; i < sizeof(buffer); i++) {
shintamainjp 1:aacd73a4e7ee 164 buffer[i] = 0x00;
shintamainjp 1:aacd73a4e7ee 165 }
shintamainjp 1:aacd73a4e7ee 166 }
shintamainjp 1:aacd73a4e7ee 167
shintamainjp 1:aacd73a4e7ee 168 void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
shintamainjp 1:aacd73a4e7ee 169 /*
shintamainjp 1:aacd73a4e7ee 170 * Bresenham's line algorithm
shintamainjp 1:aacd73a4e7ee 171 */
shintamainjp 1:aacd73a4e7ee 172 bool steep = abs(y2 - y1) > abs(x2 - x1);
shintamainjp 1:aacd73a4e7ee 173 if (steep) {
shintamainjp 1:aacd73a4e7ee 174 swap(x1, y1);
shintamainjp 1:aacd73a4e7ee 175 swap(x2, y2);
shintamainjp 1:aacd73a4e7ee 176 }
shintamainjp 1:aacd73a4e7ee 177 if (x1 > x2) {
shintamainjp 1:aacd73a4e7ee 178 swap(x1, x2);
shintamainjp 1:aacd73a4e7ee 179 swap(y1, y2);
shintamainjp 1:aacd73a4e7ee 180 }
shintamainjp 1:aacd73a4e7ee 181 int deltax = x2 - x1;
shintamainjp 1:aacd73a4e7ee 182 int deltay = abs(y2 - y1);
shintamainjp 1:aacd73a4e7ee 183 int error = deltax / 2;
shintamainjp 1:aacd73a4e7ee 184 int ystep;
shintamainjp 1:aacd73a4e7ee 185 int y = y1;
shintamainjp 1:aacd73a4e7ee 186 if (y1 < y2) {
shintamainjp 1:aacd73a4e7ee 187 ystep = 1;
shintamainjp 1:aacd73a4e7ee 188 } else {
shintamainjp 1:aacd73a4e7ee 189 ystep = -1;
shintamainjp 1:aacd73a4e7ee 190 }
shintamainjp 1:aacd73a4e7ee 191 for (int x = x1; x <= x2; x++) {
shintamainjp 1:aacd73a4e7ee 192 if (steep) {
shintamainjp 1:aacd73a4e7ee 193 setPixel(y,x);
shintamainjp 1:aacd73a4e7ee 194 } else {
shintamainjp 1:aacd73a4e7ee 195 setPixel(x,y);
shintamainjp 1:aacd73a4e7ee 196 }
shintamainjp 1:aacd73a4e7ee 197 error = error - deltay;
shintamainjp 1:aacd73a4e7ee 198 if (error < 0) {
shintamainjp 1:aacd73a4e7ee 199 y = y + ystep;
shintamainjp 1:aacd73a4e7ee 200 error = error + deltax;
shintamainjp 1:aacd73a4e7ee 201 }
shintamainjp 1:aacd73a4e7ee 202 }
shintamainjp 1:aacd73a4e7ee 203 }
shintamainjp 1:aacd73a4e7ee 204
shintamainjp 1:aacd73a4e7ee 205 void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
shintamainjp 1:aacd73a4e7ee 206 for (int x = x1; x <= x2; x++) {
shintamainjp 1:aacd73a4e7ee 207 setPixel(x, y1);
shintamainjp 1:aacd73a4e7ee 208 setPixel(x, y2);
shintamainjp 1:aacd73a4e7ee 209 }
shintamainjp 1:aacd73a4e7ee 210 for (int y = y1; y <= y2; y++) {
shintamainjp 1:aacd73a4e7ee 211 setPixel(x1, y);
shintamainjp 1:aacd73a4e7ee 212 setPixel(x2, y);
shintamainjp 1:aacd73a4e7ee 213 }
shintamainjp 1:aacd73a4e7ee 214 }
shintamainjp 1:aacd73a4e7ee 215
shintamainjp 1:aacd73a4e7ee 216 void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
shintamainjp 1:aacd73a4e7ee 217 for (int x = x1; x <= x2; x++) {
shintamainjp 1:aacd73a4e7ee 218 for (int y = y1; y <= y2; y++) {
shintamainjp 1:aacd73a4e7ee 219 setPixel(x, y);
shintamainjp 1:aacd73a4e7ee 220 }
shintamainjp 1:aacd73a4e7ee 221 }
shintamainjp 1:aacd73a4e7ee 222 }
shintamainjp 1:aacd73a4e7ee 223
shintamainjp 2:91c03e41c927 224 void SG12864A::bufferDrawString(const uint8_t x, const uint8_t y, const char * str) {
shintamainjp 2:91c03e41c927 225 char *p = (char *)str;
shintamainjp 2:91c03e41c927 226 int cnt = 0;
shintamainjp 2:91c03e41c927 227 while (*p) {
shintamainjp 2:91c03e41c927 228 bufferDrawChar(x + (FONT_X * cnt), y, *p);
shintamainjp 2:91c03e41c927 229 p++;
shintamainjp 2:91c03e41c927 230 cnt++;
shintamainjp 2:91c03e41c927 231 }
shintamainjp 2:91c03e41c927 232 }
shintamainjp 2:91c03e41c927 233
shintamainjp 2:91c03e41c927 234 void SG12864A::bufferDrawChar(const uint8_t x, const uint8_t y, const char c) {
shintamainjp 2:91c03e41c927 235 if ((FONT_MIN_CODE <= c) &&(c <= FONT_MAX_CODE)) {
shintamainjp 2:91c03e41c927 236 int aofs = (c - FONT_MIN_CODE) * FONT_X;
shintamainjp 2:91c03e41c927 237 for (int i = 0; i < FONT_X; i++) {
shintamainjp 2:91c03e41c927 238 uint8_t pat = font5x7_data[aofs + i];
shintamainjp 2:91c03e41c927 239 for (int j = 0; j < FONT_Y; j++) {
shintamainjp 2:91c03e41c927 240 if (pat & (1 << j)) {
shintamainjp 2:91c03e41c927 241 setPixel(x + i, y + j);
shintamainjp 2:91c03e41c927 242 } else {
shintamainjp 2:91c03e41c927 243 unsetPixel(x + i, y + j);
shintamainjp 2:91c03e41c927 244 }
shintamainjp 2:91c03e41c927 245 }
shintamainjp 2:91c03e41c927 246 }
shintamainjp 2:91c03e41c927 247 } else {
shintamainjp 2:91c03e41c927 248 for (int i = 0; i < FONT_X; i++) {
shintamainjp 2:91c03e41c927 249 uint8_t pat = (i % 2) ? 0x55 : 0xAA;
shintamainjp 2:91c03e41c927 250 for (int j = 0; j < FONT_Y; j++) {
shintamainjp 2:91c03e41c927 251 if (pat & (1 << j)) {
shintamainjp 2:91c03e41c927 252 setPixel(x + i, y + j);
shintamainjp 2:91c03e41c927 253 } else {
shintamainjp 2:91c03e41c927 254 unsetPixel(x + i, y + j);
shintamainjp 2:91c03e41c927 255 }
shintamainjp 2:91c03e41c927 256 }
shintamainjp 2:91c03e41c927 257 }
shintamainjp 2:91c03e41c927 258 }
shintamainjp 2:91c03e41c927 259 }
shintamainjp 2:91c03e41c927 260
shintamainjp 0:238f2d048222 261 /**
shintamainjp 0:238f2d048222 262 * High Level Interface.
shintamainjp 0:238f2d048222 263 *
shintamainjp 0:238f2d048222 264 * Reset display module.
shintamainjp 0:238f2d048222 265 */
shintamainjp 0:238f2d048222 266 void SG12864A::reset(void) {
shintamainjp 0:238f2d048222 267 reset(true);
shintamainjp 0:238f2d048222 268 wait_ms(200);
shintamainjp 0:238f2d048222 269 reset(false);
shintamainjp 0:238f2d048222 270 wait_ms(200);
shintamainjp 0:238f2d048222 271
shintamainjp 0:238f2d048222 272 setDisplayOnOff(SG12864A::CS1, true);
shintamainjp 0:238f2d048222 273 setDisplayOnOff(SG12864A::CS2, true);
shintamainjp 0:238f2d048222 274 setDisplayStartLine(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 275 setDisplayStartLine(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 276 setPageAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 277 setPageAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 278 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 279 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 280 }
shintamainjp 0:238f2d048222 281
shintamainjp 0:238f2d048222 282 /**
shintamainjp 0:238f2d048222 283 * High Level Interface.
shintamainjp 0:238f2d048222 284 *
shintamainjp 0:238f2d048222 285 * Clear display module.
shintamainjp 0:238f2d048222 286 */
shintamainjp 0:238f2d048222 287 void SG12864A::clear(void) {
shintamainjp 0:238f2d048222 288 for (uint8_t page = 0; page < PAGES; page++) {
shintamainjp 0:238f2d048222 289 for (uint8_t column = 0; column < COLUMNS; column++) {
shintamainjp 0:238f2d048222 290 // CS1
shintamainjp 0:238f2d048222 291 setPageAddress(SG12864A::CS1, page);
shintamainjp 0:238f2d048222 292 setColumnAddress(SG12864A::CS1, column);
shintamainjp 0:238f2d048222 293 writeData(CS1, 0x00);
shintamainjp 0:238f2d048222 294 // CS2
shintamainjp 0:238f2d048222 295 setPageAddress(SG12864A::CS2, page);
shintamainjp 0:238f2d048222 296 setColumnAddress(SG12864A::CS2, column);
shintamainjp 0:238f2d048222 297 writeData(CS2, 0x00);
shintamainjp 0:238f2d048222 298 }
shintamainjp 0:238f2d048222 299 }
shintamainjp 0:238f2d048222 300 // CS1
shintamainjp 0:238f2d048222 301 setPageAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 302 setColumnAddress(SG12864A::CS1, 0);
shintamainjp 0:238f2d048222 303 writeData(CS1, 0x00);
shintamainjp 0:238f2d048222 304 // CS2
shintamainjp 0:238f2d048222 305 setPageAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 306 setColumnAddress(SG12864A::CS2, 0);
shintamainjp 0:238f2d048222 307 writeData(CS2, 0x00);
shintamainjp 0:238f2d048222 308 }
shintamainjp 0:238f2d048222 309
shintamainjp 0:238f2d048222 310 /**
shintamainjp 0:238f2d048222 311 * Middle Level Interface.
shintamainjp 0:238f2d048222 312 *
shintamainjp 0:238f2d048222 313 * Set display on/off.
shintamainjp 0:238f2d048222 314 *
shintamainjp 0:238f2d048222 315 * @param t Target (CS1, CS2).
shintamainjp 0:238f2d048222 316 * @param on ON/OFF (true, false).
shintamainjp 0:238f2d048222 317 */
shintamainjp 0:238f2d048222 318 void SG12864A::setDisplayOnOff(Target t, bool on) {
shintamainjp 0:238f2d048222 319 setDirectionToWrite();
shintamainjp 0:238f2d048222 320 uint8_t c = 0x3e | (on ? 0x01 : 0x00);
shintamainjp 0:238f2d048222 321 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 322 wait_us(1);
shintamainjp 0:238f2d048222 323 }
shintamainjp 0:238f2d048222 324
shintamainjp 0:238f2d048222 325 /**
shintamainjp 0:238f2d048222 326 * Middle Level Interface.
shintamainjp 0:238f2d048222 327 *
shintamainjp 0:238f2d048222 328 * Set display start line.
shintamainjp 0:238f2d048222 329 *
shintamainjp 0:238f2d048222 330 * @param t Target (CS1, CS2).
shintamainjp 0:238f2d048222 331 * @param addr Display start line (0-63).
shintamainjp 0:238f2d048222 332 */
shintamainjp 0:238f2d048222 333 void SG12864A::setDisplayStartLine(Target t, uint8_t addr) {
shintamainjp 0:238f2d048222 334 setDirectionToWrite();
shintamainjp 0:238f2d048222 335 uint8_t c = 0xc0 | (addr & 0x3f);
shintamainjp 0:238f2d048222 336 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 337 wait_us(1);
shintamainjp 0:238f2d048222 338 }
shintamainjp 0:238f2d048222 339
shintamainjp 0:238f2d048222 340 /**
shintamainjp 0:238f2d048222 341 * Middle Level Interface.
shintamainjp 0:238f2d048222 342 *
shintamainjp 0:238f2d048222 343 * Set page address.
shintamainjp 0:238f2d048222 344 *
shintamainjp 0:238f2d048222 345 * @param t Target (CS1, CS2).
shintamainjp 0:238f2d048222 346 * @param addr Page address(0-7).
shintamainjp 0:238f2d048222 347 */
shintamainjp 0:238f2d048222 348 void SG12864A::setPageAddress(Target t, uint8_t addr) {
shintamainjp 0:238f2d048222 349 setDirectionToWrite();
shintamainjp 0:238f2d048222 350 uint8_t c = 0xb8 | (addr & 0x07);
shintamainjp 0:238f2d048222 351 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 352 wait_us(1);
shintamainjp 0:238f2d048222 353 }
shintamainjp 0:238f2d048222 354
shintamainjp 0:238f2d048222 355 /**
shintamainjp 0:238f2d048222 356 * Middle Level Interface.
shintamainjp 0:238f2d048222 357 *
shintamainjp 0:238f2d048222 358 * Set column address.
shintamainjp 0:238f2d048222 359 *
shintamainjp 0:238f2d048222 360 * @param t Target. (CS1, CS2)
shintamainjp 0:238f2d048222 361 * @param addr Column address (0-63).
shintamainjp 0:238f2d048222 362 */
shintamainjp 0:238f2d048222 363 void SG12864A::setColumnAddress(Target t, uint8_t addr) {
shintamainjp 0:238f2d048222 364 setDirectionToWrite();
shintamainjp 0:238f2d048222 365 uint8_t c = 0x40 | (addr & 0x3f);
shintamainjp 0:238f2d048222 366 write(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 367 wait_us(1);
shintamainjp 0:238f2d048222 368 }
shintamainjp 0:238f2d048222 369
shintamainjp 0:238f2d048222 370 /**
shintamainjp 0:238f2d048222 371 * Middle Level Interface.
shintamainjp 0:238f2d048222 372 */
shintamainjp 0:238f2d048222 373 void SG12864A::readStatus(Target t, uint8_t *c) {
shintamainjp 0:238f2d048222 374 setDirectionToRead();
shintamainjp 0:238f2d048222 375 read(t, SG12864A::Instruction, c);
shintamainjp 0:238f2d048222 376 wait_us(1);
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 void SG12864A::writeData(Target t, uint8_t c) {
shintamainjp 0:238f2d048222 383 setDirectionToWrite();
shintamainjp 0:238f2d048222 384 write(t, SG12864A::Data, c);
shintamainjp 0:238f2d048222 385 wait_us(1);
shintamainjp 0:238f2d048222 386 }
shintamainjp 0:238f2d048222 387
shintamainjp 0:238f2d048222 388 /**
shintamainjp 0:238f2d048222 389 * Middle Level Interface.
shintamainjp 0:238f2d048222 390 */
shintamainjp 0:238f2d048222 391 void SG12864A::readData(Target t, uint8_t *c) {
shintamainjp 0:238f2d048222 392 setDirectionToRead();
shintamainjp 0:238f2d048222 393 read(t, SG12864A::Data, c);
shintamainjp 0:238f2d048222 394 wait_us(1);
shintamainjp 0:238f2d048222 395 }
shintamainjp 0:238f2d048222 396
shintamainjp 0:238f2d048222 397 /**
shintamainjp 0:238f2d048222 398 * Low Level Interface.
shintamainjp 0:238f2d048222 399 */
shintamainjp 0:238f2d048222 400 void SG12864A::setDirectionToRead() {
shintamainjp 0:238f2d048222 401 ioDB.input();
shintamainjp 0:238f2d048222 402 ioRW = 1;
shintamainjp 0:238f2d048222 403 }
shintamainjp 0:238f2d048222 404
shintamainjp 0:238f2d048222 405 /**
shintamainjp 0:238f2d048222 406 * Low Level Interface.
shintamainjp 0:238f2d048222 407 */
shintamainjp 0:238f2d048222 408 void SG12864A::setDirectionToWrite() {
shintamainjp 0:238f2d048222 409 ioDB.output();
shintamainjp 0:238f2d048222 410 ioRW = 0;
shintamainjp 0:238f2d048222 411 }
shintamainjp 0:238f2d048222 412
shintamainjp 0:238f2d048222 413 /**
shintamainjp 0:238f2d048222 414 * Low Level Interface.
shintamainjp 0:238f2d048222 415 */
shintamainjp 0:238f2d048222 416 void SG12864A::write(Target t, Mode m, uint8_t c) {
shintamainjp 0:238f2d048222 417 switch (t) {
shintamainjp 0:238f2d048222 418 case CS1:
shintamainjp 0:238f2d048222 419 ioCS1 = 1;
shintamainjp 0:238f2d048222 420 ioCS2 = 0;
shintamainjp 0:238f2d048222 421 break;
shintamainjp 0:238f2d048222 422 case CS2:
shintamainjp 0:238f2d048222 423 ioCS1 = 0;
shintamainjp 0:238f2d048222 424 ioCS2 = 1;
shintamainjp 0:238f2d048222 425 break;
shintamainjp 0:238f2d048222 426 }
shintamainjp 0:238f2d048222 427 switch (m) {
shintamainjp 0:238f2d048222 428 case Data:
shintamainjp 0:238f2d048222 429 ioDI = 1;
shintamainjp 0:238f2d048222 430 break;
shintamainjp 0:238f2d048222 431 case Instruction:
shintamainjp 0:238f2d048222 432 ioDI = 0;
shintamainjp 0:238f2d048222 433 break;
shintamainjp 0:238f2d048222 434 }
shintamainjp 0:238f2d048222 435 ioDB = c;
shintamainjp 0:238f2d048222 436 wait_us(1);
shintamainjp 0:238f2d048222 437 ioEN = 1;
shintamainjp 0:238f2d048222 438 wait_us(1);
shintamainjp 0:238f2d048222 439 ioEN = 0;
shintamainjp 0:238f2d048222 440 wait_us(5);
shintamainjp 0:238f2d048222 441 }
shintamainjp 0:238f2d048222 442
shintamainjp 0:238f2d048222 443 /**
shintamainjp 0:238f2d048222 444 * Low Level Interface.
shintamainjp 0:238f2d048222 445 */
shintamainjp 0:238f2d048222 446 void SG12864A::read(Target t, Mode m, uint8_t *c) {
shintamainjp 0:238f2d048222 447 // TODO
shintamainjp 0:238f2d048222 448 }
shintamainjp 0:238f2d048222 449
shintamainjp 0:238f2d048222 450 /**
shintamainjp 0:238f2d048222 451 * Low Level Interface.
shintamainjp 0:238f2d048222 452 */
shintamainjp 0:238f2d048222 453 void SG12864A::reset(bool b) {
shintamainjp 0:238f2d048222 454 if (b) {
shintamainjp 0:238f2d048222 455 ioRES = 0;
shintamainjp 0:238f2d048222 456 } else {
shintamainjp 0:238f2d048222 457 ioRES = 1;
shintamainjp 0:238f2d048222 458 }
shintamainjp 0:238f2d048222 459 }