Bob-the-Kuhn 7 лет назад
Родитель
Сommit
9a423e9a89
1 измененных файлов: 35 добавлений и 32 удалений
  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 Просмотреть файл

@@ -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();

Загрузка…
Отмена
Сохранить