Text console library for ST7565 graphics LCD controller over SPI interface.
Dependents: TextLCD_ST7565SPI_Test OpPanel_Offline OpPanel_Offline_cmake_gcc_arm_NUCLEO_F303RENew
TextLCD_ST7565SPI.cpp@2:5a627a1745f2, 2015-05-25 (annotated)
- Committer:
- kayekss
- Date:
- Mon May 25 15:43:27 2015 +0000
- Revision:
- 2:5a627a1745f2
- Parent:
- 1:a32310f5dab1
Fixed comment
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kayekss | 0:1ea133b6a4de | 1 | // ==================================================== Mar 03 2015, kayeks == |
kayekss | 0:1ea133b6a4de | 2 | // TextLCD_ST7565SPI.cpp |
kayekss | 0:1ea133b6a4de | 3 | // =========================================================================== |
kayekss | 0:1ea133b6a4de | 4 | // Text console library for ST7565 graphics LCD controller over SPI interface. |
kayekss | 0:1ea133b6a4de | 5 | |
kayekss | 0:1ea133b6a4de | 6 | #include <string.h> |
kayekss | 0:1ea133b6a4de | 7 | #include "TextLCD_ST7565SPI.h" |
kayekss | 0:1ea133b6a4de | 8 | |
kayekss | 0:1ea133b6a4de | 9 | const uint8_t TextLCD_ST7565SPI::FONT_5X7[128][5] = { |
kayekss | 2:5a627a1745f2 | 10 | // 00h..07h |
kayekss | 0:1ea133b6a4de | 11 | { 0x77, 0x55, 0x55, 0x55, 0x77 }, // unimplemented NUL |
kayekss | 0:1ea133b6a4de | 12 | { 0x77, 0x52, 0x52, 0x52, 0x76 }, // unimplemented SOH |
kayekss | 0:1ea133b6a4de | 13 | { 0x77, 0x54, 0x57, 0x51, 0x77 }, // unimplemented STX |
kayekss | 0:1ea133b6a4de | 14 | { 0x77, 0x51, 0x56, 0x51, 0x77 }, // unimplemented ETX |
kayekss | 0:1ea133b6a4de | 15 | { 0x71, 0x57, 0x55, 0x55, 0x71 }, // unimplemented EOT |
kayekss | 0:1ea133b6a4de | 16 | { 0x77, 0x51, 0x57, 0x54, 0x77 }, // unimplemented ENQ |
kayekss | 0:1ea133b6a4de | 17 | { 0x77, 0x55, 0x57, 0x54, 0x77 }, // unimplemented ACK |
kayekss | 0:1ea133b6a4de | 18 | { 0x74, 0x54, 0x52, 0x51, 0x77 }, // unimplemented BEL |
kayekss | 0:1ea133b6a4de | 19 | // 08h..0Fh |
kayekss | 0:1ea133b6a4de | 20 | { 0x77, 0x55, 0x57, 0x55, 0x77 }, // unimplemented BS |
kayekss | 0:1ea133b6a4de | 21 | { 0x77, 0x51, 0x57, 0x55, 0x77 }, // unimplemented HT |
kayekss | 0:1ea133b6a4de | 22 | { 0x75, 0x57, 0x55, 0x55, 0x77 }, // unimplemented LF |
kayekss | 0:1ea133b6a4de | 23 | { 0x77, 0x55, 0x55, 0x57, 0x74 }, // unimplemented VT |
kayekss | 0:1ea133b6a4de | 24 | { 0x77, 0x54, 0x54, 0x54, 0x77 }, // unimplemented FF |
kayekss | 0:1ea133b6a4de | 25 | { 0x77, 0x55, 0x55, 0x57, 0x71 }, // unimplemented CR |
kayekss | 0:1ea133b6a4de | 26 | { 0x77, 0x54, 0x57, 0x54, 0x77 }, // unimplemented SO |
kayekss | 0:1ea133b6a4de | 27 | { 0x74, 0x54, 0x57, 0x54, 0x77 }, // unimplemented SI |
kayekss | 0:1ea133b6a4de | 28 | // 10h..17h |
kayekss | 0:1ea133b6a4de | 29 | { 0x77, 0x25, 0x25, 0x25, 0x67 }, // unimplemented DLE |
kayekss | 0:1ea133b6a4de | 30 | { 0x77, 0x22, 0x22, 0x22, 0x66 }, // unimplemented DC1 |
kayekss | 0:1ea133b6a4de | 31 | { 0x77, 0x24, 0x27, 0x21, 0x67 }, // unimplemented DC2 |
kayekss | 0:1ea133b6a4de | 32 | { 0x77, 0x21, 0x26, 0x21, 0x67 }, // unimplemented DC3 |
kayekss | 0:1ea133b6a4de | 33 | { 0x71, 0x27, 0x25, 0x25, 0x61 }, // unimplemented DC4 |
kayekss | 0:1ea133b6a4de | 34 | { 0x77, 0x21, 0x27, 0x24, 0x67 }, // unimplemented NAK |
kayekss | 0:1ea133b6a4de | 35 | { 0x77, 0x25, 0x27, 0x24, 0x67 }, // unimplemented SYN |
kayekss | 0:1ea133b6a4de | 36 | { 0x74, 0x24, 0x22, 0x21, 0x67 }, // unimplemented ETB |
kayekss | 0:1ea133b6a4de | 37 | // 18h..1Fh |
kayekss | 0:1ea133b6a4de | 38 | { 0x77, 0x25, 0x27, 0x25, 0x67 }, // unimplemented CAN |
kayekss | 0:1ea133b6a4de | 39 | { 0x77, 0x21, 0x27, 0x25, 0x67 }, // unimplemented EM |
kayekss | 0:1ea133b6a4de | 40 | { 0x75, 0x27, 0x25, 0x25, 0x67 }, // unimplemented SUB |
kayekss | 0:1ea133b6a4de | 41 | { 0x77, 0x25, 0x25, 0x27, 0x64 }, // unimplemented ESC |
kayekss | 0:1ea133b6a4de | 42 | { 0x77, 0x24, 0x24, 0x24, 0x67 }, // unimplemented FS |
kayekss | 0:1ea133b6a4de | 43 | { 0x77, 0x25, 0x25, 0x27, 0x61 }, // unimplemented GS |
kayekss | 0:1ea133b6a4de | 44 | { 0x77, 0x24, 0x27, 0x24, 0x67 }, // unimplemented RS |
kayekss | 2:5a627a1745f2 | 45 | { 0x74, 0x24, 0x27, 0x24, 0x67 }, // unimplemented US |
kayekss | 0:1ea133b6a4de | 46 | // 20h..27h |
kayekss | 0:1ea133b6a4de | 47 | { 0x00, 0x00, 0x00, 0x00, 0x00 }, // SPC |
kayekss | 0:1ea133b6a4de | 48 | { 0x00, 0x00, 0x7d, 0x00, 0x00 }, // ! |
kayekss | 0:1ea133b6a4de | 49 | { 0x00, 0x60, 0x00, 0x60, 0x00 }, // " |
kayekss | 0:1ea133b6a4de | 50 | { 0x22, 0x7f, 0x22, 0x7f, 0x22 }, // # |
kayekss | 0:1ea133b6a4de | 51 | { 0x32, 0x49, 0x7f, 0x49, 0x26 }, // $ |
kayekss | 0:1ea133b6a4de | 52 | { 0x72, 0x54, 0x7f, 0x15, 0x27 }, // % |
kayekss | 0:1ea133b6a4de | 53 | { 0x36, 0x49, 0x75, 0x02, 0x0d }, // & |
kayekss | 0:1ea133b6a4de | 54 | { 0x00, 0x20, 0x40, 0x00, 0x00 }, // ' |
kayekss | 0:1ea133b6a4de | 55 | // 28h..2Fh |
kayekss | 0:1ea133b6a4de | 56 | { 0x00, 0x00, 0x00, 0x3e, 0x41 }, // ( |
kayekss | 0:1ea133b6a4de | 57 | { 0x41, 0x3e, 0x00, 0x00, 0x00 }, // ) |
kayekss | 0:1ea133b6a4de | 58 | { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * |
kayekss | 0:1ea133b6a4de | 59 | { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + |
kayekss | 0:1ea133b6a4de | 60 | { 0x00, 0x01, 0x02, 0x00, 0x00 }, // , |
kayekss | 0:1ea133b6a4de | 61 | { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - |
kayekss | 0:1ea133b6a4de | 62 | { 0x00, 0x00, 0x01, 0x00, 0x00 }, // . |
kayekss | 0:1ea133b6a4de | 63 | { 0x00, 0x03, 0x1c, 0x60, 0x00 }, // / |
kayekss | 0:1ea133b6a4de | 64 | // 30h..37h |
kayekss | 0:1ea133b6a4de | 65 | { 0x3e, 0x41, 0x49, 0x41, 0x3e }, // 0 |
kayekss | 0:1ea133b6a4de | 66 | { 0x00, 0x41, 0x7f, 0x01, 0x00 }, // 1 |
kayekss | 0:1ea133b6a4de | 67 | { 0x27, 0x49, 0x49, 0x49, 0x31 }, // 2 |
kayekss | 0:1ea133b6a4de | 68 | { 0x42, 0x41, 0x51, 0x51, 0x6e }, // 3 |
kayekss | 0:1ea133b6a4de | 69 | { 0x0e, 0x12, 0x22, 0x7f, 0x02 }, // 4 |
kayekss | 0:1ea133b6a4de | 70 | { 0x72, 0x51, 0x51, 0x51, 0x4e }, // 5 |
kayekss | 0:1ea133b6a4de | 71 | { 0x3e, 0x51, 0x51, 0x51, 0x0e }, // 6 |
kayekss | 0:1ea133b6a4de | 72 | { 0x40, 0x40, 0x47, 0x58, 0x60 }, // 7 |
kayekss | 0:1ea133b6a4de | 73 | // 38h..3Fh |
kayekss | 0:1ea133b6a4de | 74 | { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 |
kayekss | 0:1ea133b6a4de | 75 | { 0x38, 0x45, 0x45, 0x45, 0x3e }, // 9 |
kayekss | 0:1ea133b6a4de | 76 | { 0x00, 0x00, 0x12, 0x00, 0x00 }, // : |
kayekss | 0:1ea133b6a4de | 77 | { 0x00, 0x01, 0x12, 0x00, 0x00 }, // ; |
kayekss | 0:1ea133b6a4de | 78 | { 0x00, 0x08, 0x14, 0x22, 0x41 }, // < |
kayekss | 0:1ea133b6a4de | 79 | { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = |
kayekss | 0:1ea133b6a4de | 80 | { 0x41, 0x22, 0x14, 0x08, 0x00 }, // > |
kayekss | 0:1ea133b6a4de | 81 | { 0x20, 0x40, 0x45, 0x48, 0x30 }, // ? |
kayekss | 0:1ea133b6a4de | 82 | // 40h..47h |
kayekss | 0:1ea133b6a4de | 83 | { 0x3e, 0x41, 0x5d, 0x55, 0x3c }, // @ |
kayekss | 0:1ea133b6a4de | 84 | { 0x0f, 0x34, 0x44, 0x34, 0x0f }, // A |
kayekss | 0:1ea133b6a4de | 85 | { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B |
kayekss | 0:1ea133b6a4de | 86 | { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C |
kayekss | 0:1ea133b6a4de | 87 | { 0x7f, 0x41, 0x41, 0x41, 0x3e }, // D |
kayekss | 0:1ea133b6a4de | 88 | { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E |
kayekss | 0:1ea133b6a4de | 89 | { 0x7f, 0x48, 0x48, 0x48, 0x40 }, // F |
kayekss | 0:1ea133b6a4de | 90 | { 0x3e, 0x41, 0x49, 0x49, 0x2e }, // G |
kayekss | 0:1ea133b6a4de | 91 | // 48h..4Fh |
kayekss | 0:1ea133b6a4de | 92 | { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H |
kayekss | 0:1ea133b6a4de | 93 | { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I |
kayekss | 0:1ea133b6a4de | 94 | { 0x02, 0x01, 0x01, 0x41, 0x7e }, // J |
kayekss | 0:1ea133b6a4de | 95 | { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K |
kayekss | 0:1ea133b6a4de | 96 | { 0x7f, 0x01, 0x01, 0x01, 0x01 }, // L |
kayekss | 0:1ea133b6a4de | 97 | { 0x7f, 0x20, 0x1c, 0x20, 0x7f }, // M |
kayekss | 0:1ea133b6a4de | 98 | { 0x7f, 0x20, 0x10, 0x08, 0x7f }, // N |
kayekss | 0:1ea133b6a4de | 99 | { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O |
kayekss | 0:1ea133b6a4de | 100 | // 50h..57h |
kayekss | 0:1ea133b6a4de | 101 | { 0x7f, 0x48, 0x48, 0x48, 0x30 }, // P |
kayekss | 0:1ea133b6a4de | 102 | { 0x3e, 0x41, 0x45, 0x42, 0x3d }, // Q |
kayekss | 0:1ea133b6a4de | 103 | { 0x7f, 0x48, 0x4c, 0x4a, 0x31 }, // R |
kayekss | 0:1ea133b6a4de | 104 | { 0x32, 0x49, 0x49, 0x49, 0x26 }, // S |
kayekss | 0:1ea133b6a4de | 105 | { 0x40, 0x40, 0x7f, 0x40, 0x40 }, // T |
kayekss | 0:1ea133b6a4de | 106 | { 0x7e, 0x01, 0x01, 0x01, 0x7e }, // U |
kayekss | 0:1ea133b6a4de | 107 | { 0x78, 0x06, 0x01, 0x06, 0x78 }, // V |
kayekss | 0:1ea133b6a4de | 108 | { 0x7e, 0x01, 0x1e, 0x01, 0x7e }, // W |
kayekss | 0:1ea133b6a4de | 109 | // 58h..5Fh |
kayekss | 0:1ea133b6a4de | 110 | { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X |
kayekss | 0:1ea133b6a4de | 111 | { 0x60, 0x10, 0x0f, 0x10, 0x60 }, // Y |
kayekss | 0:1ea133b6a4de | 112 | { 0x43, 0x45, 0x49, 0x51, 0x61 }, // Z |
kayekss | 0:1ea133b6a4de | 113 | { 0x00, 0x00, 0x00, 0x7f, 0x41 }, // [ |
kayekss | 0:1ea133b6a4de | 114 | { 0x00, 0x60, 0x1c, 0x03, 0x00 }, // backslash |
kayekss | 0:1ea133b6a4de | 115 | { 0x41, 0x7f, 0x00, 0x00, 0x00 }, // ] |
kayekss | 0:1ea133b6a4de | 116 | { 0x00, 0x20, 0x40, 0x20, 0x00 }, // ^ |
kayekss | 0:1ea133b6a4de | 117 | { 0x01, 0x01, 0x01, 0x01, 0x01 }, // _ |
kayekss | 0:1ea133b6a4de | 118 | // 60h..67h |
kayekss | 0:1ea133b6a4de | 119 | { 0x00, 0x00, 0x40, 0x20, 0x00 }, // ` |
kayekss | 0:1ea133b6a4de | 120 | { 0x02, 0x15, 0x15, 0x15, 0x0f }, // a |
kayekss | 0:1ea133b6a4de | 121 | { 0x7f, 0x11, 0x11, 0x11, 0x0e }, // b |
kayekss | 0:1ea133b6a4de | 122 | { 0x0e, 0x11, 0x11, 0x11, 0x0a }, // c |
kayekss | 0:1ea133b6a4de | 123 | { 0x0e, 0x11, 0x11, 0x11, 0x7f }, // d |
kayekss | 0:1ea133b6a4de | 124 | { 0x0e, 0x15, 0x15, 0x15, 0x0c }, // e |
kayekss | 0:1ea133b6a4de | 125 | { 0x00, 0x08, 0x3f, 0x48, 0x48 }, // f |
kayekss | 0:1ea133b6a4de | 126 | { 0x08, 0x15, 0x15, 0x15, 0x1e }, // g |
kayekss | 0:1ea133b6a4de | 127 | // 68h..6Fh |
kayekss | 0:1ea133b6a4de | 128 | { 0x7f, 0x10, 0x10, 0x10, 0x0f }, // h |
kayekss | 0:1ea133b6a4de | 129 | { 0x00, 0x10, 0x5f, 0x00, 0x00 }, // i |
kayekss | 0:1ea133b6a4de | 130 | { 0x01, 0x11, 0x5e, 0x00, 0x00 }, // j |
kayekss | 0:1ea133b6a4de | 131 | { 0x00, 0x7f, 0x04, 0x0a, 0x11 }, // k |
kayekss | 0:1ea133b6a4de | 132 | { 0x00, 0x40, 0x7f, 0x00, 0x00 }, // l |
kayekss | 0:1ea133b6a4de | 133 | { 0x1f, 0x10, 0x1f, 0x10, 0x0f }, // m |
kayekss | 0:1ea133b6a4de | 134 | { 0x1f, 0x10, 0x10, 0x10, 0x0f }, // n |
kayekss | 0:1ea133b6a4de | 135 | { 0x0e, 0x11, 0x11, 0x11, 0x0e }, // o |
kayekss | 0:1ea133b6a4de | 136 | // 70h..77h |
kayekss | 0:1ea133b6a4de | 137 | { 0x1f, 0x12, 0x12, 0x12, 0x0c }, // p |
kayekss | 0:1ea133b6a4de | 138 | { 0x0c, 0x12, 0x12, 0x12, 0x1f }, // q |
kayekss | 0:1ea133b6a4de | 139 | { 0x1f, 0x08, 0x10, 0x10, 0x10 }, // r |
kayekss | 0:1ea133b6a4de | 140 | { 0x09, 0x15, 0x15, 0x15, 0x12 }, // s |
kayekss | 0:1ea133b6a4de | 141 | { 0x00, 0x3e, 0x11, 0x11, 0x00 }, // t |
kayekss | 0:1ea133b6a4de | 142 | { 0x1e, 0x01, 0x01, 0x01, 0x1f }, // u |
kayekss | 0:1ea133b6a4de | 143 | { 0x18, 0x06, 0x01, 0x06, 0x18 }, // v |
kayekss | 0:1ea133b6a4de | 144 | { 0x1e, 0x01, 0x0e, 0x01, 0x1e }, // w |
kayekss | 0:1ea133b6a4de | 145 | // 78h..7Fh |
kayekss | 0:1ea133b6a4de | 146 | { 0x11, 0x0a, 0x04, 0x0a, 0x11 }, // x |
kayekss | 0:1ea133b6a4de | 147 | { 0x18, 0x05, 0x05, 0x05, 0x1e }, // y |
kayekss | 0:1ea133b6a4de | 148 | { 0x11, 0x13, 0x15, 0x19, 0x11 }, // z |
kayekss | 0:1ea133b6a4de | 149 | { 0x00, 0x00, 0x08, 0x7f, 0x41 }, // { |
kayekss | 0:1ea133b6a4de | 150 | { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | |
kayekss | 0:1ea133b6a4de | 151 | { 0x41, 0x7f, 0x08, 0x00, 0x00 }, // } |
kayekss | 0:1ea133b6a4de | 152 | { 0x08, 0x10, 0x18, 0x08, 0x10 }, // ~ |
kayekss | 0:1ea133b6a4de | 153 | { 0x44, 0x44, 0x77, 0x44, 0x77 } // unimplemented DEL |
kayekss | 0:1ea133b6a4de | 154 | }; |
kayekss | 0:1ea133b6a4de | 155 | |
kayekss | 0:1ea133b6a4de | 156 | TextLCD_ST7565SPI::TextLCD_ST7565SPI(PinName mosi, PinName sck, PinName cs, |
kayekss | 0:1ea133b6a4de | 157 | PinName rs, PinName rst, |
kayekss | 0:1ea133b6a4de | 158 | uint8_t columns, uint8_t rows) |
kayekss | 0:1ea133b6a4de | 159 | : |
kayekss | 0:1ea133b6a4de | 160 | _rs(rs), |
kayekss | 0:1ea133b6a4de | 161 | _rst(rst), |
kayekss | 0:1ea133b6a4de | 162 | _spi(mosi, NC, sck), |
kayekss | 0:1ea133b6a4de | 163 | _cs(cs) |
kayekss | 0:1ea133b6a4de | 164 | { |
kayekss | 0:1ea133b6a4de | 165 | // Allocate line buffer |
kayekss | 0:1ea133b6a4de | 166 | _columns = columns; |
kayekss | 0:1ea133b6a4de | 167 | _rows = rows; |
kayekss | 0:1ea133b6a4de | 168 | _lineBuffer = new uint8_t*[_rows]; |
kayekss | 0:1ea133b6a4de | 169 | for (uint8_t i = 0; i < _rows; i++) { |
kayekss | 0:1ea133b6a4de | 170 | _lineBuffer[i] = new uint8_t[_columns]; |
kayekss | 0:1ea133b6a4de | 171 | } |
kayekss | 0:1ea133b6a4de | 172 | |
kayekss | 0:1ea133b6a4de | 173 | // Initialize SPI |
kayekss | 0:1ea133b6a4de | 174 | _spi.format(8, 0); |
kayekss | 0:1ea133b6a4de | 175 | |
kayekss | 0:1ea133b6a4de | 176 | // Initialize pins |
kayekss | 0:1ea133b6a4de | 177 | _rs = 0; |
kayekss | 0:1ea133b6a4de | 178 | _rst = 1; |
kayekss | 0:1ea133b6a4de | 179 | _cs = 1; |
kayekss | 0:1ea133b6a4de | 180 | |
kayekss | 0:1ea133b6a4de | 181 | reset(); |
kayekss | 0:1ea133b6a4de | 182 | } |
kayekss | 0:1ea133b6a4de | 183 | |
kayekss | 0:1ea133b6a4de | 184 | TextLCD_ST7565SPI::~TextLCD_ST7565SPI() { |
kayekss | 0:1ea133b6a4de | 185 | for (uint8_t i = 0; i < _rows; i++) { |
kayekss | 0:1ea133b6a4de | 186 | delete[] _lineBuffer[i]; |
kayekss | 0:1ea133b6a4de | 187 | } |
kayekss | 0:1ea133b6a4de | 188 | delete[] _lineBuffer; |
kayekss | 0:1ea133b6a4de | 189 | } |
kayekss | 0:1ea133b6a4de | 190 | |
kayekss | 0:1ea133b6a4de | 191 | void TextLCD_ST7565SPI::reset() { |
kayekss | 0:1ea133b6a4de | 192 | wait_ms(10); |
kayekss | 0:1ea133b6a4de | 193 | _rst = 0; |
kayekss | 0:1ea133b6a4de | 194 | wait_ms(10); |
kayekss | 0:1ea133b6a4de | 195 | _rst = 1; |
kayekss | 0:1ea133b6a4de | 196 | } |
kayekss | 0:1ea133b6a4de | 197 | |
kayekss | 0:1ea133b6a4de | 198 | void TextLCD_ST7565SPI::clear() { |
kayekss | 0:1ea133b6a4de | 199 | for (uint8_t j = 7; j <= 7; j--) { |
kayekss | 0:1ea133b6a4de | 200 | setPage(j); |
kayekss | 0:1ea133b6a4de | 201 | setColumn(0); |
kayekss | 0:1ea133b6a4de | 202 | for (uint8_t i = 0; i < 132; i++) { |
kayekss | 0:1ea133b6a4de | 203 | data(0x00); |
kayekss | 0:1ea133b6a4de | 204 | } |
kayekss | 0:1ea133b6a4de | 205 | } |
kayekss | 0:1ea133b6a4de | 206 | } |
kayekss | 0:1ea133b6a4de | 207 | |
kayekss | 0:1ea133b6a4de | 208 | void TextLCD_ST7565SPI::init(uint8_t v0, uint8_t contrast, Bias bias) { |
kayekss | 0:1ea133b6a4de | 209 | command(INTERNAL_RESET); |
kayekss | 0:1ea133b6a4de | 210 | wait_ms(5); |
kayekss | 0:1ea133b6a4de | 211 | |
kayekss | 0:1ea133b6a4de | 212 | command(DISPLAY_ON); |
kayekss | 0:1ea133b6a4de | 213 | command(PCTRL_BOOSTER_ON | PCTRL_REGULATOR_ON | PCTRL_VFOLLOWER_ON); |
kayekss | 0:1ea133b6a4de | 214 | command(V0_INTERNAL_R_0 + (v0 & 0x07)); |
kayekss | 0:1ea133b6a4de | 215 | command(ELECTRONIC_VOL_MODE); |
kayekss | 0:1ea133b6a4de | 216 | if (contrast == 0) { |
kayekss | 0:1ea133b6a4de | 217 | contrast = 1; |
kayekss | 0:1ea133b6a4de | 218 | } |
kayekss | 0:1ea133b6a4de | 219 | command(ELECTRONIC_VOL_1 - 1 + (contrast & 0x3f)); |
kayekss | 0:1ea133b6a4de | 220 | switch (bias) { |
kayekss | 0:1ea133b6a4de | 221 | case Bias1_7: |
kayekss | 0:1ea133b6a4de | 222 | command(BIAS_1_7); |
kayekss | 0:1ea133b6a4de | 223 | break; |
kayekss | 0:1ea133b6a4de | 224 | case Bias1_9: |
kayekss | 0:1ea133b6a4de | 225 | command(BIAS_1_9); |
kayekss | 0:1ea133b6a4de | 226 | } |
kayekss | 0:1ea133b6a4de | 227 | command(COMMON_ASCENDING); |
kayekss | 0:1ea133b6a4de | 228 | command(SEGMENT_ASCENDING); |
kayekss | 0:1ea133b6a4de | 229 | command(ENTIRE_DISPLAY_OFF); |
kayekss | 0:1ea133b6a4de | 230 | command(INVERT_DISPLAY_OFF); |
kayekss | 0:1ea133b6a4de | 231 | command(COMMON_OFFSET); |
kayekss | 0:1ea133b6a4de | 232 | cls(); |
kayekss | 0:1ea133b6a4de | 233 | } |
kayekss | 0:1ea133b6a4de | 234 | |
kayekss | 0:1ea133b6a4de | 235 | void TextLCD_ST7565SPI::cls() { |
kayekss | 0:1ea133b6a4de | 236 | clear(); |
kayekss | 0:1ea133b6a4de | 237 | for (uint8_t j = 0; j < _rows; j++) { |
kayekss | 0:1ea133b6a4de | 238 | memset(_lineBuffer[j], ' ', _columns); |
kayekss | 0:1ea133b6a4de | 239 | } |
kayekss | 0:1ea133b6a4de | 240 | _column = 0; |
kayekss | 0:1ea133b6a4de | 241 | _row = 0; |
kayekss | 0:1ea133b6a4de | 242 | } |
kayekss | 0:1ea133b6a4de | 243 | |
kayekss | 0:1ea133b6a4de | 244 | void TextLCD_ST7565SPI::locate(uint8_t column, uint8_t row) { |
kayekss | 0:1ea133b6a4de | 245 | if (column < _columns && row < _rows) { |
kayekss | 0:1ea133b6a4de | 246 | setPage(_rows - row - 1); |
kayekss | 0:1ea133b6a4de | 247 | setColumn(6 * column); |
kayekss | 0:1ea133b6a4de | 248 | _column = column; |
kayekss | 0:1ea133b6a4de | 249 | _row = row; |
kayekss | 0:1ea133b6a4de | 250 | } |
kayekss | 0:1ea133b6a4de | 251 | } |
kayekss | 0:1ea133b6a4de | 252 | |
kayekss | 0:1ea133b6a4de | 253 | int TextLCD_ST7565SPI::_putc(int c) { |
kayekss | 0:1ea133b6a4de | 254 | switch (c) { |
kayekss | 0:1ea133b6a4de | 255 | case '\r': // Carriage return |
kayekss | 0:1ea133b6a4de | 256 | _column = 0; |
kayekss | 0:1ea133b6a4de | 257 | locate(_column, _row); |
kayekss | 0:1ea133b6a4de | 258 | break; |
kayekss | 0:1ea133b6a4de | 259 | case '\n': // Line feed |
kayekss | 0:1ea133b6a4de | 260 | if (_row == _rows - 1) { |
kayekss | 0:1ea133b6a4de | 261 | shiftUp(); |
kayekss | 0:1ea133b6a4de | 262 | } else { |
kayekss | 0:1ea133b6a4de | 263 | _row++; |
kayekss | 0:1ea133b6a4de | 264 | } |
kayekss | 0:1ea133b6a4de | 265 | break; |
kayekss | 1:a32310f5dab1 | 266 | case '\f': // Form feed |
kayekss | 1:a32310f5dab1 | 267 | // Clear screen |
kayekss | 1:a32310f5dab1 | 268 | cls(); |
kayekss | 1:a32310f5dab1 | 269 | break; |
kayekss | 0:1ea133b6a4de | 270 | default: |
kayekss | 0:1ea133b6a4de | 271 | // Break line if the cursor reaches end |
kayekss | 0:1ea133b6a4de | 272 | if (_column == _columns) { |
kayekss | 0:1ea133b6a4de | 273 | if (_row == _rows - 1) { |
kayekss | 0:1ea133b6a4de | 274 | shiftUp(); |
kayekss | 0:1ea133b6a4de | 275 | } else { |
kayekss | 0:1ea133b6a4de | 276 | _row++; |
kayekss | 0:1ea133b6a4de | 277 | } |
kayekss | 0:1ea133b6a4de | 278 | _column = 0; |
kayekss | 0:1ea133b6a4de | 279 | } |
kayekss | 0:1ea133b6a4de | 280 | locate(_column, _row); |
kayekss | 0:1ea133b6a4de | 281 | for (uint8_t k = 0; k < 5; k++) { |
kayekss | 0:1ea133b6a4de | 282 | data(FONT_5X7[c][k]); |
kayekss | 0:1ea133b6a4de | 283 | } |
kayekss | 0:1ea133b6a4de | 284 | data(0x00); |
kayekss | 0:1ea133b6a4de | 285 | _lineBuffer[_row][_column] = c; |
kayekss | 0:1ea133b6a4de | 286 | _column++; |
kayekss | 0:1ea133b6a4de | 287 | break; |
kayekss | 0:1ea133b6a4de | 288 | } |
kayekss | 0:1ea133b6a4de | 289 | return 0; |
kayekss | 0:1ea133b6a4de | 290 | } |
kayekss | 0:1ea133b6a4de | 291 | |
kayekss | 0:1ea133b6a4de | 292 | int TextLCD_ST7565SPI::_getc() { |
kayekss | 0:1ea133b6a4de | 293 | return 0; |
kayekss | 0:1ea133b6a4de | 294 | } |
kayekss | 0:1ea133b6a4de | 295 | |
kayekss | 0:1ea133b6a4de | 296 | void TextLCD_ST7565SPI::shiftUp() { |
kayekss | 0:1ea133b6a4de | 297 | // Move line buffer content |
kayekss | 0:1ea133b6a4de | 298 | for (uint8_t j = 0; j < _rows - 1; j++) { |
kayekss | 0:1ea133b6a4de | 299 | memcpy(_lineBuffer[j], _lineBuffer[j + 1], _columns); |
kayekss | 0:1ea133b6a4de | 300 | } |
kayekss | 0:1ea133b6a4de | 301 | // Clear last line |
kayekss | 0:1ea133b6a4de | 302 | memset(_lineBuffer[_rows - 1], ' ', _columns); |
kayekss | 0:1ea133b6a4de | 303 | |
kayekss | 0:1ea133b6a4de | 304 | // Redraw |
kayekss | 0:1ea133b6a4de | 305 | for (uint8_t j = 0; j < _rows; j++) { |
kayekss | 0:1ea133b6a4de | 306 | locate(0, j); |
kayekss | 0:1ea133b6a4de | 307 | for (uint8_t i = 0; i < _columns; i++) { |
kayekss | 0:1ea133b6a4de | 308 | for (uint8_t k = 0; k < 5; k++) { |
kayekss | 0:1ea133b6a4de | 309 | data(FONT_5X7[_lineBuffer[j][i]][k]); |
kayekss | 0:1ea133b6a4de | 310 | } |
kayekss | 0:1ea133b6a4de | 311 | data(0x00); |
kayekss | 0:1ea133b6a4de | 312 | } |
kayekss | 0:1ea133b6a4de | 313 | } |
kayekss | 0:1ea133b6a4de | 314 | } |
kayekss | 0:1ea133b6a4de | 315 | |
kayekss | 0:1ea133b6a4de | 316 | void TextLCD_ST7565SPI::setPage(uint8_t page) { |
kayekss | 0:1ea133b6a4de | 317 | if (page < 16) { |
kayekss | 0:1ea133b6a4de | 318 | command(0xb0 | page); |
kayekss | 0:1ea133b6a4de | 319 | } |
kayekss | 0:1ea133b6a4de | 320 | } |
kayekss | 0:1ea133b6a4de | 321 | |
kayekss | 0:1ea133b6a4de | 322 | void TextLCD_ST7565SPI::setColumn(uint8_t column) { |
kayekss | 0:1ea133b6a4de | 323 | command(0x10 | (column >> 4)); |
kayekss | 0:1ea133b6a4de | 324 | command(column & 0x0f); |
kayekss | 0:1ea133b6a4de | 325 | } |
kayekss | 0:1ea133b6a4de | 326 | |
kayekss | 0:1ea133b6a4de | 327 | void TextLCD_ST7565SPI::command(uint8_t c) { |
kayekss | 0:1ea133b6a4de | 328 | _rs = 0; |
kayekss | 0:1ea133b6a4de | 329 | _cs = 0; |
kayekss | 0:1ea133b6a4de | 330 | _spi.write(c); |
kayekss | 0:1ea133b6a4de | 331 | _cs = 1; |
kayekss | 0:1ea133b6a4de | 332 | } |
kayekss | 0:1ea133b6a4de | 333 | |
kayekss | 0:1ea133b6a4de | 334 | void TextLCD_ST7565SPI::data(uint8_t d) { |
kayekss | 0:1ea133b6a4de | 335 | _rs = 1; |
kayekss | 0:1ea133b6a4de | 336 | _cs = 0; |
kayekss | 0:1ea133b6a4de | 337 | _spi.write(d); |
kayekss | 0:1ea133b6a4de | 338 | _cs = 1; |
kayekss | 0:1ea133b6a4de | 339 | } |