Bob-the-Kuhn 7 år sedan
förälder
incheckning
9a423e9a89
1 ändrade filer med 35 tillägg och 32 borttagningar
  1. 35
    32
      Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp

+ 35
- 32
Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp Visa fil

24
 // file u8g_dev_st7920_128x64_HAL.cpp for the HAL version.
24
 // file u8g_dev_st7920_128x64_HAL.cpp for the HAL version.
25
 
25
 
26
 #include "../../inc/MarlinConfig.h"
26
 #include "../../inc/MarlinConfig.h"
27
+#include <U8glib.h>
27
 
28
 
28
 #if ENABLED(U8GLIB_ST7920)
29
 #if ENABLED(U8GLIB_ST7920)
29
 
30
 
40
 #define LCD_PIXEL_WIDTH 128
41
 #define LCD_PIXEL_WIDTH 128
41
 #define LCD_PIXEL_HEIGHT 64
42
 #define LCD_PIXEL_HEIGHT 64
42
 
43
 
43
-#include <U8glib.h>
44
-
45
 //set optimization so ARDUINO optimizes this file
44
 //set optimization so ARDUINO optimizes this file
46
 #pragma GCC optimize (3)
45
 #pragma GCC optimize (3)
47
 
46
 
84
   #define ST7920_DELAY_3 CPU_ST7920_DELAY_3
83
   #define ST7920_DELAY_3 CPU_ST7920_DELAY_3
85
 #endif
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
 #if defined(DOGM_SPI_DELAY_US) && DOGM_SPI_DELAY_US > 0
103
 #if defined(DOGM_SPI_DELAY_US) && DOGM_SPI_DELAY_US > 0
88
   #define U8G_DELAY() delayMicroseconds(DOGM_SPI_DELAY_US)
104
   #define U8G_DELAY() delayMicroseconds(DOGM_SPI_DELAY_US)
89
 #else
105
 #else
90
   #define U8G_DELAY() u8g_10MicroDelay()
106
   #define U8G_DELAY() u8g_10MicroDelay()
91
 #endif
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
 #define ST7920_CS()              { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); }
109
 #define ST7920_CS()              { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); }
109
 #define ST7920_NCS()             { WRITE(ST7920_CS_PIN,0); }
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
 uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
116
 uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
112
   uint8_t i, y;
117
   uint8_t i, y;
114
     case U8G_DEV_MSG_INIT: {
119
     case U8G_DEV_MSG_INIT: {
115
       OUT_WRITE(ST7920_CS_PIN, LOW);
120
       OUT_WRITE(ST7920_CS_PIN, LOW);
116
       OUT_WRITE(ST7920_DAT_PIN, LOW);
121
       OUT_WRITE(ST7920_DAT_PIN, LOW);
117
-      OUT_WRITE(ST7920_CLK_PIN, LOW);
122
+      OUT_WRITE(ST7920_CLK_PIN, HIGH);
118
 
123
 
119
       ST7920_CS();
124
       ST7920_CS();
120
       u8g_Delay(120);                 //initial delay for boot up
125
       u8g_Delay(120);                 //initial delay for boot up
121
       ST7920_SET_CMD();
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
       u8g_Delay(15);                 //delay for CGRAM clear
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
       for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM
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
         ST7920_SET_DAT();
134
         ST7920_SET_DAT();
130
         for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments
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
         ST7920_SET_CMD();
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
       ST7920_NCS();
140
       ST7920_NCS();
138
     }
141
     }
139
     break;
142
     break;
150
       for (i = 0; i < PAGE_HEIGHT; i ++) {
153
       for (i = 0; i < PAGE_HEIGHT; i ++) {
151
         ST7920_SET_CMD();
154
         ST7920_SET_CMD();
152
         if (y < 32) {
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
         else {
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
         ST7920_SET_DAT();
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
         y++;
165
         y++;
163
       }
166
       }
164
       ST7920_NCS();
167
       ST7920_NCS();

Laddar…
Avbryt
Spara