Browse Source

add:lcd驱动新增ili9486和st7796

Dozingfiretruck 3 years ago
parent
commit
de790865b6

+ 128 - 0
components/lcd/luat_lcd_ili9486.c

@@ -0,0 +1,128 @@
+#include "luat_base.h"
+#include "luat_lcd.h"
+#include "luat_gpio.h"
+#include "luat_spi.h"
+#include "luat_malloc.h"
+#include "luat_timer.h"
+
+#define LUAT_LOG_TAG "ili9486"
+#include "luat_log.h"
+
+#define LCD_W 320
+#define LCD_H 480
+#define LCD_DIRECTION 0
+
+static int ili9486_init(luat_lcd_conf_t* conf) {
+    if (conf->w == 0)
+        conf->w = LCD_W;
+    if (conf->h == 0)
+        conf->h = LCD_H;
+    if (conf->direction == 0)
+        conf->direction = LCD_DIRECTION;
+
+    if (conf->pin_pwr != 255)
+        luat_gpio_mode(conf->pin_pwr, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_LOW); // POWER
+    luat_gpio_mode(conf->pin_dc, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_HIGH); // DC
+    luat_gpio_mode(conf->pin_rst, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_LOW); // RST
+
+    if (conf->pin_pwr != 255)
+        luat_gpio_set(conf->pin_pwr, Luat_GPIO_LOW);
+    luat_gpio_set(conf->pin_rst, Luat_GPIO_LOW);
+    luat_timer_mdelay(100);
+    luat_gpio_set(conf->pin_rst, Luat_GPIO_HIGH);
+
+
+    // // 发送初始化命令
+    lcd_write_cmd(conf,0xE0);
+    lcd_write_data(conf,0x00);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x0f);
+    lcd_write_data(conf,0x0D);
+    lcd_write_data(conf,0x1B);
+    lcd_write_data(conf,0x0A);
+    lcd_write_data(conf,0x3c);
+    lcd_write_data(conf,0x78);
+    lcd_write_data(conf,0x4A);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x0E);
+    lcd_write_data(conf,0x09);
+    lcd_write_data(conf,0x1B);
+    lcd_write_data(conf,0x1e);
+    lcd_write_data(conf,0x0f);
+
+    lcd_write_cmd(conf,0xE1);
+    lcd_write_data(conf,0x00);
+    lcd_write_data(conf,0x22);
+    lcd_write_data(conf,0x24);
+    lcd_write_data(conf,0x06);
+    lcd_write_data(conf,0x12);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x36);
+    lcd_write_data(conf,0x47);
+    lcd_write_data(conf,0x47);
+    lcd_write_data(conf,0x06);
+    lcd_write_data(conf,0x0a);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x30);
+    lcd_write_data(conf,0x37);
+    lcd_write_data(conf,0x0f);
+
+    lcd_write_cmd(conf,0xC0);
+    lcd_write_data(conf,0x10);
+    lcd_write_data(conf,0x10);
+
+    lcd_write_cmd(conf,0xC1);
+    lcd_write_data(conf,0x41);
+
+    lcd_write_cmd(conf,0xC5);
+    lcd_write_data(conf,0x00);
+    lcd_write_data(conf,0x22);
+    lcd_write_data(conf,0x80);
+
+    lcd_write_cmd(conf,0x36);
+    if(conf->direction==0)lcd_write_data(conf,0x48);
+    else if(conf->direction==1)lcd_write_data(conf,0x88);
+    else if(conf->direction==2)lcd_write_data(conf,0x28);
+    else lcd_write_data(conf,0xE8);
+
+    lcd_write_cmd(conf,0x3A);
+    lcd_write_data(conf,0x55);
+
+    lcd_write_cmd(conf,0XB0);
+    lcd_write_data(conf,0x00);
+    lcd_write_cmd(conf,0xB1);
+    lcd_write_data(conf,0xB0);
+    lcd_write_data(conf,0x11);
+    lcd_write_cmd(conf,0xB4);
+    lcd_write_data(conf,0x02);
+    lcd_write_cmd(conf,0xB6);
+    lcd_write_data(conf,0x02);
+    lcd_write_data(conf,0x02);
+
+    lcd_write_cmd(conf,0xB7);
+    lcd_write_data(conf,0xC6);
+
+    lcd_write_cmd(conf,0xE9);
+    lcd_write_data(conf,0x00);
+
+    lcd_write_cmd(conf,0XF7);
+    lcd_write_data(conf,0xA9);
+    lcd_write_data(conf,0x51);
+    lcd_write_data(conf,0x2C);
+    lcd_write_data(conf,0x82);
+
+    /* Sleep Out */
+    lcd_write_cmd(conf,0x11);
+    /* wait for power stability */
+    luat_timer_mdelay(100);
+    luat_lcd_clear(conf,WHITE);
+    /* display on */
+    luat_lcd_display_on(conf);
+    return 0;
+};
+
+const luat_lcd_opts_t lcd_opts_ili9486 = {
+    .name = "ili9486",
+    .init = ili9486_init,
+};
+

