1
1
#include < avr/pgmspace.h>
2
- #include < SPI.h>
2
+ // #include <SPI.h>
3
3
#include < MicroView.h>
4
4
5
5
// This fixed ugly GCC warning "only initialized variables can be placed into program memory area"
@@ -95,19 +95,19 @@ void MicroView::begin() {
95
95
// Setting up SPI pins
96
96
pinMode (MOSI, OUTPUT);
97
97
pinMode (SCK, OUTPUT);
98
- pinMode (DC, OUTPUT);
98
+
99
+ // pinMode(DC, OUTPUT);
99
100
pinMode (RESET, OUTPUT);
100
- pinMode (SS, OUTPUT );
101
+ pinMode (SS, INPUT );
101
102
digitalWrite (SS, HIGH);
102
103
103
- sckport = portOutputRegister (digitalPinToPort (SCK));
104
- sckpinmask = digitalPinToBitMask (SCK);
105
- mosiport = portOutputRegister (digitalPinToPort (MOSI));
106
- mosipinmask = digitalPinToBitMask (MOSI);
107
- ssport = portOutputRegister (digitalPinToPort (SS));
108
- sspinmask = digitalPinToBitMask (SS);
109
- dcport = portOutputRegister (digitalPinToPort (DC));
110
- dcpinmask = digitalPinToBitMask (DC);
104
+ ssport = portOutputRegister (digitalPinToPort (SS));
105
+ sspinmask = digitalPinToBitMask (SS);
106
+ ssreg = portModeRegister (digitalPinToPort (SS));
107
+
108
+ dcport = portOutputRegister (digitalPinToPort (DC));
109
+ dcpinmask = digitalPinToBitMask (DC);
110
+ dcreg = portModeRegister (digitalPinToPort (DC));
111
111
112
112
digitalWrite (RESET, HIGH);
113
113
// VDD (3.3V) goes high at start, lets just chill for 5 ms
@@ -122,7 +122,8 @@ void MicroView::begin() {
122
122
// wait 10ms
123
123
delay (10 );
124
124
// bring out of reset
125
- digitalWrite (RESET, HIGH);
125
+ pinMode (RESET,INPUT_PULLUP);
126
+ // digitalWrite(RESET, HIGH);
126
127
127
128
// Init sequence for 64x48 OLED module
128
129
command (DISPLAYOFF); // 0xAE
@@ -166,20 +167,33 @@ void MicroView::begin() {
166
167
167
168
void MicroView::command (uint8_t c) {
168
169
// Hardware SPI
169
- *ssport |= sspinmask; // SS HIGH
170
- *dcport &= ~dcpinmask; // DC LOW
171
- *ssport &= ~sspinmask; // SS LOW
170
+ *dcreg |= dcpinmask; // Set DC pin to OUTPUT
171
+ *dcport &= ~dcpinmask; // DC pin LOW
172
+
173
+ *ssreg |= sspinmask; // Set SS pin to OUTPUT
174
+ *ssport &= ~sspinmask; // SS LOW
175
+
172
176
MVSPI.transfer (c);
177
+
173
178
*ssport |= sspinmask; // SS HIGH
179
+ *ssreg &= ~sspinmask; // Set SS pin to INPUT
180
+
181
+ *dcreg &= ~dcpinmask; // Set DC to INPUT to avoid high voltage over driving the OLED logic
174
182
}
175
183
176
184
void MicroView::data (uint8_t c) {
177
185
// Hardware SPI
178
- *ssport |= sspinmask; // SS HIGH
179
186
*dcport |= dcpinmask; // DC HIGH
187
+
188
+ *ssreg |= sspinmask; // Set SS pin to OUTPUT
180
189
*ssport &= ~sspinmask; // SS LOW
190
+
181
191
MVSPI.transfer (c);
192
+
182
193
*ssport |= sspinmask; // SS HIGH
194
+ *ssreg &= ~sspinmask; // Set SS pin to INPUT
195
+
196
+ *dcreg &= ~dcpinmask; // Set DC to INPUT to avoid high voltage over driving the OLED logic
183
197
}
184
198
185
199
void MicroView::setPageAddress (uint8_t add) {
0 commit comments