浏览代码

LCD initialization sequence according to the docs

The LCD initialization show now be much better and faster with no
flickering at the startup.

Also fix the contrast control.
Fred Sundvik 8 年之前
父节点
当前提交
995002fa91

+ 11 - 29
keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c

@@ -26,7 +26,7 @@
 #define GDISP_SCREEN_WIDTH		128
 #define GDISP_SCREEN_WIDTH		128
 #endif
 #endif
 #ifndef GDISP_INITIAL_CONTRAST
 #ifndef GDISP_INITIAL_CONTRAST
-#define GDISP_INITIAL_CONTRAST	0
+#define GDISP_INITIAL_CONTRAST	35
 #endif
 #endif
 #ifndef GDISP_INITIAL_BACKLIGHT
 #ifndef GDISP_INITIAL_BACKLIGHT
 #define GDISP_INITIAL_BACKLIGHT	100
 #define GDISP_INITIAL_BACKLIGHT	100
@@ -111,41 +111,25 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
     gfxSleepMilliseconds(20);
     gfxSleepMilliseconds(20);
     setpin_reset(g, FALSE);
     setpin_reset(g, FALSE);
     gfxSleepMilliseconds(20);
     gfxSleepMilliseconds(20);
-
     acquire_bus(g);
     acquire_bus(g);
     enter_cmd_mode(g);
     enter_cmd_mode(g);
-    write_cmd(g, ST7565_DISPLAY_OFF);
+
+    write_cmd(g, ST7565_RESET);
     write_cmd(g, ST7565_LCD_BIAS);
     write_cmd(g, ST7565_LCD_BIAS);
     write_cmd(g, ST7565_ADC);
     write_cmd(g, ST7565_ADC);
     write_cmd(g, ST7565_COM_SCAN);
     write_cmd(g, ST7565_COM_SCAN);
 
 
-    write_cmd(g, ST7565_START_LINE | 0);
-
-    write_cmd(g, ST7565_RESISTOR_RATIO | 0x6);
-
-    // turn on voltage converter (VC=1, VR=0, VF=0)
-    write_cmd(g, ST7565_POWER_CONTROL | 0x04);
-    flush_cmd(g);
-    delay_ms(50);
-
-    // turn on voltage regulator (VC=1, VR=1, VF=0)
-    write_cmd(g, ST7565_POWER_CONTROL | 0x06);
-    flush_cmd(g);
-    delay_ms(50);
+    write_cmd(g, ST7565_RESISTOR_RATIO | 0x1);
+    write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST);
 
 
-    // turn on voltage follower (VC=1, VR=1, VF=1)
+    // turn on internal power supply (VC=1, VR=1, VF=1)
     write_cmd(g, ST7565_POWER_CONTROL | 0x07);
     write_cmd(g, ST7565_POWER_CONTROL | 0x07);
-    flush_cmd(g);
-    delay_ms(50);
 
 
-    write_cmd(g, 0xE2);
-    write_cmd(g, ST7565_COM_SCAN);
-    write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST*64/101);
-    //write_cmd2(g, ST7565_CONTRAST, 0);
-    write_cmd(g, ST7565_DISPLAY_ON);
-    write_cmd(g, ST7565_ALLON_NORMAL);
     write_cmd(g, ST7565_INVERT_DISPLAY);
     write_cmd(g, ST7565_INVERT_DISPLAY);
+    write_cmd(g, ST7565_ALLON_NORMAL);
+    write_cmd(g, ST7565_DISPLAY_ON);
 
 
+    write_cmd(g, ST7565_START_LINE | 0);
     write_cmd(g, ST7565_RMW);
     write_cmd(g, ST7565_RMW);
     flush_cmd(g);
     flush_cmd(g);
 
 
@@ -331,14 +315,12 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
             return;
             return;
 
 
             case GDISP_CONTROL_CONTRAST:
             case GDISP_CONTROL_CONTRAST:
-                if ((unsigned)g->p.ptr > 100)
-                    g->p.ptr = (void *)100;
+                g->g.Contrast = (unsigned)g->p.ptr & 63;
                 acquire_bus(g);
                 acquire_bus(g);
                 enter_cmd_mode(g);
                 enter_cmd_mode(g);
-                write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr)<<6)/101) & 0x3F);
+                write_cmd2(g, ST7565_CONTRAST, g->g.Contrast);
                 flush_cmd(g);
                 flush_cmd(g);
                 release_bus(g);
                 release_bus(g);
-                g->g.Contrast = (unsigned)g->p.ptr;
                 return;
                 return;
     }
     }
 }
 }

+ 2 - 0
keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/st7565.h

@@ -34,4 +34,6 @@
 #define ST7565_RESISTOR_RATIO       0x20
 #define ST7565_RESISTOR_RATIO       0x20
 #define ST7565_POWER_CONTROL        0x28
 #define ST7565_POWER_CONTROL        0x28
 
 
+#define ST7565_RESET                0xE2
+
 #endif /* _ST7565_H */
 #endif /* _ST7565_H */