forked from moononournation/Arduino_GFX
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathArduino_SSD1331.cpp
More file actions
140 lines (127 loc) · 4.11 KB
/
Arduino_SSD1331.cpp
File metadata and controls
140 lines (127 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* start rewrite from:
* https://github.com/adafruit/Adafruit-GFX-Library.git
*/
#include "Arduino_SSD1331.h"
#include "SPI.h"
Arduino_SSD1331::Arduino_SSD1331(
Arduino_DataBus *bus, int8_t rst, uint8_t r, int16_t w, int16_t h,
uint8_t col_offset1, uint8_t row_offset1, uint8_t col_offset2, uint8_t row_offset2)
: Arduino_TFT(bus, rst, r, false, w, h, col_offset1, row_offset1, col_offset2, row_offset2)
{
}
void Arduino_SSD1331::begin(int32_t speed)
{
#if defined(ESP8266) || defined(ESP32)
if (speed == 0)
{
speed = 40000000;
}
#endif
Arduino_TFT::begin(speed);
}
// Companion code to the above tables. Reads and issues
// a series of LCD commands stored in PROGMEM byte array.
void Arduino_SSD1331::tftInit()
{
// Initialization Sequence
_bus->sendCommand(SSD1331_DISPLAYOFF); // 0xAE
_bus->sendCommand(SSD1331_STARTLINE); // 0xA1
_bus->sendCommand(0x0);
_bus->sendCommand(SSD1331_DISPLAYOFFSET); // 0xA2
_bus->sendCommand(0x0);
_bus->sendCommand(SSD1331_NORMALDISPLAY); // 0xA4
_bus->sendCommand(SSD1331_SETMULTIPLEX); // 0xA8
_bus->sendCommand(0x3F); // 0x3F 1/64 duty
_bus->sendCommand(SSD1331_SETMASTER); // 0xAD
_bus->sendCommand(0x8E);
_bus->sendCommand(SSD1331_POWERMODE); // 0xB0
_bus->sendCommand(0x0B);
_bus->sendCommand(SSD1331_PRECHARGE); // 0xB1
_bus->sendCommand(0x31);
_bus->sendCommand(SSD1331_CLOCKDIV); // 0xB3
_bus->sendCommand(0xF0); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16)
_bus->sendCommand(SSD1331_PRECHARGEA); // 0x8A
_bus->sendCommand(0x64);
_bus->sendCommand(SSD1331_PRECHARGEB); // 0x8B
_bus->sendCommand(0x78);
_bus->sendCommand(SSD1331_PRECHARGEA); // 0x8C
_bus->sendCommand(0x64);
_bus->sendCommand(SSD1331_PRECHARGELEVEL); // 0xBB
_bus->sendCommand(0x3A);
_bus->sendCommand(SSD1331_VCOMH); // 0xBE
_bus->sendCommand(0x3E);
_bus->sendCommand(SSD1331_MASTERCURRENT); // 0x87
_bus->sendCommand(0x06);
_bus->sendCommand(SSD1331_CONTRASTA); // 0x81
_bus->sendCommand(0x91);
_bus->sendCommand(SSD1331_CONTRASTB); // 0x82
_bus->sendCommand(0x50);
_bus->sendCommand(SSD1331_CONTRASTC); // 0x83
_bus->sendCommand(0x7D);
_bus->sendCommand(SSD1331_DISPLAYON); //--turn on oled panel
}
void Arduino_SSD1331::writeAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{
if ((x != _currentX) || (w != _currentW))
{
uint8_t cmd = (_rotation & 0x01) ? SSD1331_SETROW : SSD1331_SETCOLUMN;
uint8_t x_start = x + _xStart, x_end = x + w - 1 + _xStart;
_bus->writeCommand(cmd); // Column addr set
_bus->writeCommand(x_start); // XSTART
_bus->writeCommand(x_end); // XEND
_currentX = x;
_currentW = w;
}
if ((y != _currentY) || (h != _currentH))
{
uint8_t cmd = (_rotation & 0x01) ? SSD1331_SETCOLUMN : SSD1331_SETROW;
uint8_t y_start = y + _yStart, y_end = y + h - 1 + _yStart;
_bus->writeCommand(cmd); // Row addr set
_bus->writeCommand(y_start); // YSTART
_bus->writeCommand(y_end); // YEND
_currentY = y;
_currentH = h;
}
}
/**************************************************************************/
/*!
@brief Set origin of (0,0) and orientation of TFT display
@param m The index for rotation, from 0-3 inclusive
*/
/**************************************************************************/
void Arduino_SSD1331::setRotation(uint8_t r)
{
Arduino_TFT::setRotation(r);
switch (_rotation)
{
case 0:
r = 0b01110010;
break;
case 1:
r = 0b01110001;
break;
case 2:
r = 0b01100000;
break;
case 3:
r = 0b01100011;
break;
}
_bus->beginWrite();
_bus->writeCommand(SSD1331_SETREMAP);
_bus->writeCommand(r);
_bus->endWrite();
}
void Arduino_SSD1331::invertDisplay(bool i)
{
_bus->sendCommand(i ? SSD1331_INVERTDISPLAY : SSD1331_NORMALDISPLAY);
}
void Arduino_SSD1331::displayOn(void)
{
_bus->sendCommand(SSD1331_DISPLAYALLON);
}
void Arduino_SSD1331::displayOff(void)
{
_bus->sendCommand(SSD1331_DISPLAYALLOFF);
}