+ 32 - 180
components/lcd/luat_lcd_ili9488.c

@@ -35,48 +35,48 @@ static int ili9488_init(luat_lcd_conf_t* conf) {
     // // 发送初始化命令
     lcd_write_cmd(conf,0xE0);
     lcd_write_data(conf,0x00);
-    lcd_write_data(conf,0x03);
-    lcd_write_data(conf,0x09);
-    lcd_write_data(conf,0x08);
-    lcd_write_data(conf,0x16);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x0f);
+    lcd_write_data(conf,0x0D);
+    lcd_write_data(conf,0x1B);
     lcd_write_data(conf,0x0A);
-    lcd_write_data(conf,0x3F);
+    lcd_write_data(conf,0x3c);
     lcd_write_data(conf,0x78);
-    lcd_write_data(conf,0x4C);
+    lcd_write_data(conf,0x4A);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x0E);
     lcd_write_data(conf,0x09);
-    lcd_write_data(conf,0x0A);
-    lcd_write_data(conf,0x08);
-    lcd_write_data(conf,0x16);
-    lcd_write_data(conf,0x1A);
-    lcd_write_data(conf,0x0F);
+    lcd_write_data(conf,0x1B);
+    lcd_write_data(conf,0x1e);
+    lcd_write_data(conf,0x0f);
 
     lcd_write_cmd(conf,0xE1);
     lcd_write_data(conf,0x00);
-    lcd_write_data(conf,0x16);
-    lcd_write_data(conf,0x19);
-    lcd_write_data(conf,0x03);
-    lcd_write_data(conf,0x0F);
-    lcd_write_data(conf,0x05);
-    lcd_write_data(conf,0x32);
-    lcd_write_data(conf,0x45);
-    lcd_write_data(conf,0x46);
-    lcd_write_data(conf,0x04);
-    lcd_write_data(conf,0x0E);
-    lcd_write_data(conf,0x0D);
-    lcd_write_data(conf,0x35);
+    lcd_write_data(conf,0x22);
+    lcd_write_data(conf,0x24);
+    lcd_write_data(conf,0x06);
+    lcd_write_data(conf,0x12);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x36);
+    lcd_write_data(conf,0x47);
+    lcd_write_data(conf,0x47);
+    lcd_write_data(conf,0x06);
+    lcd_write_data(conf,0x0a);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x30);
     lcd_write_data(conf,0x37);
-    lcd_write_data(conf,0x0F);
+    lcd_write_data(conf,0x0f);
 
     lcd_write_cmd(conf,0xC0);
-    lcd_write_data(conf,0x17);
-    lcd_write_data(conf,0x15);
+    lcd_write_data(conf,0x10);
+    lcd_write_data(conf,0x10);
 
     lcd_write_cmd(conf,0xC1);
     lcd_write_data(conf,0x41);
 
     lcd_write_cmd(conf,0xC5);
     lcd_write_data(conf,0x00);
