STM32F401VET6 PROTEUS8 ILI9341 驱动显示及仿真

avatar
作者
筋斗云
阅读量:0

stm32cubemx新建工程代码,并生成工程

设置gpio

设置SPI

其他的参考stm32默认设置

然后编辑驱动代码 ili9341.h

#ifndef ILI9341_H #define ILI9341_H  #include <stdbool.h> #include <stdint.h>  #include "glcdfont.h" #include "stm32f4xx_hal.h"  #define ILI9341_TFTWIDTH  240 #define ILI9341_TFTHEIGHT 320  #define ILI9341_NOP     0x00 #define ILI9341_SWRESET 0x01 #define ILI9341_RDDID   0x04 #define ILI9341_RDDST   0x09  #define ILI9341_SLPIN   0x10 #define ILI9341_SLPOUT  0x11 #define ILI9341_PTLON   0x12 #define ILI9341_NORON   0x13  #define ILI9341_RDMODE  0x0A #define ILI9341_RDMADCTL  0x0B #define ILI9341_RDPIXFMT  0x0C #define ILI9341_RDIMGFMT  0x0D #define ILI9341_RDSELFDIAG  0x0F  #define ILI9341_INVOFF  0x20 #define ILI9341_INVON   0x21 #define ILI9341_GAMMASET 0x26 #define ILI9341_DISPOFF 0x28 #define ILI9341_DISPON  0x29  #define ILI9341_CASET   0x2A #define ILI9341_PASET   0x2B #define ILI9341_RAMWR   0x2C #define ILI9341_RAMRD   0x2E  #define ILI9341_PTLAR   0x30 #define ILI9341_MADCTL  0x36 #define ILI9341_PIXFMT  0x3A  #define ILI9341_FRMCTR1 0xB1 #define ILI9341_FRMCTR2 0xB2 #define ILI9341_FRMCTR3 0xB3 #define ILI9341_INVCTR  0xB4 #define ILI9341_DFUNCTR 0xB6  #define ILI9341_PWCTR1  0xC0 #define ILI9341_PWCTR2  0xC1 #define ILI9341_PWCTR3  0xC2 #define ILI9341_PWCTR4  0xC3 #define ILI9341_PWCTR5  0xC4 #define ILI9341_VMCTR1  0xC5 #define ILI9341_VMCTR2  0xC7  #define ILI9341_RDID1   0xDA #define ILI9341_RDID2   0xDB #define ILI9341_RDID3   0xDC #define ILI9341_RDID4   0xDD  #define ILI9341_GMCTRP1 0xE0 #define ILI9341_GMCTRN1 0xE1 /* #define ILI9341_PWCTR6  0xFC  */  // Color definitions #define ILI9341_BLACK       0x0000      /*   0,   0,   0 */ #define ILI9341_NAVY        0x000F      /*   0,   0, 128 */ #define ILI9341_DARKGREEN   0x03E0      /*   0, 128,   0 */ #define ILI9341_DARKCYAN    0x03EF      /*   0, 128, 128 */ #define ILI9341_MAROON      0x7800      /* 128,   0,   0 */ #define ILI9341_PURPLE      0x780F      /* 128,   0, 128 */ #define ILI9341_OLIVE       0x7BE0      /* 128, 128,   0 */ #define ILI9341_LIGHTGREY   0xC618      /* 192, 192, 192 */ #define ILI9341_DARKGREY    0x7BEF      /* 128, 128, 128 */ #define ILI9341_BLUE        0x001F      /*   0,   0, 255 */ #define ILI9341_GREEN       0x07E0      /*   0, 255,   0 */ #define ILI9341_CYAN        0x07FF      /*   0, 255, 255 */ #define ILI9341_RED         0xF800      /* 255,   0,   0 */ #define ILI9341_MAGENTA     0xF81F      /* 255,   0, 255 */ #define ILI9341_YELLOW      0xFFE0      /* 255, 255,   0 */ #define ILI9341_WHITE       0xFFFF      /* 255, 255, 255 */ #define ILI9341_ORANGE      0xFD20      /* 255, 165,   0 */ #define ILI9341_GREENYELLOW 0xAFE5      /* 173, 255,  47 */ #define ILI9341_PINK        0xF81F  void ILI9341_begin(SPI_HandleTypeDef *hSpi); void ILI9341_drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); void ILI9341_fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); void ILI9341_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); void ILI9341_drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); void ILI9341_fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); void ILI9341_fillScreen(uint16_t color); void ILI9341_invertDisplay(bool i); void ILI9341_drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color); void ILI9341_fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color); void ILI9341_drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color); void ILI9341_fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color); void ILI9341_setTextSize(uint8_t s); void ILI9341_setTextColor(uint16_t c); void ILI9341_setTextBgColor(uint16_t c); void ILI9341_setTextWrap(bool w); void ILI9341_setCursor(int16_t x, int16_t y); uint16_t ILI9341_getCursorX(void); uint16_t ILI9341_getCursorY(void); void ILI9341_write(uint8_t c); void ILI9341_getTextBounds(char *str, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h); void ILI9341_cp437(bool x); uint16_t ILI9341_width(void); uint16_t ILI9341_height(void); void ILI9341_pushColor(uint16_t color); void ILI9341_drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); void ILI9341_drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); uint16_t ILI9341_color565(uint8_t r, uint8_t g, uint8_t b); void ILI9341_setRotation(uint8_t m); uint16_t ILI9341_getRotation(void);  #endif 

