From 93becbb2a6863490db50c6d441999fabdc9742b9 Mon Sep 17 00:00:00 2001 From: kevin Date: Sat, 4 Jan 2025 23:28:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- esp32c3_code/esp32c3_code.ino | 320 +--------------------------------- esp32c3_code/lcd.cpp | 291 +++++++++++++++++++++++++++++++ esp32c3_code/lcd.h | 35 ++++ 3 files changed, 329 insertions(+), 317 deletions(-) create mode 100644 esp32c3_code/lcd.cpp create mode 100644 esp32c3_code/lcd.h diff --git a/esp32c3_code/esp32c3_code.ino b/esp32c3_code/esp32c3_code.ino index 68adc19..d20b486 100644 --- a/esp32c3_code/esp32c3_code.ino +++ b/esp32c3_code/esp32c3_code.ino @@ -1,320 +1,10 @@ -#include - -//硬件spi貌似接错线了 - -#define LCD_SDA 3 -#define LCD_SCL 2 -#define LCD_CS 7 -#define LCD_DS 6 -#define LCD_LED 10 - -#define VSPI_MISO 10 -#define VSPI_MOSI 3 -#define VSPI_SCLK 2 -#define VSPI_SS 7 - -#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏 -#define LCD_W 240 -#define LCD_H 240 -#define OLED_CMD 0 //写命令 -#define OLED_DATA 1 //写数据 - -#define VSPI FSPI -SPIClass * vspi = NULL; - -static const long spiClk = 80000000; // 80 MHz - - -/****************************************************************************** - 函数说明:LCD串行数据写入函数 - 入口数据:dat 要写入的串行数据 - 返回值: 无 -******************************************************************************/ -void LCD_Writ_Bus(uint8_t dat) -{ - /* - uint8_t i; - digitalWrite(LCD_CS,0); - for(i=0;i<8;i++) - { - digitalWrite(LCD_SCL,0); - if(dat&0x80) - digitalWrite(LCD_SDA,1); - else - digitalWrite(LCD_SDA,0); - digitalWrite(LCD_SCL,1); - dat<<=1; - } - digitalWrite(LCD_CS,1); -*/ - vspi->transfer(dat); -} - -/****************************************************************************** - 函数说明:LCD写入数据 - 入口数据:dat 写入的数据 - 返回值: 无 -******************************************************************************/ -void LCD_WR_DATA8(uint8_t dat) -{ - digitalWrite(LCD_DS,1);//写数据 - LCD_Writ_Bus(dat); -} - - -/****************************************************************************** - 函数说明:LCD写入数据 - 入口数据:dat 写入的数据 - 返回值: 无 -******************************************************************************/ -void LCD_WR_DATA(uint16_t dat) -{ - digitalWrite(LCD_DS,1);//写数据 - LCD_Writ_Bus(dat>>8); - LCD_Writ_Bus(dat); -} - - -/****************************************************************************** - 函数说明:LCD写入命令 - 入口数据:dat 写入的命令 - 返回值: 无 -******************************************************************************/ -void LCD_WR_REG(uint8_t dat) -{ - digitalWrite(LCD_DS,0);//写命令 - LCD_Writ_Bus(dat); -} - -/****************************************************************************** - 函数说明:设置起始和结束地址 - 入口数据:x1,x2 设置列的起始和结束地址 - y1,y2 设置行的起始和结束地址 - 返回值: 无 -******************************************************************************/ -void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2) -{ - if(USE_HORIZONTAL==0) - { - LCD_WR_REG(0x2a);//列地址设置 - LCD_WR_DATA(x1); - LCD_WR_DATA(x2); - LCD_WR_REG(0x2b);//行地址设置 - LCD_WR_DATA(y1); - LCD_WR_DATA(y2); - LCD_WR_REG(0x2c);//储存器写 - } - else if(USE_HORIZONTAL==1) - { - LCD_WR_REG(0x2a);//列地址设置 - LCD_WR_DATA(x1); - LCD_WR_DATA(x2); - LCD_WR_REG(0x2b);//行地址设置 - LCD_WR_DATA(y1+80); - LCD_WR_DATA(y2+80); - LCD_WR_REG(0x2c);//储存器写 - } - else if(USE_HORIZONTAL==2) - { - LCD_WR_REG(0x2a);//列地址设置 - LCD_WR_DATA(x1); - LCD_WR_DATA(x2); - LCD_WR_REG(0x2b);//行地址设置 - LCD_WR_DATA(y1); - LCD_WR_DATA(y2); - LCD_WR_REG(0x2c);//储存器写 - } - else - { - LCD_WR_REG(0x2a);//列地址设置 - LCD_WR_DATA(x1+80); - LCD_WR_DATA(x2+80); - LCD_WR_REG(0x2b);//行地址设置 - LCD_WR_DATA(y1); - LCD_WR_DATA(y2); - LCD_WR_REG(0x2c);//储存器写 - } -} - - -/****************************************************************************** - 函数说明:LCD初始化函数 - 入口数据:无 - 返回值: 无 -******************************************************************************/ -void Lcd_Init(void) -{ - - - -//************* Start Initial Sequence **********// -LCD_WR_REG(0x36); -if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00); -else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0); -else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70); -else LCD_WR_DATA8(0xA0); - -LCD_WR_REG(0x3A); -LCD_WR_DATA8(0x05); - -LCD_WR_REG(0xB2); -LCD_WR_DATA8(0x0C); -LCD_WR_DATA8(0x0C); -LCD_WR_DATA8(0x00); -LCD_WR_DATA8(0x33); -LCD_WR_DATA8(0x33); - -LCD_WR_REG(0xB7); -LCD_WR_DATA8(0x35); - -LCD_WR_REG(0xBB); -LCD_WR_DATA8(0x19); - -LCD_WR_REG(0xC0); -LCD_WR_DATA8(0x2C); - -LCD_WR_REG(0xC2); -LCD_WR_DATA8(0x01); - -LCD_WR_REG(0xC3); -LCD_WR_DATA8(0x12); - -LCD_WR_REG(0xC4); -LCD_WR_DATA8(0x20); - -LCD_WR_REG(0xC6); -LCD_WR_DATA8(0x0F); - -LCD_WR_REG(0xD0); -LCD_WR_DATA8(0xA4); -LCD_WR_DATA8(0xA1); - -LCD_WR_REG(0xE0); -LCD_WR_DATA8(0xD0); -LCD_WR_DATA8(0x04); -LCD_WR_DATA8(0x0D); -LCD_WR_DATA8(0x11); -LCD_WR_DATA8(0x13); -LCD_WR_DATA8(0x2B); -LCD_WR_DATA8(0x3F); -LCD_WR_DATA8(0x54); -LCD_WR_DATA8(0x4C); -LCD_WR_DATA8(0x18); -LCD_WR_DATA8(0x0D); -LCD_WR_DATA8(0x0B); -LCD_WR_DATA8(0x1F); -LCD_WR_DATA8(0x23); - -LCD_WR_REG(0xE1); -LCD_WR_DATA8(0xD0); -LCD_WR_DATA8(0x04); -LCD_WR_DATA8(0x0C); -LCD_WR_DATA8(0x11); -LCD_WR_DATA8(0x13); -LCD_WR_DATA8(0x2C); -LCD_WR_DATA8(0x3F); -LCD_WR_DATA8(0x44); -LCD_WR_DATA8(0x51); -LCD_WR_DATA8(0x2F); -LCD_WR_DATA8(0x1F); -LCD_WR_DATA8(0x1F); -LCD_WR_DATA8(0x20); -LCD_WR_DATA8(0x23); - -LCD_WR_REG(0x21); - -LCD_WR_REG(0x11); -//Delay (120); - -LCD_WR_REG(0x29); -} - - -/****************************************************************************** - 函数说明:LCD清屏函数 - 入口数据:无 - 返回值: 无 -******************************************************************************/ -void LCD_Clear(uint16_t Color) -{ - uint16_t i,j; - LCD_Address_Set(0,0,LCD_W-1,LCD_H-1); - for(i=0;i>10; - c=c&0x03ff; - unsigned int g=c>>5; - c=c&0x001f; - unsigned int b=c; - - unsigned int output=0; - - g=g*2; - output= (r<<11)|(g<<5)|(b); - return output; - -} - +#include "lcd.h" void setup() { // put your setup code here, to run once: - pinMode(LCD_SDA, OUTPUT); - pinMode(LCD_SCL, OUTPUT); - pinMode(LCD_CS, OUTPUT); - pinMode(LCD_DS, OUTPUT); - - - - digitalWrite(LCD_SDA,0); - digitalWrite(LCD_SCL,0); - digitalWrite(LCD_CS,0); - digitalWrite(LCD_DS,0); - - vspi = new SPIClass(VSPI); - vspi->begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS); - vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0)); - pinMode(vspi->pinSS(), OUTPUT); //HSPI SS - - - digitalWrite(vspi->pinSS(), LOW); //pull SS slow to prep other end for transfer - - pinMode(LCD_LED, OUTPUT); - digitalWrite(LCD_LED,1); - - Lcd_Init(); - - //screen_memory2=(int*)malloc(Screen_width*Screen_length); - //for(unsigned int i=0;i + +SPIClass * vspi = NULL; + + + + +/****************************************************************************** + 函数说明:LCD串行数据写入函数 + 入口数据:dat 要写入的串行数据 + 返回值: 无 +******************************************************************************/ +void LCD_Writ_Bus(uint8_t dat) +{ + /* + uint8_t i; + digitalWrite(LCD_CS,0); + for(i=0;i<8;i++) + { + digitalWrite(LCD_SCL,0); + if(dat&0x80) + digitalWrite(LCD_SDA,1); + else + digitalWrite(LCD_SDA,0); + digitalWrite(LCD_SCL,1); + dat<<=1; + } + digitalWrite(LCD_CS,1); +*/ + vspi->transfer(dat); +} + +/****************************************************************************** + 函数说明:LCD写入数据 + 入口数据:dat 写入的数据 + 返回值: 无 +******************************************************************************/ +void LCD_WR_DATA8(uint8_t dat) +{ + digitalWrite(LCD_DS,1);//写数据 + LCD_Writ_Bus(dat); +} + + +/****************************************************************************** + 函数说明:LCD写入数据 + 入口数据:dat 写入的数据 + 返回值: 无 +******************************************************************************/ +void LCD_WR_DATA(uint16_t dat) +{ + digitalWrite(LCD_DS,1);//写数据 + LCD_Writ_Bus(dat>>8); + LCD_Writ_Bus(dat); +} + + +/****************************************************************************** + 函数说明:LCD写入命令 + 入口数据:dat 写入的命令 + 返回值: 无 +******************************************************************************/ +void LCD_WR_REG(uint8_t dat) +{ + digitalWrite(LCD_DS,0);//写命令 + LCD_Writ_Bus(dat); +} + +/****************************************************************************** + 函数说明:设置起始和结束地址 + 入口数据:x1,x2 设置列的起始和结束地址 + y1,y2 设置行的起始和结束地址 + 返回值: 无 +******************************************************************************/ +void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2) +{ + if(USE_HORIZONTAL==0) + { + LCD_WR_REG(0x2a);//列地址设置 + LCD_WR_DATA(x1); + LCD_WR_DATA(x2); + LCD_WR_REG(0x2b);//行地址设置 + LCD_WR_DATA(y1); + LCD_WR_DATA(y2); + LCD_WR_REG(0x2c);//储存器写 + } + else if(USE_HORIZONTAL==1) + { + LCD_WR_REG(0x2a);//列地址设置 + LCD_WR_DATA(x1); + LCD_WR_DATA(x2); + LCD_WR_REG(0x2b);//行地址设置 + LCD_WR_DATA(y1+80); + LCD_WR_DATA(y2+80); + LCD_WR_REG(0x2c);//储存器写 + } + else if(USE_HORIZONTAL==2) + { + LCD_WR_REG(0x2a);//列地址设置 + LCD_WR_DATA(x1); + LCD_WR_DATA(x2); + LCD_WR_REG(0x2b);//行地址设置 + LCD_WR_DATA(y1); + LCD_WR_DATA(y2); + LCD_WR_REG(0x2c);//储存器写 + } + else + { + LCD_WR_REG(0x2a);//列地址设置 + LCD_WR_DATA(x1+80); + LCD_WR_DATA(x2+80); + LCD_WR_REG(0x2b);//行地址设置 + LCD_WR_DATA(y1); + LCD_WR_DATA(y2); + LCD_WR_REG(0x2c);//储存器写 + } +} + + +/****************************************************************************** + 函数说明:LCD初始化函数 + 入口数据:无 + 返回值: 无 +******************************************************************************/ +void Lcd_Init(void) +{ + + + +//************* Start Initial Sequence **********// +LCD_WR_REG(0x36); +if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00); +else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0); +else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70); +else LCD_WR_DATA8(0xA0); + +LCD_WR_REG(0x3A); +LCD_WR_DATA8(0x05); + +LCD_WR_REG(0xB2); +LCD_WR_DATA8(0x0C); +LCD_WR_DATA8(0x0C); +LCD_WR_DATA8(0x00); +LCD_WR_DATA8(0x33); +LCD_WR_DATA8(0x33); + +LCD_WR_REG(0xB7); +LCD_WR_DATA8(0x35); + +LCD_WR_REG(0xBB); +LCD_WR_DATA8(0x19); + +LCD_WR_REG(0xC0); +LCD_WR_DATA8(0x2C); + +LCD_WR_REG(0xC2); +LCD_WR_DATA8(0x01); + +LCD_WR_REG(0xC3); +LCD_WR_DATA8(0x12); + +LCD_WR_REG(0xC4); +LCD_WR_DATA8(0x20); + +LCD_WR_REG(0xC6); +LCD_WR_DATA8(0x0F); + +LCD_WR_REG(0xD0); +LCD_WR_DATA8(0xA4); +LCD_WR_DATA8(0xA1); + +LCD_WR_REG(0xE0); +LCD_WR_DATA8(0xD0); +LCD_WR_DATA8(0x04); +LCD_WR_DATA8(0x0D); +LCD_WR_DATA8(0x11); +LCD_WR_DATA8(0x13); +LCD_WR_DATA8(0x2B); +LCD_WR_DATA8(0x3F); +LCD_WR_DATA8(0x54); +LCD_WR_DATA8(0x4C); +LCD_WR_DATA8(0x18); +LCD_WR_DATA8(0x0D); +LCD_WR_DATA8(0x0B); +LCD_WR_DATA8(0x1F); +LCD_WR_DATA8(0x23); + +LCD_WR_REG(0xE1); +LCD_WR_DATA8(0xD0); +LCD_WR_DATA8(0x04); +LCD_WR_DATA8(0x0C); +LCD_WR_DATA8(0x11); +LCD_WR_DATA8(0x13); +LCD_WR_DATA8(0x2C); +LCD_WR_DATA8(0x3F); +LCD_WR_DATA8(0x44); +LCD_WR_DATA8(0x51); +LCD_WR_DATA8(0x2F); +LCD_WR_DATA8(0x1F); +LCD_WR_DATA8(0x1F); +LCD_WR_DATA8(0x20); +LCD_WR_DATA8(0x23); + +LCD_WR_REG(0x21); + +LCD_WR_REG(0x11); +//Delay (120); + +LCD_WR_REG(0x29); +} + + +/****************************************************************************** + 函数说明:LCD清屏函数 + 入口数据:无 + 返回值: 无 +******************************************************************************/ +void LCD_Clear(uint16_t Color) +{ + uint16_t i,j; + LCD_Address_Set(0,0,LCD_W-1,LCD_H-1); + for(i=0;i>10; + c=c&0x03ff; + unsigned int g=c>>5; + c=c&0x001f; + unsigned int b=c; + + unsigned int output=0; + + g=g*2; + output= (r<<11)|(g<<5)|(b); + return output; + +} + +void lcd_init() +{ + + pinMode(LCD_SDA, OUTPUT); + pinMode(LCD_SCL, OUTPUT); + pinMode(LCD_CS, OUTPUT); + pinMode(LCD_DS, OUTPUT); + + + + digitalWrite(LCD_SDA,0); + digitalWrite(LCD_SCL,0); + digitalWrite(LCD_CS,0); + digitalWrite(LCD_DS,0); + + vspi = new SPIClass(VSPI); + vspi->begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS); + vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0)); + pinMode(vspi->pinSS(), OUTPUT); //HSPI SS + + + digitalWrite(vspi->pinSS(), LOW); //pull SS slow to prep other end for transfer + + pinMode(LCD_LED, OUTPUT); + digitalWrite(LCD_LED,1); + + Lcd_Init(); +} \ No newline at end of file diff --git a/esp32c3_code/lcd.h b/esp32c3_code/lcd.h new file mode 100644 index 0000000..a935593 --- /dev/null +++ b/esp32c3_code/lcd.h @@ -0,0 +1,35 @@ +#ifndef LCD_H +#define LCD_H + +#include + +//硬件spi貌似接错线了 + +#define LCD_SDA 3 +#define LCD_SCL 2 +#define LCD_CS 7 +#define LCD_DS 6 +#define LCD_LED 10 + +#define VSPI_MISO 10 +#define VSPI_MOSI 3 +#define VSPI_SCLK 2 +#define VSPI_SS 7 + +#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏 +#define LCD_W 240 +#define LCD_H 240 +#define OLED_CMD 0 //写命令 +#define OLED_DATA 1 //写数据 + +#define VSPI FSPI + + +static const long spiClk = 80000000; // 80 MHz + + +void lcd_init(); + +void LCD_Clear(uint16_t Color); + +#endif