- #ifndef __LCD_H
- #define __LCD_H
- #include "main.h"
- #include "stdio.h"
- #include "lvgl.h"
- // LCD的寬和高定義
- #define USE_HORIZONTAL 2// 設置橫屏或者豎屏顯示 0或1為豎屏 2或3為橫屏
- #if USE_HORIZONTAL == 0 || USE_HORIZONTAL == 1
- #define LCD_WIDTH 240
- #define LCD_W 240
- #define LCD_HEIGHT 320
- #define LCD_H 320
- #else
- #define LCD_W 240
- #define LCD_WIDTH 240
- #define LCD_H 320
- #define LCD_HEIGHT 320
- #endif
- // GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_06, GPIO_FUNC_43); // SPI3_SCK
- // GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_07, GPIO_FUNC_40); // SPI3_MOSI
- #define LCD_POART GPIO_PORT_B
- #define LCD_SCLK_PIN GPIO_PIN_06
- #define LCD_SCLK_FUNC GPIO_FUNC_43
- #define LCD_MOSI_PIN GPIO_PIN_07
- #define LCD_MOSI_FUNC GPIO_FUNC_40
- #define SPI_FCG FCG1_PERIPH_SPI3 // 時鐘
- #define LCD_SPI CM_SPI3
- #define LCD_CS_PORT GPIO_PORT_A
- #define LCD_CS_PIN GPIO_PIN_01
- #define LCD_DC_PORT GPIO_PORT_B
- #define LCD_DC_PIN GPIO_PIN_08
- #define LCD_RST_PORT GPIO_PORT_B
- #define LCD_RST_PIN GPIO_PIN_09
- #define LCD_BLK_PORT GPIO_PORT_B
- #define LCD_BLK_PIN GPIO_PIN_03
- // 控制引腳操作宏定義
- #define LCD_CS_Clr() GPIO_ResetPins(LCD_CS_PORT, LCD_CS_PIN)
- #define LCD_CS_Set() GPIO_SetPins(LCD_CS_PORT, LCD_CS_PIN)
- #define LCD_DC_Clr() GPIO_ResetPins(LCD_DC_PORT, LCD_DC_PIN)
- #define LCD_DC_Set() GPIO_SetPins(LCD_DC_PORT, LCD_DC_PIN)
- #define LCD_RES_Clr() GPIO_ResetPins(LCD_RST_PORT, LCD_RST_PIN)
- #define LCD_RES_Set() GPIO_SetPins(LCD_RST_PORT, LCD_RST_PIN)
- #define LCD_BLK_Set() GPIO_ResetPins(LCD_BLK_PORT, LCD_BLK_PIN)
- #define LCD_BLK_Clr() GPIO_SetPins(LCD_BLK_PORT, LCD_BLK_PIN)
- void LCD_Init(void);
- void LCD_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, lv_color_t *color);
- #endif
復制代碼- #include "tftlcd.h"
- extern uint32_t test_var;
- // 緩沖區定義
- #define COLOR_FILL_BUFFER_SIZE (240 * 4)
- uint16_t color_fill_buffer[COLOR_FILL_BUFFER_SIZE];
- void LCD_GPIO_Init(void)
- {
- stc_gpio_init_t stcGpioInit; // 定義GPIO結構體
- GPIO_SetDebugPort(GPIO_PIN_TDO, DISABLE); // 關閉調試端口,釋放相關引腳
- GPIO_SetDebugPort(GPIO_PIN_SWO, DISABLE);
- (void)GPIO_StructInit(&stcGpioInit); // 使用默認參數配置結構體
- stcGpioInit.u16PinState = PIN_STAT_SET; // 高電平
- stcGpioInit.u16PinDir = PIN_DIR_OUT; // 輸出模式
- stcGpioInit.u16PinOutputType = PIN_OUT_TYPE_CMOS; // 推挽輸出
- stcGpioInit.u16PinDrv = PIN_HIGH_DRV; // 驅動能力高
- stcGpioInit.u16PullUp = PIN_PU_OFF;
- // SCLK
- (void)GPIO_Init(LCD_POART, LCD_SCLK_PIN, &stcGpioInit);
- // MOSI = SDA
- (void)GPIO_Init(LCD_POART, LCD_MOSI_PIN, &stcGpioInit);
- // RES
- (void)GPIO_Init(LCD_RST_PORT, LCD_RST_PIN, &stcGpioInit);
- // DC
- (void)GPIO_Init(LCD_DC_PORT, LCD_DC_PIN, &stcGpioInit);
- // CS
- (void)GPIO_Init(LCD_CS_PORT, LCD_CS_PIN, &stcGpioInit);
- // BLK
- (void)GPIO_Init(LCD_BLK_PORT, LCD_BLK_PIN, &stcGpioInit);
- // SCLK MOSI 引腳設為復用模式
- GPIO_SetFunc(LCD_POART, LCD_SCLK_PIN, LCD_SCLK_FUNC);
- GPIO_SetFunc(LCD_POART, LCD_MOSI_PIN, LCD_MOSI_FUNC);
- stc_spi_init_t stcSpiInit;
- stc_spi_delay_t stcSpiDelayCfg;
- // 使用默認參數初始化結構體
- (void)SPI_StructInit(&stcSpiInit);
- (void)SPI_DelayStructInit(&stcSpiDelayCfg);
- // 開啟SPI時鐘
- FCG_Fcg1PeriphClockCmd(SPI_FCG, ENABLE);
- // 清空SPI配置
- SPI_DeInit(LCD_SPI);
- // 設置SPI必要參數
- stcSpiInit.u32WireMode = SPI_3_WIRE; // SPI3線模式
- stcSpiInit.u32TransMode = SPI_FULL_DUPLEX;
- stcSpiInit.u32MasterSlave = SPI_MASTER; // SPI主機
- stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE;
- stcSpiInit.u32SuspendMode = SPI_COM_SUSP_FUNC_OFF; // 不自動掛起
- stcSpiInit.u32Parity = SPI_PARITY_INVD; // 不開奇偶校驗
- stcSpiInit.u32SpiMode = SPI_MD_0; // 空閑低電平,奇數邊沿采樣
- stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV2; //
- stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; // 一次傳輸8位
- stcSpiInit.u32FirstBit = SPI_FIRST_MSB; // 高位在前
- // 初始化SPI
- (void)SPI_Init(LCD_SPI, &stcSpiInit);
- // // 配置SPI延時必要參數
- // stcSpiDelayCfg.u32IntervalDelay = SPI_INTERVAL_TIME_1SCK; // t3:下次存取延時
- // stcSpiDelayCfg.u32ReleaseDelay = SPI_RELEASE_TIME_1SCK; // t2:振蕩停止到片選無效時間
- // stcSpiDelayCfg.u32SetupDelay = SPI_SETUP_TIME_1SCK; // t1:片選有效到開始振蕩時間
- // (void)SPI_DelayTimeConfig(LCD_SPI, &stcSpiDelayCfg);
- // 使能SPI
- SPI_Cmd(LCD_SPI, ENABLE);
- // // CS 拉高
- LCD_CS_Set();
- }
- /******************************************************************************
- 函數說明:LCD串行數據寫入函數
- 入口數據:dat 要寫入的串行數據
- 返回值: 無
- ******************************************************************************/
- void LCD_Writ_Bus(uint8_t dat)
- {
- LCD_CS_Clr();
- uint8_t RecvData = 0;
- // 等待發送緩沖區為空
- while (RESET == SPI_GetStatus(LCD_SPI, SPI_FLAG_TX_BUF_EMPTY))
- ;
- // 發送并接收數據
- SPI_TransReceive(LCD_SPI, &dat, &RecvData, 1, HCLK_VALUE);
- LCD_CS_Set();
- }
- /******************************************************************************
- 函數說明:LCD寫入數據
- 入口數據:dat 寫入的數據
- 返回值: 無
- ******************************************************************************/
- void LCD_WR_DATA8(uint8_t dat)
- {
- LCD_DC_Set(); // 寫數據
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函數說明:LCD寫入數據
- 入口數據:dat 寫入的數據
- 返回值: 無
- ******************************************************************************/
- void LCD_WR_DATA(uint16_t dat)
- {
- LCD_Writ_Bus(dat >> 8);
- LCD_Writ_Bus(dat & 0xff);
- }
- /******************************************************************************
- 函數說明:LCD寫入命令
- 入口數據:dat 寫入的命令
- 返回值: 無
- ******************************************************************************/
- void LCD_WR_REG(uint8_t dat)
- {
- LCD_DC_Clr(); // 寫命令
- LCD_Writ_Bus(dat);
- LCD_DC_Set(); // 寫數據
- }
- /**
- * @brief 設置顯示窗口
- * @param x1:窗口列起始地址
- * @param y1:坐標行起始地址
- * @param x2:窗口列結束地址
- * @param y2:坐標行結束地址
- * @retval 無
- */
- 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);
- LCD_WR_DATA(y2);
- 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);
- LCD_WR_DATA(x2);
- LCD_WR_REG(0x2b); // 行地址設置
- LCD_WR_DATA(y1);
- LCD_WR_DATA(y2);
- LCD_WR_REG(0x2c); // 儲存器寫
- }
- }
- /**
- * @brief LCD初始化
- */
- void LCD_Init(void)
- {
- // 初始化GPIO、SPI和DMA
- LCD_GPIO_Init();
- LCD_RES_Clr(); // 復位
- DDL_DelayMS(120);
- LCD_RES_Set();
- DDL_DelayMS(120);
- LCD_BLK_Set(); // 打開背光
- DDL_DelayMS(120);
- LCD_WR_REG(0x11);
- // 延時至少120ms
- DDL_DelayMS(120);
- 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(0x1A);
- LCD_WR_REG(0xC0);
- LCD_WR_DATA8(0x2C);
- LCD_WR_REG(0xC2);
- LCD_WR_DATA8(0x01);
- LCD_WR_REG(0xC3);
- LCD_WR_DATA8(0x0B);
- 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(0x21);
- LCD_WR_REG(0xE0);
- LCD_WR_DATA8(0xF0);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x29);
- LCD_WR_DATA8(0x33);
- LCD_WR_DATA8(0x3E);
- LCD_WR_DATA8(0x38);
- LCD_WR_DATA8(0x12);
- LCD_WR_DATA8(0x12);
- LCD_WR_DATA8(0x28);
- LCD_WR_DATA8(0x30);
- LCD_WR_REG(0xE1);
- LCD_WR_DATA8(0xF0);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x0B);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x28);
- LCD_WR_DATA8(0x33);
- LCD_WR_DATA8(0x3E);
- LCD_WR_DATA8(0x36);
- LCD_WR_DATA8(0x14);
- LCD_WR_DATA8(0x14);
- LCD_WR_DATA8(0x29);
- LCD_WR_DATA8(0x32);
- LCD_WR_REG(0x20); // 反色St7789
- LCD_WR_REG(0x11);
- LCD_Fill(0, 0, LCD_HEIGHT, LCD_WIDTH, 0x0000);
- LCD_WR_REG(0x29);
- test_var = 1000;
- }
- // void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color)
- // {
- // uint16_t i, j;
- // LCD_Address_Set(xsta, ysta, xend - 1, yend - 1);
- // for (i = ysta; i < yend; i++)
- // {
- // for (j = xsta; j < xend; j++)
- // {
- // LCD_WR_DATA(color);
- // }
- // }
- // }
- void LCD_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, lv_color_t *color)
- {
- uint16_t i, j;
- uint32_t k = 0;
- uint32_t x = 0, y = 0;
- uint16_t height, width;
- width = ex - sx + 1; // 得到填充的寬度
- height = ey - sy + 1; // 高度
- LCD_Address_Set(sx, sy, ex, ey);
- for (y = 0; y < width * height; y++)
- {
- LCD_WR_DATA(color->full);
- color++;
- }
- }
復制代碼
|