1 | // initialize display (this function must not be called directly after power-on; displays need time to power up; there is a delay in module_init() for that reason)
|
2 |
|
3 | void
|
4 | oled_init()
|
5 | {
|
6 | oled_reset(); // hard display reset (via reset pin)
|
7 |
|
8 | oled_command(OLED_COMMAND_DISPLAYOFF); // display off
|
9 |
|
10 | oled_command(OLED_COMMAND_SETVCOMDETECT); // set VCOMH deselect level
|
11 | oled_command(0x20); // ~0.77 x VCC
|
12 |
|
13 | oled_command(OLED_COMMAND_SETMULTIPLEX); // set multiplex ratio to suggested value
|
14 | oled_command(0x3F);
|
15 |
|
16 | oled_command(OLED_COMMAND_SETDISPLAYOFFSET); // set mapping of display start line to 0 (no offset)
|
17 | oled_command(0);
|
18 |
|
19 | oled_command(OLED_COMMAND_SETSTARTLINE); // set display start line to 0
|
20 |
|
21 | oled_command(OLED_COMMAND_MEMORYMODE);
|
22 | oled_command(0); // choose horizontal addressing mode (only supported by SSD1306)
|
23 |
|
24 | if (DISPLAYRotated) // display rotated (upside down)?
|
25 | {
|
26 | oled_command(OLED_COMMAND_SEGREMAP | 0); // set segment re-map: column address 0 is mapped to SEG0
|
27 |
|
28 | oled_command(OLED_COMMAND_COMSCANINC); // set COM output scan direction to normal mode: scan from COM0 to COM[N –1]
|
29 | }
|
30 | else
|
31 | {
|
32 | oled_command(OLED_COMMAND_SEGREMAP | 1); // set segment re-map: column address 127 is mapped to SEG0
|
33 |
|
34 | oled_command(OLED_COMMAND_COMSCANDEC); // set COM output scan direction to remapped mode: scan from COM[N-1] to COM0
|
35 | }
|
36 |
|
37 | oled_command(OLED_COMMAND_SETCOMPINS); // set COM pins hardware configuration to alternative configuration; disable left/right remap
|
38 | oled_command(0x12);
|
39 |
|
40 | oled_command(OLED_COMMAND_SETCONTRAST); // choose contrast
|
41 | oled_command(OLEDContrast);
|
42 |
|
43 | oled_command(OLED_COMMAND_DISPLAYALLON_RAM); // output follows RAM content
|
44 |
|
45 | oled_command(OLED_COMMAND_NORMALDISPLAY); // non-inverse display
|
46 |
|
47 | oled_command(OLED_COMMAND_SETDISPLAYCLOCKDIV);
|
48 | oled_command(0x80); // set display clock divider to suggested value
|
49 |
|
50 | oled_command(OLED_COMMAND_SETPRECHARGE);
|
51 |
|
52 | #ifdef OLED_EXTERNALVCC
|
53 | oled_command(0x22);
|
54 | #else
|
55 | oled_command(0xF1);
|
56 | #endif
|
57 |
|
58 | oled_command(OLED_COMMAND_CHARGEPUMP); // charge pump must be enabled by the following commands: 8Dh (charge pump setting), 14h (enable charge pump) and AFh (display ON)
|
59 |
|
60 | #ifdef OLED_EXTERNALVCC
|
61 | oled_command(0x10);
|
62 | #else
|
63 | oled_command(0x14);
|
64 | #endif
|
65 |
|
66 | oled_command(OLED_COMMAND_DISPLAYON); // turn on oled panel
|
67 |
|
68 | spi_chipselect(SPI_CS_NONE);
|
69 | }
|
70 |
|
71 | void
|
72 | oled_reset()
|
73 | {
|
74 | // generate reset (high-low-high)
|
75 |
|
76 | oled_reset_high();
|
77 |
|
78 | delay_us(100); // do not use delay_ms() here (timer not operational if this code is called during boot)
|
79 |
|
80 | oled_reset_low();
|
81 |
|
82 | delay_us(100); // do not use delay_ms() here (timer not operational if this code is called during boot)
|
83 |
|
84 | oled_reset_high();
|
85 |
|
86 | // wait 1ms for display to come out of reset
|
87 |
|
88 | delay_us(1000); // do not use delay_ms() here (timer not operational if this code is called during boot)
|
89 | }
|
90 |
|
91 | Ausschnitt aus dem Header-File:
|
92 | -------------------------------
|
93 |
|
94 | #define OLED_COMMAND_W 128 // display dimensions
|
95 | #define OLED_COMMAND_H 64 // display dimensions
|
96 |
|
97 | #define OLED_COMMAND_PAGES (OLED_COMMAND_H / 8)
|
98 |
|
99 | // contrast limits
|
100 |
|
101 | #define OLED_CONTRAST_MAX 255
|
102 |
|
103 | // ports
|
104 |
|
105 | #define OLED_RS_PORT PORTD // port for RS line
|
106 | #define OLED_RS_PIN 3 // pin for RS line
|
107 | #define OLED_RESET_PORT PORTD // port for /RESET line
|
108 | #define OLED_RESET_PIN 7 // pin for /RESET line
|
109 |
|
110 | // use charge pump
|
111 |
|
112 | #undef OLED_EXTERNALVCC
|
113 |
|
114 | // SSD1306/SH1106 commands
|
115 |
|
116 | #define OLED_COMMAND_SETCONTRAST 0x81
|
117 | #define OLED_COMMAND_DISPLAYALLON_RAM 0xA4
|
118 | #define OLED_COMMAND_DISPLAYALLON 0xA5
|
119 | #define OLED_COMMAND_NORMALDISPLAY 0xA6
|
120 | #define OLED_COMMAND_INVERTDISPLAY 0xA7
|
121 | #define OLED_COMMAND_DISPLAYOFF 0xAE
|
122 | #define OLED_COMMAND_DISPLAYON 0xAF
|
123 |
|
124 | #define OLED_COMMAND_SETDISPLAYOFFSET 0xD3
|
125 | #define OLED_COMMAND_SETCOMPINS 0xDA
|
126 |
|
127 | #define OLED_COMMAND_SETVCOMDETECT 0xDB
|
128 |
|
129 | #define OLED_COMMAND_SETDISPLAYCLOCKDIV 0xD5
|
130 | #define OLED_COMMAND_SETPRECHARGE 0xD9
|
131 |
|
132 | #define OLED_COMMAND_SETMULTIPLEX 0xA8
|
133 |
|
134 | #define OLED_COMMAND_SETLOWCOLUMN 0x00
|
135 | #define OLED_COMMAND_SETHIGHCOLUMN 0x10
|
136 |
|
137 | #define OLED_COMMAND_SETSTARTLINE 0x40
|
138 |
|
139 | #define OLED_COMMAND_MEMORYMODE 0x20
|
140 | #define OLED_COMMAND_COLUMNADDR 0x21
|
141 | #define OLED_COMMAND_PAGEADDR 0x22
|
142 |
|
143 | #define OLED_COMMAND_COMSCANINC 0xC0
|
144 | #define OLED_COMMAND_COMSCANDEC 0xC8
|
145 |
|
146 | #define OLED_COMMAND_SEGREMAP 0xA0
|
147 |
|
148 | #define OLED_COMMAND_CHARGEPUMP 0x8D
|
149 |
|
150 | #define OLED_COMMAND_EXTERNALVCC 0x1
|
151 | #define OLED_COMMAND_SWITCHCAPVCC 0x2
|
152 |
|
153 | // SH1106-only commands
|
154 |
|
155 | #define OLED_COMMAND_SETPAGEADDRESS 0xB0
|
156 | #define OLED_COMMAND_SETLOCOLUMN 0x00
|
157 | #define OLED_COMMAND_SETHICOLUMN 0x10
|
158 |
|
159 | // default contrast
|
160 |
|
161 | #ifdef OLED_EXTERNALVCC
|
162 | #define OLED_DEFAULT_CONTRAST 0x9F
|
163 | #else
|
164 | #define OLED_DEFAULT_CONTRAST 0x10 // low contrast works better than recommended value 0xCF
|
165 | #endif
|
166 |
|
167 | // macros for RS (= command/data) and RESET signals
|
168 |
|
169 | #define hal_oled_rs_high() OLED_RS_PORT |= (1<<OLED_RS_PIN)
|
170 | #define hal_oled_rs_low() OLED_RS_PORT &= ~(1<<OLED_RS_PIN)
|
171 |
|
172 | #define hal_oled_reset_high() OLED_RESET_PORT |= (1<<OLED_RESET_PIN)
|
173 | #define hal_oled_reset_low() OLED_RESET_PORT &= ~(1<<OLED_RESET_PIN)
|
174 |
|
175 | // globals
|
176 |
|
177 | extern uint8_t OLEDContrast;
|
178 | extern uint8_t OLEDChip; // chip type (OLED_SSD1306, OLED_SH1106)
|
179 |
|
180 | // prototypes
|
181 |
|
182 | extern void hal_oled_write (uint8_t data, bool command);
|
183 | extern void hal_oled_command (uint8_t command);
|
184 | extern void hal_oled_data (uint8_t command);
|
185 | extern void hal_oled_init (void);
|
186 | extern void hal_oled_reset (void);
|
187 | extern void hal_oled_contrast(uint8_t contrast);
|
188 | extern void hal_oled_rotate (bool upsidedown);
|
189 | extern void hal_oled_on (void);
|
190 | extern void hal_oled_off (void);
|