-    lcd_write_data(conf,0x12);
+    lcd_write_data(conf,0x22);
     lcd_write_data(conf,0x80);
 
     lcd_write_cmd(conf,0x36);
@@ -86,179 +86,31 @@ static int ili9488_init(luat_lcd_conf_t* conf) {
     else lcd_write_data(conf,0xE8);
 
     lcd_write_cmd(conf,0x3A);
-    // lcd_write_data(conf,0x55);
     lcd_write_data(conf,0x66);
 
     lcd_write_cmd(conf,0XB0);
     lcd_write_data(conf,0x00);
     lcd_write_cmd(conf,0xB1);
-    lcd_write_data(conf,0xA0);
+    lcd_write_data(conf,0xB0);
+    lcd_write_data(conf,0x11);
     lcd_write_cmd(conf,0xB4);
     lcd_write_data(conf,0x02);
     lcd_write_cmd(conf,0xB6);
     lcd_write_data(conf,0x02);
     lcd_write_data(conf,0x02);
-    lcd_write_data(conf,0x3B);
 
     lcd_write_cmd(conf,0xB7);
     lcd_write_data(conf,0xC6);
 
+    lcd_write_cmd(conf,0xE9);
+    lcd_write_data(conf,0x00);
+
     lcd_write_cmd(conf,0XF7);
     lcd_write_data(conf,0xA9);
     lcd_write_data(conf,0x51);
     lcd_write_data(conf,0x2C);
     lcd_write_data(conf,0x82);
 
-    // 发送初始化命令
-    // lcd_write_cmd(conf,0xE0);
-    // lcd_write_data(conf,0x00);
-    // lcd_write_data(conf,0x07);
-    // lcd_write_data(conf,0x0f);
-    // lcd_write_data(conf,0x0D);
-    // lcd_write_data(conf,0x1B);
-    // lcd_write_data(conf,0x0A);
-    // lcd_write_data(conf,0x3c);
-    // lcd_write_data(conf,0x78);
-    // lcd_write_data(conf,0x4A);
-    // lcd_write_data(conf,0x07);
-    // lcd_write_data(conf,0x0E);
-    // lcd_write_data(conf,0x09);
-    // lcd_write_data(conf,0x1B);
-    // lcd_write_data(conf,0x1e);
-    // lcd_write_data(conf,0x0f);
-
-    // lcd_write_cmd(conf,0xE1);
-    // lcd_write_data(conf,0x00);
-    // lcd_write_data(conf,0x22);
-    // lcd_write_data(conf,0x24);
-    // lcd_write_data(conf,0x06);
-    // lcd_write_data(conf,0x12);
-    // lcd_write_data(conf,0x07);
-    // lcd_write_data(conf,0x36);
-    // lcd_write_data(conf,0x47);
-    // lcd_write_data(conf,0x47);
-    // lcd_write_data(conf,0x06);
-    // lcd_write_data(conf,0x0a);
-    // lcd_write_data(conf,0x07);
-    // lcd_write_data(conf,0x30);
-    // lcd_write_data(conf,0x37);
-    // lcd_write_data(conf,0x0f);
-
-    // lcd_write_cmd(conf,0xC0);
-    // lcd_write_data(conf,0x10);
-    // lcd_write_data(conf,0x10);
-
-    // lcd_write_cmd(conf,0xC1);
-    // lcd_write_data(conf,0x41);
-
-    // lcd_write_cmd(conf,0xC5);
-    // lcd_write_data(conf,0x00);
-    // lcd_write_data(conf,0x22);
-    // lcd_write_data(conf,0x80);
-
-    // lcd_write_cmd(conf,0x36);
-    // if(conf->direction==0)lcd_write_data(conf,0x48);
-    // else if(conf->direction==1)lcd_write_data(conf,0x88);
-    // else if(conf->direction==2)lcd_write_data(conf,0x28);
-    // else lcd_write_data(conf,0xE8);
-
-    // lcd_write_cmd(conf,0x3A);
-    // lcd_write_data(conf,0x66);
-
-    // lcd_write_cmd(conf,0XB0);
-    // lcd_write_data(conf,0x00);
-    // lcd_write_cmd(conf,0xB1);
-    // lcd_write_data(conf,0xB0);
-    // lcd_write_data(conf,0x11);
-    // lcd_write_cmd(conf,0xB4);
-    // lcd_write_data(conf,0x02);
-    // lcd_write_cmd(conf,0xB6);
-    // lcd_write_data(conf,0x02);
-    // lcd_write_data(conf,0x02);
-
-    // lcd_write_cmd(conf,0xB7);
-    // lcd_write_data(conf,0xC6);
-    // lcd_write_cmd(conf,0xE9);
-    // lcd_write_data(conf,0x00);
-
-    // lcd_write_cmd(conf,0XF7);
-    // lcd_write_data(conf,0xA9);
-    // lcd_write_data(conf,0x51);
-    // lcd_write_data(conf,0x2C);
-    // lcd_write_data(conf,0x82);
-
-
-
-    // lcd_write_cmd(conf,0XF7);
-    // lcd_write_data(conf,0x18);
-    // lcd_write_data(conf,0xA3);
-    // lcd_write_data(conf,0x12);
-    // lcd_write_data(conf,0x02);
-    // lcd_write_data(conf,0XB2);
-    // lcd_write_data(conf,0x12);
-    // lcd_write_data(conf,0xFF);
-    // lcd_write_data(conf,0x10);
-    // lcd_write_data(conf,0x00);
-    // lcd_write_cmd(conf,0XF8);
-    // lcd_write_data(conf,0x21);
-    // lcd_write_data(conf,0x04);
-    // lcd_write_cmd(conf,0X13);
-
-    // lcd_write_cmd(conf,0x36);
-    // if(conf->direction==0)lcd_write_data(conf,0x08);
-    // else if(conf->direction==1)lcd_write_data(conf,0xC8);
-    // else if(conf->direction==2)lcd_write_data(conf,0x78);
-    // else lcd_write_data(conf,0xA8);
-
-    // lcd_write_cmd(conf,0xB4);
-    // lcd_write_data(conf,0x02);
-    // lcd_write_cmd(conf,0xB6);
-    // lcd_write_data(conf,0x02);
-    // lcd_write_data(conf,0x22);
-    // lcd_write_cmd(conf,0xC1);
-    // lcd_write_data(conf,0x41);
-    // lcd_write_cmd(conf,0xC5);
-    // lcd_write_data(conf,0x00);
-    // lcd_write_data(conf,0x18);
-
-    // lcd_write_cmd(conf,0x3a);
-    // lcd_write_data(conf,0x66);
-    // luat_timer_mdelay(50);
-
-    // lcd_write_cmd(conf,0xE0);
-    // lcd_write_data(conf,0x0F);
-    // lcd_write_data(conf,0x1F);
-    // lcd_write_data(conf,0x1C);
-    // lcd_write_data(conf,0x0C);
-    // lcd_write_data(conf,0x0F);
-    // lcd_write_data(conf,0x08);
-    // lcd_write_data(conf,0x48);
-    // lcd_write_data(conf,0x98);
-    // lcd_write_data(conf,0x37);
-    // lcd_write_data(conf,0x0A);
-    // lcd_write_data(conf,0x13);
-    // lcd_write_data(conf,0x04);
-    // lcd_write_data(conf,0x11);
-    // lcd_write_data(conf,0x0D);
-    // lcd_write_data(conf,0x00);
-
-    // lcd_write_cmd(conf,0xE1);
-    // lcd_write_data(conf,0x0F);
-    // lcd_write_data(conf,0x32);
-    // lcd_write_data(conf,0x2E);
-    // lcd_write_data(conf,0x0B);
-    // lcd_write_data(conf,0x0D);
-    // lcd_write_data(conf,0x05);
-    // lcd_write_data(conf,0x47);
-    // lcd_write_data(conf,0x75);
-    // lcd_write_data(conf,0x37);
-    // lcd_write_data(conf,0x06);
-    // lcd_write_data(conf,0x10);
-    // lcd_write_data(conf,0x03);
-    // lcd_write_data(conf,0x24);
-    // lcd_write_data(conf,0x20);
-    // lcd_write_data(conf,0x00);
-
     /* Sleep Out */
     lcd_write_cmd(conf,0x11);
     /* wait for power stability */

+ 118 - 0
components/lcd/luat_lcd_st7796.c

@@ -0,0 +1,118 @@
+#include "luat_base.h"
+#include "luat_lcd.h"
+#include "luat_gpio.h"
+#include "luat_spi.h"
+#include "luat_malloc.h"
+#include "luat_timer.h"
+
+#define LUAT_LOG_TAG "st7796"
+#include "luat_log.h"
+
+#define LCD_W 320
+#define LCD_H 420
+#define LCD_DIRECTION 0
+
+static int st7796_init(luat_lcd_conf_t* conf) {
+    if (conf->w == 0)
+        conf->w = LCD_W;
+    if (conf->h == 0)
+        conf->h = LCD_H;
+    if (conf->direction == 0)
+        conf->direction = LCD_DIRECTION;
+    
+    if (conf->pin_pwr != 255)
+        luat_gpio_mode(conf->pin_pwr, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_LOW); // POWER
+    luat_gpio_mode(conf->pin_dc, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_HIGH); // DC
+    luat_gpio_mode(conf->pin_rst, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_LOW); // RST
+
+    if (conf->pin_pwr != 255)
+        luat_gpio_set(conf->pin_pwr, Luat_GPIO_LOW);
+    luat_gpio_set(conf->pin_rst, Luat_GPIO_LOW);
+    luat_timer_mdelay(100);
+    luat_gpio_set(conf->pin_rst, Luat_GPIO_HIGH);
+    // 发送初始化命令
+    lcd_write_cmd(conf,0x11);
+    luat_timer_mdelay(120);
+
+    lcd_write_cmd(conf,0Xf0);
+	lcd_write_data(conf,0xc3);
+	lcd_write_cmd(conf,0Xf0);
+	lcd_write_data(conf,0x96);
+
+    /* Memory Data Access Control */
+    lcd_write_cmd(conf,0x36);
+    if(conf->direction==0)lcd_write_data(conf,0x48);
+    else if(conf->direction==1)lcd_write_data(conf,0x88);
+    else if(conf->direction==2)lcd_write_data(conf,0x28);
+    else if(conf->direction==3)lcd_write_data(conf,0xE8);
+    /* RGB 5-6-5-bit  */
+    lcd_write_cmd(conf,0x3A);
+    lcd_write_data(conf,0x05);
+
+    lcd_write_cmd(conf,0Xe8);
+    lcd_write_data(conf,0x40);
+    lcd_write_data(conf,0x82);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x18);
+    lcd_write_data(conf,0x27);
+    lcd_write_data(conf,0x0a);
+    lcd_write_data(conf,0xb6);
+    lcd_write_data(conf,0x33);
+
+    lcd_write_cmd(conf,0Xc5);
+    lcd_write_data(conf,0x27);
+
+    lcd_write_cmd(conf,0Xc2);
+    lcd_write_data(conf,0xa7);
+
+    /* Positive Voltage Gamma Control */
+    lcd_write_cmd(conf,0xE0);
+    lcd_write_data(conf,0xf0);
+    lcd_write_data(conf,0x01);
+    lcd_write_data(conf,0x06);
+    lcd_write_data(conf,0x0f);
+    lcd_write_data(conf,0x12);
+    lcd_write_data(conf,0x1d);
+    lcd_write_data(conf,0x36);
+    lcd_write_data(conf,0x54);
+    lcd_write_data(conf,0x44);
+    lcd_write_data(conf,0x0c);
+    lcd_write_data(conf,0x18);
+    lcd_write_data(conf,0x16);
+    lcd_write_data(conf,0x13);
+    lcd_write_data(conf,0x15);
+    /* Negative Voltage Gamma Control */
+    lcd_write_cmd(conf,0xE1);
+    lcd_write_data(conf,0xf0);
+    lcd_write_data(conf,0x01);
+    lcd_write_data(conf,0x05);
+    lcd_write_data(conf,0x0a);
+    lcd_write_data(conf,0x0b);
+    lcd_write_data(conf,0x07);
+    lcd_write_data(conf,0x32);
+    lcd_write_data(conf,0x44);
+    lcd_write_data(conf,0x44);
+    lcd_write_data(conf,0x0c);
+    lcd_write_data(conf,0x18);
+    lcd_write_data(conf,0x17);
+    lcd_write_data(conf,0x13);
+    lcd_write_data(conf,0x16);
+
+    lcd_write_cmd(conf,0Xf0);
+    lcd_write_data(conf,0x3c);
+
+    lcd_write_cmd(conf,0Xf0);
+    lcd_write_data(conf,0x69);
+
+    luat_timer_mdelay(100);
+    luat_lcd_clear(conf,WHITE);
+    /* display on */
+    luat_lcd_display_on(conf);
+    return 0;
+};
+
+const luat_lcd_opts_t lcd_opts_st7796 = {
+    .name = "st7796",
+    .init = st7796_init,
+};
+