glcdfont.h

#ifndef GLCDFONT_H #define GLCDFONT_H  static const unsigned char font[] = {     0x00, 0x00, 0x00, 0x00, 0x00,     0x3E, 0x5B, 0x4F, 0x5B, 0x3E,     0x3E, 0x6B, 0x4F, 0x6B, 0x3E,     0x1C, 0x3E, 0x7C, 0x3E, 0x1C,     0x18, 0x3C, 0x7E, 0x3C, 0x18,     0x1C, 0x57, 0x7D, 0x57, 0x1C,     0x1C, 0x5E, 0x7F, 0x5E, 0x1C,     0x00, 0x18, 0x3C, 0x18, 0x00,     0xFF, 0xE7, 0xC3, 0xE7, 0xFF,     0x00, 0x18, 0x24, 0x18, 0x00,     0xFF, 0xE7, 0xDB, 0xE7, 0xFF,     0x30, 0x48, 0x3A, 0x06, 0x0E,     0x26, 0x29, 0x79, 0x29, 0x26,     0x40, 0x7F, 0x05, 0x05, 0x07,     0x40, 0x7F, 0x05, 0x25, 0x3F,     0x5A, 0x3C, 0xE7, 0x3C, 0x5A,     0x7F, 0x3E, 0x1C, 0x1C, 0x08,     0x08, 0x1C, 0x1C, 0x3E, 0x7F,     0x14, 0x22, 0x7F, 0x22, 0x14,     0x5F, 0x5F, 0x00, 0x5F, 0x5F,     0x06, 0x09, 0x7F, 0x01, 0x7F,     0x00, 0x66, 0x89, 0x95, 0x6A,     0x60, 0x60, 0x60, 0x60, 0x60,     0x94, 0xA2, 0xFF, 0xA2, 0x94,     0x08, 0x04, 0x7E, 0x04, 0x08,     0x10, 0x20, 0x7E, 0x20, 0x10,     0x08, 0x08, 0x2A, 0x1C, 0x08,     0x08, 0x1C, 0x2A, 0x08, 0x08,     0x1E, 0x10, 0x10, 0x10, 0x10,     0x0C, 0x1E, 0x0C, 0x1E, 0x0C,     0x30, 0x38, 0x3E, 0x38, 0x30,     0x06, 0x0E, 0x3E, 0x0E, 0x06,     0x00, 0x00, 0x00, 0x00, 0x00,     0x00, 0x00, 0x5F, 0x00, 0x00,     0x00, 0x07, 0x00, 0x07, 0x00,     0x14, 0x7F, 0x14, 0x7F, 0x14,     0x24, 0x2A, 0x7F, 0x2A, 0x12,     0x23, 0x13, 0x08, 0x64, 0x62,     0x36, 0x49, 0x56, 0x20, 0x50,     0x00, 0x08, 0x07, 0x03, 0x00,     0x00, 0x1C, 0x22, 0x41, 0x00,     0x00, 0x41, 0x22, 0x1C, 0x00,     0x2A, 0x1C, 0x7F, 0x1C, 0x2A,     0x08, 0x08, 0x3E, 0x08, 0x08,     0x00, 0x80, 0x70, 0x30, 0x00,     0x08, 0x08, 0x08, 0x08, 0x08,     0x00, 0x00, 0x60, 0x60, 0x00,     0x20, 0x10, 0x08, 0x04, 0x02,     0x3E, 0x51, 0x49, 0x45, 0x3E,     0x00, 0x42, 0x7F, 0x40, 0x00,     0x72, 0x49, 0x49, 0x49, 0x46,     0x21, 0x41, 0x49, 0x4D, 0x33,     0x18, 0x14, 0x12, 0x7F, 0x10,     0x27, 0x45, 0x45, 0x45, 0x39,     0x3C, 0x4A, 0x49, 0x49, 0x31,     0x41, 0x21, 0x11, 0x09, 0x07,     0x36, 0x49, 0x49, 0x49, 0x36,     0x46, 0x49, 0x49, 0x29, 0x1E,     0x00, 0x00, 0x14, 0x00, 0x00,     0x00, 0x40, 0x34, 0x00, 0x00,     0x00, 0x08, 0x14, 0x22, 0x41,     0x14, 0x14, 0x14, 0x14, 0x14,     0x00, 0x41, 0x22, 0x14, 0x08,     0x02, 0x01, 0x59, 0x09, 0x06,     0x3E, 0x41, 0x5D, 0x59, 0x4E,     0x7C, 0x12, 0x11, 0x12, 0x7C,     0x7F, 0x49, 0x49, 0x49, 0x36,     0x3E, 0x41, 0x41, 0x41, 0x22,     0x7F, 0x41, 0x41, 0x41, 0x3E,     0x7F, 0x49, 0x49, 0x49, 0x41,     0x7F, 0x09, 0x09, 0x09, 0x01,     0x3E, 0x41, 0x41, 0x51, 0x73,     0x7F, 0x08, 0x08, 0x08, 0x7F,     0x00, 0x41, 0x7F, 0x41, 0x00,     0x20, 0x40, 0x41, 0x3F, 0x01,     0x7F, 0x08, 0x14, 0x22, 0x41,     0x7F, 0x40, 0x40, 0x40, 0x40,     0x7F, 0x02, 0x1C, 0x02, 0x7F,     0x7F, 0x04, 0x08, 0x10, 0x7F,     0x3E, 0x41, 0x41, 0x41, 0x3E,     0x7F, 0x09, 0x09, 0x09, 0x06,     0x3E, 0x41, 0x51, 0x21, 0x5E,     0x7F, 0x09, 0x19, 0x29, 0x46,     0x26, 0x49, 0x49, 0x49, 0x32,     0x03, 0x01, 0x7F, 0x01, 0x03,     0x3F, 0x40, 0x40, 0x40, 0x3F,     0x1F, 0x20, 0x40, 0x20, 0x1F,     0x3F, 0x40, 0x38, 0x40, 0x3F,     0x63, 0x14, 0x08, 0x14, 0x63,     0x03, 0x04, 0x78, 0x04, 0x03,     0x61, 0x59, 0x49, 0x4D, 0x43,     0x00, 0x7F, 0x41, 0x41, 0x41,     0x02, 0x04, 0x08, 0x10, 0x20,     0x00, 0x41, 0x41, 0x41, 0x7F,     0x04, 0x02, 0x01, 0x02, 0x04,     0x40, 0x40, 0x40, 0x40, 0x40,     0x00, 0x03, 0x07, 0x08, 0x00,     0x20, 0x54, 0x54, 0x78, 0x40,     0x7F, 0x28, 0x44, 0x44, 0x38,     0x38, 0x44, 0x44, 0x44, 0x28,     0x38, 0x44, 0x44, 0x28, 0x7F,     0x38, 0x54, 0x54, 0x54, 0x18,     0x00, 0x08, 0x7E, 0x09, 0x02,     0x18, 0xA4, 0xA4, 0x9C, 0x78,     0x7F, 0x08, 0x04, 0x04, 0x78,     0x00, 0x44, 0x7D, 0x40, 0x00,     0x20, 0x40, 0x40, 0x3D, 0x00,     0x7F, 0x10, 0x28, 0x44, 0x00,     0x00, 0x41, 0x7F, 0x40, 0x00,     0x7C, 0x04, 0x78, 0x04, 0x78,     0x7C, 0x08, 0x04, 0x04, 0x78,     0x38, 0x44, 0x44, 0x44, 0x38,     0xFC, 0x18, 0x24, 0x24, 0x18,     0x18, 0x24, 0x24, 0x18, 0xFC,     0x7C, 0x08, 0x04, 0x04, 0x08,     0x48, 0x54, 0x54, 0x54, 0x24,     0x04, 0x04, 0x3F, 0x44, 0x24,     0x3C, 0x40, 0x40, 0x20, 0x7C,     0x1C, 0x20, 0x40, 0x20, 0x1C,     0x3C, 0x40, 0x30, 0x40, 0x3C,     0x44, 0x28, 0x10, 0x28, 0x44,     0x4C, 0x90, 0x90, 0x90, 0x7C,     0x44, 0x64, 0x54, 0x4C, 0x44,     0x00, 0x08, 0x36, 0x41, 0x00,     0x00, 0x00, 0x77, 0x00, 0x00,     0x00, 0x41, 0x36, 0x08, 0x00,     0x02, 0x01, 0x02, 0x04, 0x02,     0x3C, 0x26, 0x23, 0x26, 0x3C,     0x1E, 0xA1, 0xA1, 0x61, 0x12,     0x3A, 0x40, 0x40, 0x20, 0x7A,     0x38, 0x54, 0x54, 0x55, 0x59,     0x21, 0x55, 0x55, 0x79, 0x41,     0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut     0x21, 0x55, 0x54, 0x78, 0x40,     0x20, 0x54, 0x55, 0x79, 0x40,     0x0C, 0x1E, 0x52, 0x72, 0x12,     0x39, 0x55, 0x55, 0x55, 0x59,     0x39, 0x54, 0x54, 0x54, 0x59,     0x39, 0x55, 0x54, 0x54, 0x58,     0x00, 0x00, 0x45, 0x7C, 0x41,     0x00, 0x02, 0x45, 0x7D, 0x42,     0x00, 0x01, 0x45, 0x7C, 0x40,     0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut     0xF0, 0x28, 0x25, 0x28, 0xF0,     0x7C, 0x54, 0x55, 0x45, 0x00,     0x20, 0x54, 0x54, 0x7C, 0x54,     0x7C, 0x0A, 0x09, 0x7F, 0x49,     0x32, 0x49, 0x49, 0x49, 0x32,     0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut     0x32, 0x4A, 0x48, 0x48, 0x30,     0x3A, 0x41, 0x41, 0x21, 0x7A,     0x3A, 0x42, 0x40, 0x20, 0x78,     0x00, 0x9D, 0xA0, 0xA0, 0x7D,     0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut     0x3D, 0x40, 0x40, 0x40, 0x3D,     0x3C, 0x24, 0xFF, 0x24, 0x24,     0x48, 0x7E, 0x49, 0x43, 0x66,     0x2B, 0x2F, 0xFC, 0x2F, 0x2B,     0xFF, 0x09, 0x29, 0xF6, 0x20,     0xC0, 0x88, 0x7E, 0x09, 0x03,     0x20, 0x54, 0x54, 0x79, 0x41,     0x00, 0x00, 0x44, 0x7D, 0x41,     0x30, 0x48, 0x48, 0x4A, 0x32,     0x38, 0x40, 0x40, 0x22, 0x7A,     0x00, 0x7A, 0x0A, 0x0A, 0x72,     0x7D, 0x0D, 0x19, 0x31, 0x7D,     0x26, 0x29, 0x29, 0x2F, 0x28,     0x26, 0x29, 0x29, 0x29, 0x26,     0x30, 0x48, 0x4D, 0x40, 0x20,     0x38, 0x08, 0x08, 0x08, 0x08,     0x08, 0x08, 0x08, 0x08, 0x38,     0x2F, 0x10, 0xC8, 0xAC, 0xBA,     0x2F, 0x10, 0x28, 0x34, 0xFA,     0x00, 0x00, 0x7B, 0x00, 0x00,     0x08, 0x14, 0x2A, 0x14, 0x22,     0x22, 0x14, 0x2A, 0x14, 0x08,     0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code     0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block     0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block     0x00, 0x00, 0x00, 0xFF, 0x00,     0x10, 0x10, 0x10, 0xFF, 0x00,     0x14, 0x14, 0x14, 0xFF, 0x00,     0x10, 0x10, 0xFF, 0x00, 0xFF,     0x10, 0x10, 0xF0, 0x10, 0xF0,     0x14, 0x14, 0x14, 0xFC, 0x00,     0x14, 0x14, 0xF7, 0x00, 0xFF,     0x00, 0x00, 0xFF, 0x00, 0xFF,     0x14, 0x14, 0xF4, 0x04, 0xFC,     0x14, 0x14, 0x17, 0x10, 0x1F,     0x10, 0x10, 0x1F, 0x10, 0x1F,     0x14, 0x14, 0x14, 0x1F, 0x00,     0x10, 0x10, 0x10, 0xF0, 0x00,     0x00, 0x00, 0x00, 0x1F, 0x10,     0x10, 0x10, 0x10, 0x1F, 0x10,     0x10, 0x10, 0x10, 0xF0, 0x10,     0x00, 0x00, 0x00, 0xFF, 0x10,     0x10, 0x10, 0x10, 0x10, 0x10,     0x10, 0x10, 0x10, 0xFF, 0x10,     0x00, 0x00, 0x00, 0xFF, 0x14,     0x00, 0x00, 0xFF, 0x00, 0xFF,     0x00, 0x00, 0x1F, 0x10, 0x17,     0x00, 0x00, 0xFC, 0x04, 0xF4,     0x14, 0x14, 0x17, 0x10, 0x17,     0x14, 0x14, 0xF4, 0x04, 0xF4,     0x00, 0x00, 0xFF, 0x00, 0xF7,     0x14, 0x14, 0x14, 0x14, 0x14,     0x14, 0x14, 0xF7, 0x00, 0xF7,     0x14, 0x14, 0x14, 0x17, 0x14,     0x10, 0x10, 0x1F, 0x10, 0x1F,     0x14, 0x14, 0x14, 0xF4, 0x14,     0x10, 0x10, 0xF0, 0x10, 0xF0,     0x00, 0x00, 0x1F, 0x10, 0x1F,     0x00, 0x00, 0x00, 0x1F, 0x14,     0x00, 0x00, 0x00, 0xFC, 0x14,     0x00, 0x00, 0xF0, 0x10, 0xF0,     0x10, 0x10, 0xFF, 0x10, 0xFF,     0x14, 0x14, 0x14, 0xFF, 0x14,     0x10, 0x10, 0x10, 0x1F, 0x00,     0x00, 0x00, 0x00, 0xF0, 0x10,     0xFF, 0xFF, 0xFF, 0xFF, 0xFF,     0xF0, 0xF0, 0xF0, 0xF0, 0xF0,     0xFF, 0xFF, 0xFF, 0x00, 0x00,     0x00, 0x00, 0x00, 0xFF, 0xFF,     0x0F, 0x0F, 0x0F, 0x0F, 0x0F,     0x38, 0x44, 0x44, 0x38, 0x44,     0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta     0x7E, 0x02, 0x02, 0x06, 0x06,     0x02, 0x7E, 0x02, 0x7E, 0x02,     0x63, 0x55, 0x49, 0x41, 0x63,     0x38, 0x44, 0x44, 0x3C, 0x04,     0x40, 0x7E, 0x20, 0x1E, 0x20,     0x06, 0x02, 0x7E, 0x02, 0x02,     0x99, 0xA5, 0xE7, 0xA5, 0x99,     0x1C, 0x2A, 0x49, 0x2A, 0x1C,     0x4C, 0x72, 0x01, 0x72, 0x4C,     0x30, 0x4A, 0x4D, 0x4D, 0x30,     0x30, 0x48, 0x78, 0x48, 0x30,     0xBC, 0x62, 0x5A, 0x46, 0x3D,     0x3E, 0x49, 0x49, 0x49, 0x00,     0x7E, 0x01, 0x01, 0x01, 0x7E,     0x2A, 0x2A, 0x2A, 0x2A, 0x2A,     0x44, 0x44, 0x5F, 0x44, 0x44,     0x40, 0x51, 0x4A, 0x44, 0x40,     0x40, 0x44, 0x4A, 0x51, 0x40,     0x00, 0x00, 0xFF, 0x01, 0x03,     0xE0, 0x80, 0xFF, 0x00, 0x00,     0x08, 0x08, 0x6B, 0x6B, 0x08,     0x36, 0x12, 0x36, 0x24, 0x36,     0x06, 0x0F, 0x09, 0x0F, 0x06,     0x00, 0x00, 0x18, 0x18, 0x00,     0x00, 0x00, 0x10, 0x10, 0x00,     0x30, 0x40, 0xFF, 0x01, 0x01,     0x00, 0x1F, 0x01, 0x01, 0x1E,     0x00, 0x19, 0x1D, 0x17, 0x12,     0x00, 0x3C, 0x3C, 0x3C, 0x3C,     0x00, 0x00, 0x00, 0x00, 0x00  // #255 NBSP };  #endif 

