Text console library for ST7565 graphics LCD controller over SPI interface.

Dependents:   TextLCD_ST7565SPI_Test OpPanel_Offline OpPanel_Offline_cmake_gcc_arm_NUCLEO_F303RENew

Committer:
kayekss
Date:
Mon Mar 02 23:10:13 2015 +0000
Revision:
0:1ea133b6a4de
Child:
1:a32310f5dab1
Initial release.

Who changed what in which revision?

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