+ 13 - 9
components/lcd/luat_lib_lcd.c

@@ -28,10 +28,12 @@ extern const luat_lcd_opts_t lcd_opts_st7735;
 extern const luat_lcd_opts_t lcd_opts_st7735v;
 extern const luat_lcd_opts_t lcd_opts_st7735s;
 extern const luat_lcd_opts_t lcd_opts_st7789;
+extern const luat_lcd_opts_t lcd_opts_st7796;
 extern const luat_lcd_opts_t lcd_opts_gc9a01;
 extern const luat_lcd_opts_t lcd_opts_gc9106l;
 extern const luat_lcd_opts_t lcd_opts_gc9306x;
 extern const luat_lcd_opts_t lcd_opts_ili9341;
+extern const luat_lcd_opts_t lcd_opts_ili9486;
 extern const luat_lcd_opts_t lcd_opts_ili9488;
 extern const luat_lcd_opts_t lcd_opts_custom;
 
@@ -42,16 +44,18 @@ typedef struct lcd_reg {
 
 static const lcd_reg_t lcd_regs[] = {
   {"custom",  &lcd_opts_custom},   //0 固定为第零个
-  {"st7735",  &lcd_opts_st7735},   //1
-  {"st7735v", &lcd_opts_st7735v},  //2
-  {"st7735s", &lcd_opts_st7735s},  //3
-  {"st7789",  &lcd_opts_st7789},   //4
-  {"gc9a01",  &lcd_opts_gc9a01},   //5
-  {"gc9106l", &lcd_opts_gc9106l},  //6
-  {"gc9306x", &lcd_opts_gc9306x},  //7
+  {"st7735",  &lcd_opts_st7735},   
+  {"st7735v", &lcd_opts_st7735v},  
+  {"st7735s", &lcd_opts_st7735s},  
+  {"st7789",  &lcd_opts_st7789},   
+  {"st7796", &lcd_opts_st7796},
+  {"gc9a01",  &lcd_opts_gc9a01},  
+  {"gc9106l", &lcd_opts_gc9106l}, 
+  {"gc9306x", &lcd_opts_gc9306x}, 
   {"gc9306",  &lcd_opts_gc9306x},  //gc9306是gc9306x的别名
-  {"ili9341", &lcd_opts_ili9341},  //8
-  {"ili9488", &lcd_opts_ili9488},  //9
+  {"ili9341", &lcd_opts_ili9341},  
+  {"ili9486", &lcd_opts_ili9486},
+  {"ili9488", &lcd_opts_ili9488},  
   {"", NULL} // 最后一个必须是空字符串
 };