|
@@ -24,6 +24,7 @@
|
24
|
24
|
// file u8g_dev_st7920_128x64_HAL.cpp for the HAL version.
|
25
|
25
|
|
26
|
26
|
#include "../../inc/MarlinConfig.h"
|
|
27
|
+#include <U8glib.h>
|
27
|
28
|
|
28
|
29
|
#if ENABLED(U8GLIB_ST7920)
|
29
|
30
|
|
|
@@ -40,8 +41,6 @@
|
40
|
41
|
#define LCD_PIXEL_WIDTH 128
|
41
|
42
|
#define LCD_PIXEL_HEIGHT 64
|
42
|
43
|
|
43
|
|
-#include <U8glib.h>
|
44
|
|
-
|
45
|
44
|
//set optimization so ARDUINO optimizes this file
|
46
|
45
|
#pragma GCC optimize (3)
|
47
|
46
|
|
|
@@ -84,29 +83,35 @@
|
84
|
83
|
#define ST7920_DELAY_3 CPU_ST7920_DELAY_3
|
85
|
84
|
#endif
|
86
|
85
|
|
|
86
|
+#define ST7920_SND_BIT \
|
|
87
|
+ WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \
|
|
88
|
+ WRITE(ST7920_DAT_PIN, val & 0x80); ST7920_DELAY_2; \
|
|
89
|
+ WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \
|
|
90
|
+ val <<= 1
|
|
91
|
+
|
|
92
|
+static void ST7920_SWSPI_SND_8BIT(uint8_t val) {
|
|
93
|
+ ST7920_SND_BIT; // 1
|
|
94
|
+ ST7920_SND_BIT; // 2
|
|
95
|
+ ST7920_SND_BIT; // 3
|
|
96
|
+ ST7920_SND_BIT; // 4
|
|
97
|
+ ST7920_SND_BIT; // 5
|
|
98
|
+ ST7920_SND_BIT; // 6
|
|
99
|
+ ST7920_SND_BIT; // 7
|
|
100
|
+ ST7920_SND_BIT; // 8
|
|
101
|
+}
|
|
102
|
+
|
87
|
103
|
#if defined(DOGM_SPI_DELAY_US) && DOGM_SPI_DELAY_US > 0
|
88
|
104
|
#define U8G_DELAY() delayMicroseconds(DOGM_SPI_DELAY_US)
|
89
|
105
|
#else
|
90
|
106
|
#define U8G_DELAY() u8g_10MicroDelay()
|
91
|
107
|
#endif
|
92
|
108
|
|
93
|
|
-static void ST7920_WRITE_BYTE(uint8_t val) {
|
94
|
|
- for (uint8_t i = 0; i < 8; i++) {
|
95
|
|
- WRITE(ST7920_DAT_PIN, val & 0x80);
|
96
|
|
- WRITE(ST7920_CLK_PIN, HIGH);
|
97
|
|
- WRITE(ST7920_CLK_PIN, LOW);
|
98
|
|
- val <<= 1;
|
99
|
|
- }
|
100
|
|
-}
|
101
|
|
-
|
102
|
|
-#define ST7920_SET_CMD() { ST7920_WRITE_BYTE(0xF8); U8G_DELAY(); }
|
103
|
|
-#define ST7920_SET_DAT() { ST7920_WRITE_BYTE(0xFA); U8G_DELAY(); }
|
104
|
|
-#define ST7920_WRITE_NIBBLES(a) { ST7920_WRITE_BYTE((uint8_t)((a)&0xF0u)); ST7920_WRITE_BYTE((uint8_t)((a)<<4u)); U8G_DELAY(); }
|
105
|
|
-#define ST7920_WRITE_NIBBLES_P(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_WRITE_BYTE(*p&0xF0); ST7920_WRITE_BYTE(*p<<4); p++; } U8G_DELAY(); }
|
106
|
|
-
|
107
|
|
-
|
108
|
109
|
#define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); }
|
109
|
110
|
#define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); }
|
|
111
|
+#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); }
|
|
112
|
+#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); }
|
|
113
|
+#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4u)); U8G_DELAY(); }
|
|
114
|
+#define ST7920_WRITE_BYTES(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_SWSPI_SND_8BIT(*p&0xF0); ST7920_SWSPI_SND_8BIT(*p<<4); p++; } U8G_DELAY(); }
|
110
|
115
|
|
111
|
116
|
uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
|
112
|
117
|
uint8_t i, y;
|
|
@@ -114,26 +119,24 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
|
114
|
119
|
case U8G_DEV_MSG_INIT: {
|
115
|
120
|
OUT_WRITE(ST7920_CS_PIN, LOW);
|
116
|
121
|
OUT_WRITE(ST7920_DAT_PIN, LOW);
|
117
|
|
- OUT_WRITE(ST7920_CLK_PIN, LOW);
|
|
122
|
+ OUT_WRITE(ST7920_CLK_PIN, HIGH);
|
118
|
123
|
|
119
|
124
|
ST7920_CS();
|
120
|
125
|
u8g_Delay(120); //initial delay for boot up
|
121
|
126
|
ST7920_SET_CMD();
|
122
|
|
- ST7920_WRITE_NIBBLES(0x08); //display off, cursor+blink off
|
123
|
|
- ST7920_WRITE_NIBBLES(0x01); //clear CGRAM ram
|
|
127
|
+ ST7920_WRITE_BYTE(0x08); //display off, cursor+blink off
|
|
128
|
+ ST7920_WRITE_BYTE(0x01); //clear CGRAM ram
|
124
|
129
|
u8g_Delay(15); //delay for CGRAM clear
|
125
|
|
- ST7920_WRITE_NIBBLES(0x3E); //extended mode + GDRAM active
|
|
130
|
+ ST7920_WRITE_BYTE(0x3E); //extended mode + GDRAM active
|
126
|
131
|
for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM
|
127
|
|
- ST7920_WRITE_NIBBLES(0x80 | y); //set y
|
128
|
|
- ST7920_WRITE_NIBBLES(0x80); //set x = 0
|
|
132
|
+ ST7920_WRITE_BYTE(0x80 | y); //set y
|
|
133
|
+ ST7920_WRITE_BYTE(0x80); //set x = 0
|
129
|
134
|
ST7920_SET_DAT();
|
130
|
135
|
for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments
|
131
|
|
- ST7920_WRITE_NIBBLES(0);
|
|
136
|
+ ST7920_WRITE_BYTE(0);
|
132
|
137
|
ST7920_SET_CMD();
|
133
|
138
|
}
|
134
|
|
-
|
135
|
|
- ST7920_WRITE_NIBBLES(0x0C); //display on, cursor+blink off
|
136
|
|
-
|
|
139
|
+ ST7920_WRITE_BYTE(0x0C); //display on, cursor+blink off
|
137
|
140
|
ST7920_NCS();
|
138
|
141
|
}
|
139
|
142
|
break;
|
|
@@ -150,15 +153,15 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
|
150
|
153
|
for (i = 0; i < PAGE_HEIGHT; i ++) {
|
151
|
154
|
ST7920_SET_CMD();
|
152
|
155
|
if (y < 32) {
|
153
|
|
- ST7920_WRITE_NIBBLES(0x80 | y); //y
|
154
|
|
- ST7920_WRITE_NIBBLES(0x80); //x=0
|
|
156
|
+ ST7920_WRITE_BYTE(0x80 | y); //y
|
|
157
|
+ ST7920_WRITE_BYTE(0x80); //x=0
|
155
|
158
|
}
|
156
|
159
|
else {
|
157
|
|
- ST7920_WRITE_NIBBLES(0x80 | (y - 32)); //y
|
158
|
|
- ST7920_WRITE_NIBBLES(0x80 | 8); //x=64
|
|
160
|
+ ST7920_WRITE_BYTE(0x80 | (y - 32)); //y
|
|
161
|
+ ST7920_WRITE_BYTE(0x80 | 8); //x=64
|
159
|
162
|
}
|
160
|
163
|
ST7920_SET_DAT();
|
161
|
|
- ST7920_WRITE_NIBBLES_P(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro
|
|
164
|
+ ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro
|
162
|
165
|
y++;
|
163
|
166
|
}
|
164
|
167
|
ST7920_NCS();
|