Guest User

Untitled

a guest
Sep 24th, 2025
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.57 KB | Source Code | 0 0
  1. #include <stdio.h>
  2.  
  3. #define ST7789_CLK 21
  4. #define ST7789_DATA 22
  5. #define ST7789_RST 27  // active low
  6. #define ST7789_CS 26   // active low
  7. #define ST7789_DC 25   // 1=data, 0=cmd
  8.  
  9. #define DATA_MODE gpio_set_level(ST7789_DC, 1);
  10. #define CMD_MODE gpio_set_level(ST7789_DC, 0);
  11.  
  12. // TFT LCD 76x284
  13. // 4-wire SPI with DCX
  14.  
  15. #include <driver/gpio.h>
  16. #include <spi_bus.h>
  17.  
  18. inline void wait(const uint16_t ms) { vTaskDelay(pdMS_TO_TICKS(ms)); }
  19.  
  20. void st7789_init(spi_bus_device_handle_t dev);
  21. void st7789_setAddrWindow(spi_bus_device_handle_t dev, uint16_t x, uint16_t y,
  22.                           uint16_t w, uint16_t h);
  23.  
  24. void app_main(void) {
  25.   gpio_reset_pin(ST7789_DC);
  26.   gpio_reset_pin(ST7789_RST);
  27.  
  28.   gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT);
  29.   gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT);
  30.  
  31.   // hw reset
  32.   gpio_set_level(ST7789_RST, 1);
  33.   wait(1);
  34.   gpio_set_level(ST7789_RST, 0);
  35.   wait(1);
  36.   gpio_set_level(ST7789_RST, 1);
  37.  
  38.   spi_bus_handle_t bus_hdl = {0};
  39.   spi_bus_device_handle_t dev = {0};
  40.  
  41.   spi_config_t bus_cfg = {.mosi_io_num = ST7789_DATA,
  42.                           .miso_io_num = -1,
  43.                           .sclk_io_num = ST7789_CLK,
  44.                           .max_transfer_sz = 1};
  45.  
  46.   spi_device_config_t st7789_cfg = {
  47.       .cs_io_num = ST7789_CS, .mode = 0, .clock_speed_hz = SPI_MASTER_FREQ_10M};
  48.  
  49.   bus_hdl = spi_bus_create(SPI3_HOST, &bus_cfg);
  50.   if (!bus_hdl) {
  51.     printf("SPI bus error: Cannot create SPI bus\n");
  52.     exit(-1);
  53.   }
  54.   dev = spi_bus_device_create(bus_hdl, &st7789_cfg);
  55.   if (!dev) {
  56.     printf("SPI bus error: Cannot create SPI device\n");
  57.     exit(-1);
  58.   }
  59.  
  60.   // <---perform SPI here--->
  61.   st7789_init(dev);
  62.  
  63.   CMD_MODE
  64.   spi_bus_transfer_byte(dev, 0x2C, NULL);  // memory write
  65.   DATA_MODE
  66.   for (uint8_t i = 0; i < 25; i++) {
  67.     for (uint8_t j = 0; j < 25; j++) {
  68.       // fill 25x25 area with 0xAAAA
  69.       spi_bus_transfer_byte(dev, 0xAA, NULL);
  70.       spi_bus_transfer_byte(dev, 0xAA, NULL);
  71.     }
  72.   }
  73.   CMD_MODE
  74.   // <---endregion--->
  75.  
  76.   spi_bus_device_delete(&dev);
  77.   spi_bus_delete(&bus_hdl);
  78. }
  79.  
  80. void st7789_init(spi_bus_device_handle_t dev) {
  81.   spi_bus_transfer_byte(dev, 0x01, NULL);  // sw reset
  82.   wait(10);
  83.  
  84.   spi_bus_transfer_byte(dev, 0x26, NULL);  // set gamma
  85.   DATA_MODE
  86.   spi_bus_transfer_byte(dev, 0x01, NULL);  // gamma 2.2
  87.   CMD_MODE
  88.  
  89.   spi_bus_transfer_byte(dev, 0x36, NULL);  // memory data access control
  90.   DATA_MODE
  91.   spi_bus_transfer_byte(dev, 0x00, NULL);  // 000000_xxb - normal mode
  92.   CMD_MODE
  93.  
  94.   spi_bus_transfer_byte(dev, 0x3A, NULL);  // pixel format
  95.   DATA_MODE
  96.   spi_bus_transfer_byte(dev, 0x26, NULL);  // 0_101_0_101 - 65K@16bit
  97.   CMD_MODE
  98.  
  99.   spi_bus_transfer_byte(dev, 0xB0, NULL);  // RAM control
  100.   DATA_MODE
  101.   spi_bus_transfer_byte(dev, 0x00, NULL);  // RAM access from MCU
  102.   spi_bus_transfer_byte(dev, 0xCA, NULL);  // RAM LE+MSB
  103.   CMD_MODE
  104.  
  105.   spi_bus_transfer_byte(dev, 0xB2, NULL);  // porch settings
  106.   DATA_MODE
  107.   spi_bus_transfer_byte(dev, 0x0C, NULL);
  108.   spi_bus_transfer_byte(dev, 0x0C, NULL);
  109.   spi_bus_transfer_byte(dev, 0x00, NULL);
  110.   spi_bus_transfer_byte(dev, 0x33, NULL);
  111.   spi_bus_transfer_byte(dev, 0x33, NULL);
  112.   CMD_MODE
  113.  
  114.   spi_bus_transfer_byte(dev, 0xB7, NULL);  // gate control
  115.   DATA_MODE
  116.   spi_bus_transfer_byte(dev, 0x45, NULL);  // 13.65-10.43V
  117.   CMD_MODE
  118.  
  119.   spi_bus_transfer_byte(dev, 0x2B, NULL);  // VCOM
  120.   DATA_MODE
  121.   spi_bus_transfer_byte(dev, 0x2B, NULL);  // 1.175V
  122.   CMD_MODE
  123.  
  124.   spi_bus_transfer_byte(dev, 0xC0, NULL);  // LCM
  125.   DATA_MODE
  126.   spi_bus_transfer_byte(dev, 0x2C, NULL);  // XBGR, XMX, XMH
  127.   CMD_MODE
  128.  
  129.   spi_bus_transfer_byte(dev, 0xC2, NULL);  // VDV and VRH
  130.   DATA_MODE
  131.   spi_bus_transfer_byte(dev, 0x01, NULL);  // VDV and VRH from CMD wire
  132.   spi_bus_transfer_byte(dev, 0xFF, NULL);  // always FFh
  133.   CMD_MODE
  134.  
  135.   spi_bus_transfer_byte(dev, 0xC3, NULL);  // VRH
  136.   DATA_MODE
  137.   spi_bus_transfer_byte(dev, 0x11, NULL);  // 4.4+V
  138.   CMD_MODE
  139.  
  140.   spi_bus_transfer_byte(dev, 0xC4, NULL);  // VDV
  141.   DATA_MODE
  142.   spi_bus_transfer_byte(dev, 0x20, NULL);  // 0V
  143.   CMD_MODE
  144.  
  145.   spi_bus_transfer_byte(dev, 0xC6, NULL);  // framerate control
  146.   DATA_MODE
  147.   spi_bus_transfer_byte(dev, 0x0F, NULL);  // 60Hz
  148.   CMD_MODE
  149.  
  150.   spi_bus_transfer_byte(dev, 0xD0, NULL);  // power control
  151.   DATA_MODE
  152.   spi_bus_transfer_byte(dev, 0xA4, NULL);  // always A4h
  153.   spi_bus_transfer_byte(dev, 0xA1, NULL);  // 6.8V, -4.8V, 2.3V
  154.   CMD_MODE
  155.  
  156.   spi_bus_transfer_byte(dev, 0xE0, NULL);  // positive voltage gamma control
  157.   DATA_MODE
  158.   spi_bus_transfer_byte(dev, 0xD0, NULL);
  159.   spi_bus_transfer_byte(dev, 0x00, NULL);
  160.   spi_bus_transfer_byte(dev, 0x05, NULL);
  161.   spi_bus_transfer_byte(dev, 0x0E, NULL);
  162.   spi_bus_transfer_byte(dev, 0x15, NULL);
  163.   spi_bus_transfer_byte(dev, 0x0D, NULL);
  164.   spi_bus_transfer_byte(dev, 0x37, NULL);
  165.   spi_bus_transfer_byte(dev, 0x43, NULL);
  166.   spi_bus_transfer_byte(dev, 0x47, NULL);
  167.   spi_bus_transfer_byte(dev, 0x09, NULL);
  168.   spi_bus_transfer_byte(dev, 0x15, NULL);
  169.   spi_bus_transfer_byte(dev, 0x12, NULL);
  170.   spi_bus_transfer_byte(dev, 0x16, NULL);
  171.   spi_bus_transfer_byte(dev, 0x19, NULL);
  172.   CMD_MODE
  173.  
  174.   spi_bus_transfer_byte(dev, 0xE0, NULL);  // negative voltage gamma control
  175.   DATA_MODE
  176.   spi_bus_transfer_byte(dev, 0xD0, NULL);
  177.   spi_bus_transfer_byte(dev, 0x00, NULL);
  178.   spi_bus_transfer_byte(dev, 0x05, NULL);
  179.   spi_bus_transfer_byte(dev, 0x0D, NULL);
  180.   spi_bus_transfer_byte(dev, 0x0C, NULL);
  181.   spi_bus_transfer_byte(dev, 0x06, NULL);
  182.   spi_bus_transfer_byte(dev, 0x2D, NULL);
  183.   spi_bus_transfer_byte(dev, 0x44, NULL);
  184.   spi_bus_transfer_byte(dev, 0x40, NULL);
  185.   spi_bus_transfer_byte(dev, 0x0E, NULL);
  186.   spi_bus_transfer_byte(dev, 0x1C, NULL);
  187.   spi_bus_transfer_byte(dev, 0x18, NULL);
  188.   spi_bus_transfer_byte(dev, 0x16, NULL);
  189.   spi_bus_transfer_byte(dev, 0x19, NULL);
  190.   CMD_MODE
  191.  
  192.   spi_bus_transfer_byte(dev, 0x11, NULL);  // sleep out
  193.   wait(5);
  194.   spi_bus_transfer_byte(dev, 0x29, NULL);  // display on
  195.   spi_bus_transfer_byte(dev, 0x13, NULL);  // normal display on
  196.   spi_bus_transfer_byte(dev, 0x21, NULL);  // inv on
  197.  
  198.   /*spi_bus_transfer_byte(dev, 0x2A, NULL);  // column addr set
  199.   DATA_MODE
  200.   spi_bus_transfer_byte(dev, 0x00, NULL);  // XS[15:8]
  201.   spi_bus_transfer_byte(dev, 0x00, NULL);  // XS[7:0]
  202.   spi_bus_transfer_byte(dev, 0x00, NULL);  // XE[15:8]
  203.   spi_bus_transfer_byte(dev, 0x00, NULL);  // XE[7:0]
  204.   CMD_MODE
  205.  
  206.   spi_bus_transfer_byte(dev, 0x2B, NULL);  // row addr set
  207.   DATA_MODE
  208.   spi_bus_transfer_byte(dev, 0x00, NULL);  // YS[15:8]
  209.   spi_bus_transfer_byte(dev, 0x00, NULL);  // YS[7:0]
  210.   spi_bus_transfer_byte(dev, 0x00, NULL);  // YE[15:8]
  211.   spi_bus_transfer_byte(dev, 0x00, NULL);  // YE[7:0]
  212.   CMD_MODE*/
  213.   st7789_setAddrWindow(dev, 0, 0, 76, 284);
  214. }
  215.  
  216. void st7789_setAddrWindow(spi_bus_device_handle_t dev, uint16_t x, uint16_t y,
  217.                           uint16_t w, uint16_t h) {
  218.   const uint16_t xs = x;
  219.   const uint16_t xe = x + w;
  220.   const uint16_t ys = y;
  221.   const uint16_t ye = y + h;
  222.  
  223.   CMD_MODE
  224.   spi_bus_transfer_byte(dev, 0x2A, NULL);  // column addr set
  225.   DATA_MODE
  226.   spi_bus_transfer_byte(dev, xs >> 8, NULL);    // XS[15:8]
  227.   spi_bus_transfer_byte(dev, xs & 0xff, NULL);  // XS[7:0]
  228.   spi_bus_transfer_byte(dev, xe >> 8, NULL);    // XE[15:8]
  229.   spi_bus_transfer_byte(dev, xe & 0xff, NULL);  // XE[7:0]
  230.   CMD_MODE
  231.  
  232.   spi_bus_transfer_byte(dev, 0x2B, NULL);  // row addr set
  233.   DATA_MODE
  234.   spi_bus_transfer_byte(dev, ys >> 8, NULL);    // YS[15:8]
  235.   spi_bus_transfer_byte(dev, ys & 0xff, NULL);  // YS[7:0]
  236.   spi_bus_transfer_byte(dev, ye >> 8, NULL);    // Ye[15:8]
  237.   spi_bus_transfer_byte(dev, ye & 0xff, NULL);  // Ye[7:0]
  238.   CMD_MODE
  239. }
Advertisement
Add Comment
Please, Sign In to add comment