-
Notifications
You must be signed in to change notification settings - Fork 0
/
OLedI2C.cpp
199 lines (161 loc) · 5.02 KB
/
OLedI2C.cpp
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/*
This is my first Library to make writing to the OLED 1602
Display much easier, the display is based on the SSD1311.
The display has 16 characters and 2 lines.
The library is far from complete and may be prone to errors.
Feedback welcome, visit www.gadjet.co.uk
Phil Grant 2013
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data in the sendString function
sendString("string", col, row)
*/
//*************************************//
// --- WIDE.HK---//
// - SSD131x PMOLED Controller -//
// - SCL, SDA, GND, VCC(3.3v 5v) --//
//*************************************//
/*
****************************************
This code is rewritten from the original code for the Arduino to control the I2C OLED from http://Wide.HK
The code below works to use the SparkCore microcontrller (available at http://Particle.io )
Pins used on the SparkCore:
DO - SDA
D1 - SCL
3V
GND
see here for pins: http://docs.spark.io/#/hardware/pins-and-i-o-i2c
****************************************
*/
#include "application.h"
#include "OLedI2C.h"
// #include "Wire.h"
#define OLED_Address 0x3c
#define OLED_Command_Mode 0x80
#define OLED_Data_Mode 0x40
OLedI2C::OLedI2C(){}
OLedI2C::~OLedI2C(){}
void OLedI2C::init() {
// *** I2C initial *** //
delay(100);
sendCommand(0x2A); // **** Set "RE"=1 00101010B
sendCommand(0x71);
sendCommand(0x5C);
sendCommand(0x28);
sendCommand(0x08); // **** Set Sleep Mode On
sendCommand(0x2A); // **** Set "RE"=1 00101010B
sendCommand(0x79); // **** Set "SD"=1 01111001B
sendCommand(0xD5);
sendCommand(0x70);
sendCommand(0x78); // **** Set "SD"=0 01111000B
sendCommand(0x08); // **** Set 5-dot, 3 or 4 line(0x09), 1 or 2 line(0x08)
sendCommand(0x06); // **** Set Com31-->Com0 Seg0-->Seg99
// **** Set OLED Characterization *** //
sendCommand(0x2A); // **** Set "RE"=1
sendCommand(0x79); // **** Set "SD"=1
// **** CGROM/CGRAM Management *** //
sendCommand(0x72); // **** Set ROM
sendCommand(0x00); // **** Set ROM A and 8 CGRAM
sendCommand(0xDA); // **** Set Seg Pins HW Config
sendCommand(0x10);
sendCommand(0x81); // **** Set Contrast
sendCommand(0xFF);
sendCommand(0xDB); // **** Set VCOM deselect level
sendCommand(0x30); // **** VCC x 0.83
sendCommand(0xDC); // **** Set gpio - turn EN for 15V generator on.
sendCommand(0x03);
sendCommand(0x78); // **** Exiting Set OLED Characterization
sendCommand(0x28);
sendCommand(0x2A);
//sendCommand(0x05); // **** Set Entry Mode
sendCommand(0x06); // **** Set Entry Mode
sendCommand(0x08);
sendCommand(0x28); // **** Set "IS"=0 , "RE" =0 //28
sendCommand(0x01);
sendCommand(0x80); // **** Set DDRAM Address to 0x80 (line 1 start)
delay(100);
sendCommand(0x0C); // **** Turn on Display
}
void OLedI2C::cursPos(uint8_t col, uint8_t row)
{
int row_offsets[] = { 0x00, 0x40 };
sendCommand(0x80 | (col + row_offsets[row]));
}
void OLedI2C::clearLcd()
{
sendCommand(0x01);
}
void OLedI2C::lcdOff()
{
sendCommand(0x08); // **** Turn on Off
}
void OLedI2C::lcdOn()
{
sendCommand(0x0C); // **** Turn on On
}
void OLedI2C::sendCommand(unsigned char command)
{
Wire.beginTransmission(OLED_Address); // **** Start I2C
Wire.write(OLED_Command_Mode); // **** Set OLED Command mode
Wire.write(command);
Wire.endTransmission(); // **** End I2C
delay(10);
}
void OLedI2C::sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row)
{
char line[10];//Ten characters, I hope that's enough
sprintf(line, "%2.2f", digit); //Convert the float value to a string
sendString(line, col, row);
}
void OLedI2C::setContrast(unsigned char contrast) // contrast as 0x00 to 0xFF
{
//Set OLED Command set
sendCommand(0x2A);
sendCommand(0x79);
sendCommand(0x81); // Set Contrast
sendCommand(contrast); // send contrast value
sendCommand(0x78); // Exiting Set OLED Command set
sendCommand(0x28);
}
void OLedI2C::sendString(const char *String, uint8_t col, uint8_t row)
{
cursPos(col, row);
unsigned char i=0;
while(String[i])
{
sendData(String[i]); // *** Show String to OLED
i++;
}
}
void OLedI2C::sendData(unsigned char data)
{
Wire.beginTransmission(OLED_Address); // **** Start I2C
Wire.write(OLED_Data_Mode); // **** Set OLED Data mode
Wire.write(data);
Wire.endTransmission(); // **** End I2C
}
void OLedI2C::sendMessage(char* message)
{
unsigned char i=0;
while(message[i])
{
sendData(message[i]); // * Show String to OLED
i++;
}
}
void OLedI2C::scrollString(char* message, byte row, unsigned int time)//written by Nathan Chantrell http://nathan.chantrell.net/
{
char buffer[16];
for (byte i=0;i<strlen(message)+16;i++) {
byte pos = i+1;
for (byte j=0;j<16;j++) {
if ((pos<16)||(pos>strlen(message)+15)) { // pad and trail with blank spaces
buffer[j]=' ';
}
else buffer[j]=message[pos-16];
pos++;
}
//cursPos(0,row); removed by PG
sendString(buffer, 0, row); //Edited by PG tho include the cursor pos within the sendString command
delay(time);
}
}