ILI9341.c

#include "ILI9341.h" #include "main.h" #include "stm32f4xx_hal.h"  #define pgm_read_byte(addr) (*(const unsigned char *)(addr))  #ifndef abs  #define abs(a) ((a) < 0 ? -(a) : (a)) #endif  #ifndef _swap_int16_t  #define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } #endif  static SPI_HandleTypeDef *_hSpi; static uint16_t _width = ILI9341_TFTWIDTH; static uint32_t _height = ILI9341_TFTHEIGHT; static uint16_t _rotation = 0; static uint16_t _cursor_x = 0; static uint16_t _cursor_y = 0; static uint16_t _textsize = 1; static uint16_t _textColor = 0xFFFF; static uint16_t _textBgColor = 0xFFFF; static bool _wrap = true; static bool _cp437 = false;  static void spiWrite(uint8_t c); static void writeCommand(uint8_t c); static void writeData(uint8_t c); static void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); static void drawPixel(int16_t x, int16_t y, uint16_t color); static void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color); static void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color); static void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size);  /* private (static) functions */  #define LCD_DC_GPIO_Port GPIOA #define LCD_CS_GPIO_Port GPIOA #define LCD_DC_Pin GPIO_PIN_9 #define LCD_CS_Pin GPIO_PIN_8  void spiWrite(uint8_t c) {   HAL_SPI_Transmit(_hSpi, &c, 1, 10); }  void writeCommand(uint8_t c) {   HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   spiWrite(c);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  void writeData(uint8_t c) {   HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   spiWrite(c);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {   writeCommand(ILI9341_CASET); // Column addr set   writeData(x0 >> 8);   writeData(x0 & 0xFF);     // XSTART   writeData(x1 >> 8);   writeData(x1 & 0xFF);     // XEND    writeCommand(ILI9341_PASET); // Row addr set   writeData(y0>>8);   writeData(y0);     // YSTART   writeData(y1>>8);   writeData(y1);     // YEND    writeCommand(ILI9341_RAMWR); // write to RAM }  void drawPixel(int16_t x, int16_t y, uint16_t color) {   if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;    setAddrWindow(x,y,x+1,y+1);   HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   spiWrite(color >> 8);   spiWrite(color);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  void fillCircleHelper(int16_t x0, int16_t y0, int16_t r,  uint8_t cornername, int16_t delta, uint16_t color) {    int16_t f     = 1 - r;   int16_t ddF_x = 1;   int16_t ddF_y = -2 * r;   int16_t x     = 0;   int16_t y     = r;    while (x<y) {     if (f >= 0) {       y--;       ddF_y += 2;       f     += ddF_y;     }     x++;     ddF_x += 2;     f     += ddF_x;      if (cornername & 0x1) {       ILI9341_drawFastVLine(x0+x, y0-y, 2*y+1+delta, color);       ILI9341_drawFastVLine(x0+y, y0-x, 2*x+1+delta, color);     }     if (cornername & 0x2) {       ILI9341_drawFastVLine(x0-x, y0-y, 2*y+1+delta, color);       ILI9341_drawFastVLine(x0-y, y0-x, 2*x+1+delta, color);     }   } }  void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color) {   int16_t f     = 1 - r;   int16_t ddF_x = 1;   int16_t ddF_y = -2 * r;   int16_t x     = 0;   int16_t y     = r;    while (x<y) {     if (f >= 0) {       y--;       ddF_y += 2;       f     += ddF_y;     }     x++;     ddF_x += 2;     f     += ddF_x;     if (cornername & 0x4) {       drawPixel(x0 + x, y0 + y, color);       drawPixel(x0 + y, y0 + x, color);     }     if (cornername & 0x2) {       drawPixel(x0 + x, y0 - y, color);       drawPixel(x0 + y, y0 - x, color);     }     if (cornername & 0x8) {       drawPixel(x0 - y, y0 + x, color);       drawPixel(x0 - x, y0 + y, color);     }     if (cornername & 0x1) {       drawPixel(x0 - y, y0 - x, color);       drawPixel(x0 - x, y0 - y, color);     }   } }  void drawChar(int16_t x, int16_t y, unsigned char c,  uint16_t color, uint16_t bg, uint8_t size) {   if((x >= _width)            || // Clip right      (y >= _height)           || // Clip bottom      ((x + 6 * size - 1) < 0) || // Clip left      ((y + 8 * size - 1) < 0))   // Clip top     return;    if(!_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior    for(int8_t i=0; i<6; i++ ) {     uint8_t line;     if(i < 5) line = pgm_read_byte(font+(c*5)+i);     else      line = 0x0;     for(int8_t j=0; j<8; j++, line >>= 1) {       if(line & 0x1) {         if(size == 1) drawPixel(x+i, y+j, color);         else          ILI9341_fillRect(x+(i*size), y+(j*size), size, size, color);       } else if(bg != color) {         if(size == 1) drawPixel(x+i, y+j, bg);         else          ILI9341_fillRect(x+i*size, y+j*size, size, size, bg);       }     }   } }  /* end private (static) functions */    /* public functions */  void ILI9341_begin(SPI_HandleTypeDef *hSpi) {   _hSpi = hSpi;   writeCommand(0xEF);   writeData(0x03);   writeData(0x80);   writeData(0x02);    writeCommand(0xCF);   writeData(0x00);   writeData(0XC1);   writeData(0X30);    writeCommand(0xED);   writeData(0x64);   writeData(0x03);   writeData(0X12);   writeData(0X81);    writeCommand(0xE8);   writeData(0x85);   writeData(0x00);   writeData(0x78);    writeCommand(0xCB);   writeData(0x39);   writeData(0x2C);   writeData(0x00);   writeData(0x34);   writeData(0x02);    writeCommand(0xF7);   writeData(0x20);    writeCommand(0xEA);   writeData(0x00);   writeData(0x00);    writeCommand(ILI9341_PWCTR1);    //Power control   writeData(0x23);   //VRH[5:0]    writeCommand(ILI9341_PWCTR2);    //Power control   writeData(0x10);   //SAP[2:0];BT[3:0]    writeCommand(ILI9341_VMCTR1);    //VCM control   writeData(0x3e); //¶Ô±È¶Èµ÷½Ú   writeData(0x28);    writeCommand(ILI9341_VMCTR2);    //VCM control2   writeData(0x86);  //--    writeCommand(ILI9341_MADCTL);    // Memory Access Control   writeData(0x48);    writeCommand(ILI9341_PIXFMT);   writeData(0x55);    writeCommand(ILI9341_FRMCTR1);   writeData(0x00);   writeData(0x18);    writeCommand(ILI9341_DFUNCTR);    // Display Function Control   writeData(0x08);   writeData(0x82);   writeData(0x27);    writeCommand(0xF2);    // 3Gamma Function Disable   writeData(0x00);    writeCommand(ILI9341_GAMMASET);    //Gamma curve selected   writeData(0x01);    writeCommand(ILI9341_GMCTRP1);    //Set Gamma   writeData(0x0F);   writeData(0x31);   writeData(0x2B);   writeData(0x0C);   writeData(0x0E);   writeData(0x08);   writeData(0x4E);   writeData(0xF1);   writeData(0x37);   writeData(0x07);   writeData(0x10);   writeData(0x03);   writeData(0x0E);   writeData(0x09);   writeData(0x00);    writeCommand(ILI9341_GMCTRN1);    //Set Gamma   writeData(0x00);   writeData(0x0E);   writeData(0x14);   writeData(0x03);   writeData(0x11);   writeData(0x07);   writeData(0x31);   writeData(0xC1);   writeData(0x48);   writeData(0x08);   writeData(0x0F);   writeData(0x0C);   writeData(0x31);   writeData(0x36);   writeData(0x0F);    writeCommand(ILI9341_SLPOUT);    //Exit Sleep   writeCommand(ILI9341_DISPON);    //Display on }  void ILI9341_drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {   int16_t f = 1 - r;   int16_t ddF_x = 1;   int16_t ddF_y = -2 * r;   int16_t x = 0;   int16_t y = r;    drawPixel(x0  , y0+r, color);   drawPixel(x0  , y0-r, color);   drawPixel(x0+r, y0  , color);   drawPixel(x0-r, y0  , color);    while (x<y) {     if (f >= 0) {       y--;       ddF_y += 2;       f += ddF_y;     }     x++;     ddF_x += 2;     f += ddF_x;      drawPixel(x0 + x, y0 + y, color);     drawPixel(x0 - x, y0 + y, color);     drawPixel(x0 + x, y0 - y, color);     drawPixel(x0 - x, y0 - y, color);     drawPixel(x0 + y, y0 + x, color);     drawPixel(x0 - y, y0 + x, color);     drawPixel(x0 + y, y0 - x, color);     drawPixel(x0 - y, y0 - x, color);   } }  void ILI9341_fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {   ILI9341_drawFastVLine(x0, y0-r, 2*r+1, color);   fillCircleHelper(x0, y0, r, 3, 0, color); }  void ILI9341_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) {   int16_t steep = abs(y1 - y0) > abs(x1 - x0);   if (steep) {     _swap_int16_t(x0, y0);     _swap_int16_t(x1, y1);   }    if (x0 > x1) {     _swap_int16_t(x0, x1);     _swap_int16_t(y0, y1);   }    int16_t dx, dy;   dx = x1 - x0;   dy = abs(y1 - y0);    int16_t err = dx / 2;   int16_t ystep;    if (y0 < y1) {     ystep = 1;   } else {     ystep = -1;   }    for (; x0<=x1; x0++) {     if (steep) {       drawPixel(y0, x0, color);     } else {       drawPixel(x0, y0, color);     }     err -= dy;     if (err < 0) {       y0 += ystep;       err += dx;     }   } }  void ILI9341_drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {   ILI9341_drawFastHLine(x, y, w, color);   ILI9341_drawFastHLine(x, y+h-1, w, color);   ILI9341_drawFastVLine(x, y, h, color);   ILI9341_drawFastVLine(x+w-1, y, h, color); }  // fill a rectangle void ILI9341_fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {    // rudimentary clipping (drawChar w/big text requires this)   if((x >= _width) || (y >= _height)) return;   if((x + w - 1) >= _width)  w = _width  - x;   if((y + h - 1) >= _height) h = _height - y;    setAddrWindow(x, y, x+w-1, y+h-1);    uint8_t hi = color >> 8, lo = color;    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   for(y=h; y>0; y--) {     for(x=w; x>0; x--) {       spiWrite(hi);       spiWrite(lo);     }   }   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  void ILI9341_fillScreen(uint16_t color) {   ILI9341_fillRect(0, 0,  _width, _height, color); }  void ILI9341_invertDisplay(bool i) {   writeCommand(i ? ILI9341_INVON : ILI9341_INVOFF); }  void ILI9341_drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) {   // smarter version   ILI9341_drawFastHLine(x+r  , y    , w-2*r, color); // Top   ILI9341_drawFastHLine(x+r  , y+h-1, w-2*r, color); // Bottom   ILI9341_drawFastVLine(x    , y+r  , h-2*r, color); // Left   ILI9341_drawFastVLine(x+w-1, y+r  , h-2*r, color); // Right   // draw four corners   drawCircleHelper(x+r    , y+r    , r, 1, color);   drawCircleHelper(x+w-r-1, y+r    , r, 2, color);   drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);   drawCircleHelper(x+r    , y+h-r-1, r, 8, color); }  void ILI9341_fillRoundRect(int16_t x, int16_t y, int16_t w,  int16_t h, int16_t r, uint16_t color) {   // smarter version   ILI9341_fillRect(x+r, y, w-2*r, h, color);    // draw four corners   fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);   fillCircleHelper(x+r    , y+r, r, 2, h-2*r-1, color); }  void ILI9341_drawTriangle(int16_t x0, int16_t y0,  int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {   ILI9341_drawLine(x0, y0, x1, y1, color);   ILI9341_drawLine(x1, y1, x2, y2, color);   ILI9341_drawLine(x2, y2, x0, y0, color); }  void ILI9341_fillTriangle(int16_t x0, int16_t y0,  int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {    int16_t a, b, y, last;    // Sort coordinates by Y order (y2 >= y1 >= y0)   if (y0 > y1) {     _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);   }   if (y1 > y2) {     _swap_int16_t(y2, y1); _swap_int16_t(x2, x1);   }   if (y0 > y1) {     _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);   }    if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing     a = b = x0;     if(x1 < a)      a = x1;     else if(x1 > b) b = x1;     if(x2 < a)      a = x2;     else if(x2 > b) b = x2;     ILI9341_drawFastHLine(a, y0, b-a+1, color);     return;   }    int16_t     dx01 = x1 - x0,     dy01 = y1 - y0,     dx02 = x2 - x0,     dy02 = y2 - y0,     dx12 = x2 - x1,     dy12 = y2 - y1;   int32_t     sa   = 0,     sb   = 0;    // For upper part of triangle, find scanline crossings for segments   // 0-1 and 0-2.  If y1=y2 (flat-bottomed triangle), the scanline y1   // is included here (and second loop will be skipped, avoiding a /0   // error there), otherwise scanline y1 is skipped here and handled   // in the second loop...which also avoids a /0 error here if y0=y1   // (flat-topped triangle).   if(y1 == y2) last = y1;   // Include y1 scanline   else         last = y1-1; // Skip it    for(y=y0; y<=last; y++) {     a   = x0 + sa / dy01;     b   = x0 + sb / dy02;     sa += dx01;     sb += dx02;     /* longhand:     a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);     b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);     */     if(a > b) _swap_int16_t(a,b);     ILI9341_drawFastHLine(a, y, b-a+1, color);   }    // For lower part of triangle, find scanline crossings for segments   // 0-2 and 1-2.  This loop is skipped if y1=y2.   sa = dx12 * (y - y1);   sb = dx02 * (y - y0);   for(; y<=y2; y++) {     a   = x1 + sa / dy12;     b   = x0 + sb / dy02;     sa += dx12;     sb += dx02;     /* longhand:     a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);     b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);     */     if(a > b) _swap_int16_t(a,b);     ILI9341_drawFastHLine(a, y, b-a+1, color);   } }  void ILI9341_setTextSize(uint8_t s) {   _textsize = (s > 0) ? s : 1; }  void ILI9341_setTextColor(uint16_t c) {   // For 'transparent' background, we'll set the bg   // to the same as fg instead of using a flag   _textColor = c; }  void ILI9341_setTextBgColor(uint16_t c) {   // For 'transparent' background, we'll set the bg   // to the same as fg instead of using a flag   _textBgColor = c; }  void ILI9341_setTextWrap(bool w) {   _wrap = w; }  void ILI9341_setCursor(int16_t x, int16_t y) {   _cursor_x = x;   _cursor_y = y; }  uint16_t ILI9341_getCursorX(void) {   return _cursor_x; }  uint16_t ILI9341_getCursorY(void) {   return _cursor_y; }  void ILI9341_write(uint8_t c) {   if(c == '\n') {     _cursor_y += _textsize*8;     _cursor_x  = 0;   } else if(c == '\r') {     // skip em   } else {     if(_wrap && ((_cursor_x + _textsize * 6) >= _width)) { // Heading off edge?       _cursor_x  = 0;            // Reset x to zero       _cursor_y += _textsize * 8; // Advance y one line     }     drawChar(_cursor_x, _cursor_y, c, _textColor, _textBgColor, _textsize);     _cursor_x += _textsize * 6;   } }  // Pass string and a cursor position, returns UL corner and W,H. void ILI9341_getTextBounds(char *str, int16_t x, int16_t y,  int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {   uint8_t c; // Current character    *x1 = x;   *y1 = y;   *w  = *h = 0;    uint16_t lineWidth = 0, maxWidth = 0; // Width of current, all lines    while((c = *str++)) {     if(c != '\n') { // Not a newline       if(c != '\r') { // Not a carriage return, is normal char         if(_wrap && ((x + _textsize * 6) >= _width)) {           x  = 0;            // Reset x to 0           y += _textsize * 8; // Advance y by 1 line           if(lineWidth > maxWidth) maxWidth = lineWidth; // Save widest line           lineWidth  = _textsize * 6; // First char on new line         } else { // No line _wrap, just keep incrementing X           lineWidth += _textsize * 6; // Includes interchar x gap         }       } // Carriage return = do nothing     } else { // Newline       x  = 0;            // Reset x to 0       y += _textsize * 8; // Advance y by 1 line       if(lineWidth > maxWidth) maxWidth = lineWidth; // Save widest line       lineWidth = 0;     // Reset lineWidth for new line     }   }   // End of string   if(lineWidth) y += _textsize * 8; // Add height of last (or only) line   *w = maxWidth - 1;               // Don't include last interchar x gap   *h = y - *y1; }  // Enable (or disable) Code Page 437-compatible charset. // There was an error in glcdfont.c for the longest time -- one character // (#176, the 'light shade' block) was missing -- this threw off the index // of every character that followed it.  But a TON of code has been written // with the erroneous character indices.  By default, the library uses the // original 'wrong' behavior and old sketches will still work.  Pass 'true' // to this function to use correct CP437 character values in your code. void ILI9341_cp437(bool x) {   _cp437 = x; }  uint16_t ILI9341_width(void) {   return _width; }  uint16_t ILI9341_height(void) {   return _height; }  void ILI9341_pushColor(uint16_t color) {   HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   spiWrite(color >> 8);   spiWrite(color);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  void ILI9341_drawFastVLine(int16_t x, int16_t y, int16_t h,  uint16_t color) {   // Rudimentary clipping   if((x >= _width) || (y >= _height)) return;    if((y+h-1) >= _height)     h = _height-y;    setAddrWindow(x, y, x, y+h-1);    uint8_t hi = color >> 8, lo = color;    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   while (h--) {     spiWrite(hi);     spiWrite(lo);   }   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  void ILI9341_drawFastHLine(int16_t x, int16_t y, int16_t w,   uint16_t color) {   // Rudimentary clipping   if((x >= _width) || (y >= _height)) return;   if((x+w-1) >= _width)  w = _width-x;   setAddrWindow(x, y, x+w-1, y);    uint8_t hi = color >> 8, lo = color;    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);   while (w--) {     spiWrite(hi);     spiWrite(lo);   }   HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); }  // Pass 8-bit (each) R,G,B, get back 16-bit packed color uint16_t ILI9341_color565(uint8_t r, uint8_t g, uint8_t b) {   return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); }  #define MADCTL_MY  0x80 #define MADCTL_MX  0x40 #define MADCTL_MV  0x20 #define MADCTL_ML  0x10 #define MADCTL_RGB 0x00 #define MADCTL_BGR 0x08 #define MADCTL_MH  0x04  void ILI9341_setRotation(uint8_t m) {   writeCommand(ILI9341_MADCTL);   _rotation = m % 4; // can't be higher than 3   switch (_rotation) {    case 0:      writeData(MADCTL_MX | MADCTL_BGR);      _width  = ILI9341_TFTWIDTH;      _height = ILI9341_TFTHEIGHT;      break;    case 1:      writeData(MADCTL_MV | MADCTL_BGR);      _width  = ILI9341_TFTHEIGHT;      _height = ILI9341_TFTWIDTH;      break;   case 2:     writeData(MADCTL_MY | MADCTL_BGR);      _width  = ILI9341_TFTWIDTH;      _height = ILI9341_TFTHEIGHT;     break;    case 3:      writeData(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);      _width  = ILI9341_TFTHEIGHT;      _height = ILI9341_TFTWIDTH;      break;   } }  uint16_t ILI9341_getRotation(void) {   return _rotation; } 

放到合适的位置并保存,添加包含头文件,.c文件到main文件同级文件下编译运行,在main函数初始化后添加

int main(void) {   /* USER CODE BEGIN 1 */    /* USER CODE END 1 */    /* MCU Configuration--------------------------------------------------------*/    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */   HAL_Init();    /* USER CODE BEGIN Init */    /* USER CODE END Init */    /* Configure the system clock */   SystemClock_Config();    /* USER CODE BEGIN SysInit */    /* USER CODE END SysInit */    /* Initialize all configured peripherals */   MX_GPIO_Init();   MX_CRC_Init();   MX_SPI1_Init();   /* USER CODE BEGIN 2 */ 	ILI9341_begin(&hspi1); 	ILI9341_fillScreen(ILI9341_BLACK); 	ILI9341_fillCircle(160,120,50,ILI9341_GREEN);   /* USER CODE END 2 */    /* Infinite loop */   /* USER CODE BEGIN WHILE */   while (1)   {     /* USER CODE END WHILE */      /* USER CODE BEGIN 3 */   }   /* USER CODE END 3 */ } 

运行proteus8,建立原理图,添加hex文件并点击运行,效果及原理图如下:

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!