1
- /* *The MIT License (MIT)
1
+ /* *
2
+ * The MIT License (MIT)
3
+ *
4
+ * Copyright (c) 2016 by Daniel Eichhorn
5
+ * Copyright (c) 2016 by Fabrice Weinberg
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ *
25
+ * Credits for parts of this code go to Mike Rankin. Thank you so much for sharing!
26
+ */
2
27
3
- Copyright (c) 2015 by Daniel Eichhorn
28
+ # pragma once
4
29
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
30
+ #include < Arduino.h>
31
+ #include < Wire.h>
11
32
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
33
+ #include " SSD1306Fonts.h"
14
34
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
35
+ // #define DEBUG_SSD1306(...) Serial.printf( __VA_ARGS__ )
22
36
23
- See more at http://blog.squix.ch
37
+ #ifndef DEBUG_SSD1306
38
+ #define DEBUG_SSD1306 (...)
39
+ #endif
24
40
25
- Credits for parts of this code go to Mike Rankin. Thank you so much for sharing!
26
- */
27
- #pragma once
41
+ // Use DOUBLE BUFFERING by default
42
+ #ifndef SSD1306_REDUCE_MEMORY
43
+ #define SSD1306_DOUBLE_BUFFER
44
+ #endif
28
45
29
- #include < Arduino.h>
30
- #include " SSD1306Fonts.h"
31
46
32
- #define BLACK 0
33
- #define WHITE 1
34
- #define INVERSE 2
47
+ // Display settings
48
+ #define DISPLAY_WIDTH 128
49
+ #define DISPLAY_HEIGHT 64
50
+ #define DISPLAY_BUFFER_SIZE 1024
51
+
52
+ // Header Values
53
+ #define JUMPTABLE_BYTES 4
54
+ #define JUMPTABLE_LSB 1
55
+ #define JUMPTABLE_SIZE 2
56
+ #define JUMPTABLE_WIDTH 3
57
+
58
+ #define JUMPTABLE_START 4
35
59
36
60
#define WIDTH_POS 0
37
61
#define HEIGHT_POS 1
38
62
#define FIRST_CHAR_POS 2
39
63
#define CHAR_NUM_POS 3
40
- #define CHAR_WIDTH_START_POS 4
41
64
42
- #define TEXT_ALIGN_LEFT 0
43
- #define TEXT_ALIGN_CENTER 1
44
- #define TEXT_ALIGN_RIGHT 2
45
65
66
+ // Display commands
46
67
#define CHARGEPUMP 0x8D
47
68
#define COLUMNADDR 0x21
48
69
#define COMSCANDEC 0xC8
@@ -70,104 +91,139 @@ Credits for parts of this code go to Mike Rankin. Thank you so much for sharing!
70
91
#define SETVCOMDETECT 0xDB
71
92
#define SWITCHCAPVCC 0x2
72
93
94
+ enum SSD1306_COLOR {
95
+ BLACK = 0 ,
96
+ WHITE = 1 ,
97
+ INVERSE = 2
98
+ };
99
+
100
+ enum SSD1306_TEXT_ALIGNMENT {
101
+ TEXT_ALIGN_LEFT = 0 ,
102
+ TEXT_ALIGN_RIGHT = 1 ,
103
+ TEXT_ALIGN_CENTER = 2 ,
104
+ TEXT_ALIGN_CENTER_BOTH = 3
105
+ };
106
+
73
107
class SSD1306 {
108
+ private:
109
+
110
+ uint8_t i2cAddress;
111
+ uint8_t sda;
112
+ uint8_t sdc;
113
+
114
+ uint8_t *buffer;
115
+
116
+ #ifdef SSD1306_DOUBLE_BUFFER
117
+ uint8_t *buffer_back;
118
+ #endif
119
+
120
+ SSD1306_TEXT_ALIGNMENT textAlignment = TEXT_ALIGN_LEFT;
121
+ SSD1306_COLOR color = WHITE;
122
+
123
+ const char *fontData = ArialMT_Plain_10;
124
+
125
+ // Send a command to the display (low level function)
126
+ void sendCommand (unsigned char com);
127
+
128
+ // Send all the init commands
129
+ void sendInitCommands (void );
130
+
131
+ // converts utf8 characters to extended ascii
132
+ byte utf8ascii (byte ascii);
133
+ char * utf8ascii (String s);
134
+
135
+ void drawInternal (int16_t xMove, int16_t yMove, int16_t width, int16_t height, const char *data, uint16_t offset, uint16_t bytesInData);
136
+
137
+ public:
138
+
139
+ // Create the display object connected to pin sda and sdc
140
+ SSD1306 (uint8_t i2cAddress, uint8_t sda, uint8_t sdc);
141
+
142
+ // Initialize the display
143
+ bool init ();
74
144
75
- private:
76
- int myI2cAddress;
77
- int mySda;
78
- int mySdc;
79
- uint8_t buffer[128 * 64 / 8 ];
80
- int myTextAlignment = TEXT_ALIGN_LEFT;
81
- int myColor = WHITE;
82
- byte lastChar;
83
- const char *myFontData = ArialMT_Plain_10;
145
+ // Free the memory used by the display
146
+ void end ();
84
147
85
- public:
86
- // Create the display object connected to pin sda and sdc
87
- SSD1306 (int i2cAddress, int sda, int sdc);
148
+ // Cycle through the initialization
149
+ void resetDisplay (void );
88
150
89
- // Initialize the display
90
- void init ( );
151
+ // Connect again to the display through I2C
152
+ void reconnect ( void );
91
153
92
- // Cycle through the initialization
93
- void resetDisplay (void );
154
+ /* Drawing functions */
94
155
95
- // Connect again to the display through I2C
96
- void reconnect ( void );
156
+ // Sets the color of all pixel operations
157
+ void setColor (SSD1306_COLOR color );
97
158
98
- // Turn the display on
99
- void displayOn ( void );
159
+ // Draw a pixel at given position
160
+ void setPixel ( int16_t x, int16_t y );
100
161
101
- // Turn the display offs
102
- void displayOff ( void );
162
+ // Draw the border of a rectangle at the given location
163
+ void drawRect ( int16_t x, int16_t y, int16_t width, int16_t height );
103
164
104
- // Clear the local pixel buffer
105
- void clear ( void );
165
+ // Fill the rectangle
166
+ void fillRect ( int16_t x, int16_t y, int16_t width, int16_t height );
106
167
107
- // Write the buffer to the display memory
108
- void display ( void );
168
+ // Draw a line horizontally
169
+ void drawHorizontalLine ( int16_t x, int16_t y, int16_t length );
109
170
110
- // Set display contrast
111
- void setContrast ( char contrast );
171
+ // Draw a lin vertically
172
+ void drawVerticalLine ( int16_t x, int16_t y, int16_t length );
112
173
113
- // Turn the display upside down
114
- void flipScreenVertically ( );
174
+ // Draw a bitmap in the internal image format
175
+ void drawFastImage ( int16_t x, int16_t y, int16_t width, int16_t height, const char *image );
115
176
116
- // Send a command to the display (low level function)
117
- void sendCommand ( unsigned char com );
177
+ // Draw a XBM
178
+ void drawXbm ( int16_t x, int16_t y, int16_t width, int16_t height, const char *xbm );
118
179
119
- // Send all the init commands
120
- void sendInitCommands (void );
180
+ /* Text functions */
121
181
122
- // Draw a pixel at given position
123
- void setPixel ( int x, int y );
182
+ // Draws a string at the given location
183
+ void drawString ( int16_t x, int16_t y, String text );
124
184
125
- // Draw 8 bits at the given position
126
- void setChar (int x, int y, unsigned char data);
185
+ // Draws a String with a maximum width at the given location.
186
+ // If the given String is wider than the specified width
187
+ // The text will be wrapped to the next line at a space or dash
188
+ void drawStringMaxWidth (int16_t x, int16_t y, int16_t maxLineWidth, String text);
127
189
128
- // Draw the border of a rectangle at the given location
129
- void drawRect (int x, int y, int width, int height);
190
+ // Returns the width of the String with the current
191
+ // font settings
192
+ uint16_t getStringWidth (const char * text);
130
193
131
- // Fill the rectangle
132
- void fillRect (int x, int y, int width, int height);
194
+ // Specifies relative to which anchor point
195
+ // the text is rendered. Available constants:
196
+ // TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH
197
+ void setTextAlignment (SSD1306_TEXT_ALIGNMENT textAlignment);
133
198
134
- // Draw a bitmap with the given dimensions
135
- void drawBitmap (int x, int y, int width, int height, const char *bitmap);
199
+ // Sets the current font. Available default fonts
200
+ // ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24
201
+ void setFont (const char *fontData);
136
202
137
- // Draw an XBM image with the given dimensions
138
- void drawXbm (int x, int y, int width, int height, const char *xbm);
203
+ /* Display functions */
139
204
140
- // Sets the color of all pixel operations
141
- void setColor ( int color );
205
+ // Turn the display on
206
+ void displayOn ( void );
142
207
143
- // converts utf8 characters to extended ascii
144
- // taken from http://playground.arduino.cc/Main/Utf8ascii
145
- byte utf8ascii (byte ascii);
208
+ // Turn the display offs
209
+ void displayOff (void );
146
210
147
- // converts utf8 string to extended ascii
148
- // taken from http://playground.arduino.cc/Main/Utf8ascii
149
- String utf8ascii (String s);
211
+ // Inverted display mode
212
+ void invertDisplay (void );
150
213
151
- // Draws a string at the given location
152
- void drawString ( int x, int y, String text );
214
+ // Normal display mode
215
+ void normalDisplay ( void );
153
216
154
- // Draws a String with a maximum width at the given location.
155
- // If the given String is wider than the specified width
156
- // The text will be wrapped to the next line at a space or dash
157
- void drawStringMaxWidth (int x, int y, int maxLineWidth, String text);
217
+ // Set display contrast
218
+ void setContrast (char contrast);
158
219
159
- // Returns the width of the String with the current
160
- // font settings
161
- int getStringWidth (String text);
220
+ // Turn the display upside down
221
+ void flipScreenVertically ();
162
222
163
- // Specifies relative to which anchor point
164
- // the text is rendered. Available constants:
165
- // TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT
166
- void setTextAlignment (int textAlignment);
223
+ // Write the buffer to the display memory
224
+ void display (void );
167
225
168
- // Sets the current font. Available default fonts
169
- // defined in SSD1306Fonts.h:
170
- // ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24
171
- void setFont (const char *fontData);
226
+ // Clear the local pixel buffer
227
+ void clear (void );
172
228
173
- };
229
+ };
0 commit comments