[STM32F4] STM32F407VET6+ST7735TFT LCD彩屏驱动程序

[复制链接]
1278|19
 楼主| 逢dududu必shu 发表于 2022-5-29 11:44 | 显示全部楼层 |阅读模式
硬件准备 STM32F407VET6开发板一块
编译器使用的是STM32cubeide。
屏幕使用的是如图所示的屏幕,驱动芯片是st7735.
驱动协议采用的是spi通讯协议。
398226292ec10851bc.png

 楼主| 逢dududu必shu 发表于 2022-5-29 12:56 | 显示全部楼层
和stm32芯片的连接方式如下,使用的是spi2.
  1. CS片选脚  PA4
  2. A0脚(数据指令控制脚) PA5
  3. LED脚(背光脚)  PA3
  4. reset(屏幕复位脚) PA2
  5. sck(spi时钟脚) PB10
  6. SDA(SPIs数据脚) PC3
  7. vcc和gnd连接到5V电源上就可以了。

 楼主| 逢dududu必shu 发表于 2022-5-29 12:58 | 显示全部楼层
由于使用的是cubeide,代码都是直接生成的,在此就不提及cubeide该怎么生成工程了。我使用的是spi2,开启了dma传输功能。你们可以和我一样,也可以按照自己的需要自己修改。
 楼主| 逢dududu必shu 发表于 2022-5-29 12:59 | 显示全部楼层
根据手册写代码

网上也有许多关于st7735的代码,但都是只贴一下代码,关于原理部分提及较少,本着授人以鱼不如授人以渔的原则,我决定对照着数据手册教大家看懂每一行代码,让大家知其然知其所以然。
 楼主| 逢dududu必shu 发表于 2022-5-29 12:59 | 显示全部楼层
底层驱动

有屏幕使用经验的朋友都知道,操作屏幕分为写数据,写指令。因此对于ST7735来说,也是同样的原理。对于屏幕的一些的gpio操作,我把封装成了宏定义,所以先贴在前面。只需要注意前面的片选脚,数据命令选择脚就可以了。
 楼主| 逢dududu必shu 发表于 2022-5-29 13:00 | 显示全部楼层
  1. //LCD片选脚
  2. #define CS_HIGH   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)
  3. #define CS_LOW   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)

  4. //指令数据选择脚   对应屏幕上面的a0脚  输出低电平,代表命令,高电平,代表数据
  5. #define COMMAND  HAL_GPIO_WritePin(CMD_DATA_GPIO_Port, CMD_DATA_Pin, GPIO_PIN_RESET)
  6. #define DATA     HAL_GPIO_WritePin(CMD_DATA_GPIO_Port, CMD_DATA_Pin, GPIO_PIN_SET)

  7. //复位脚
  8. #define reset_high  HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET)
  9. #define reset_low  HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET)
  10. //背光脚
  11. #define  led_high HAL_GPIO_WritePin(BACK_LED_GPIO_Port,BACK_LED_Pin,GPIO_PIN_SET)
  12. #define  led_low HAL_GPIO_WritePin(BACK_LED_GPIO_Port,BACK_LED_Pin,GPIO_PIN_RESET)
  13. //lcd背光颜色
  14. #define RED    0xf800
  15. #define GREEN  0x07e0
  16. #define BLUE   0x001f
  17. #define YELLOW 0xffe0
  18. #define WHITE  0xffff
  19. #define BLACK  0x0000
  20. #define PURPLE 0xf81f
  21. #define MAGENTA   0xF81F        //  品红
 楼主| 逢dududu必shu 发表于 2022-5-29 13:00 | 显示全部楼层
 楼主| 逢dududu必shu 发表于 2022-5-29 13:02 | 显示全部楼层
通过数据手册我们可以看到,如果D/CX脚为低电平,就是写指令,为高电平就是写数据。D/CX就是实物图上的A0脚,也是上面宏定义中的COMMAND。因此就 可以来写我们的驱动程序了。数据已经贴在下面了,通过数据手册,现在是不是一目了然。
 楼主| 逢dududu必shu 发表于 2022-5-29 13:02 | 显示全部楼层
  1. //LCD屏幕写指令
  2. void TFT_WRITE_DATA(uint8_t data)
  3. {
  4.         CS_LOW;
  5.         DATA;
  6.         HAL_SPI_Transmit_DMA(&hspi2,&data,1);
  7.         CS_HIGH;

  8. }
  9. //  LCD屏幕写指令
  10. void TFT_WRITE_COMMAND(uint8_t command)
  11. {
  12.         CS_LOW;
  13.         COMMAND;
  14.         HAL_SPI_Transmit_DMA(&hspi2,&command,1);
  15.         CS_HIGH;
  16. }
 楼主| 逢dududu必shu 发表于 2022-5-29 13:03 | 显示全部楼层
有了这两个函数以后,就能进行屏幕的操作了,首先我们需要进行屏幕的初始化。
 楼主| 逢dududu必shu 发表于 2022-5-29 13:03 | 显示全部楼层
屏幕初始化
977706292fead0cddf.png
 楼主| 逢dududu必shu 发表于 2022-5-29 13:04 | 显示全部楼层
以B4H这个指令为例子,这是一个控制反显的指令,B4是指令的代码,参数控制如图所示。
**因此,如果需要控制一个具体的功能,需要先发送该指令码,在发送对应的数据。**以这个指令为例子。
 楼主| 逢dududu必shu 发表于 2022-5-29 13:05 | 显示全部楼层
TFT_WRITE_COMMAND(0xB4); //Column inversion
        TFT_WRITE_DATA(0x07);

 楼主| 逢dududu必shu 发表于 2022-5-29 13:06 | 显示全部楼层
因此在初始化的时候,只要按照这样的操作就可以了,初始化的代码贴在下面。
  1. void tft_init()
  2. {

  3.         reset_low;
  4.         HAL_Delay(100);
  5.         reset_high;
  6.         HAL_Delay(100);

  7.         //根据数据手册,对应的寄存器写入对应的值,所以在发送完指令之后,就要发送对应的数据
  8.         TFT_WRITE_COMMAND(0x11);//Sleep exit
  9.         HAL_Delay(120);
  10.                 //ST7735R Frame Rate
  11.         TFT_WRITE_COMMAND(0xB1);
  12.         TFT_WRITE_DATA(0x01);
  13.         TFT_WRITE_DATA(0x2C);
  14.         TFT_WRITE_DATA(0x2D);

  15.         TFT_WRITE_COMMAND(0xB2);
  16.         TFT_WRITE_DATA(0x01);
  17.         TFT_WRITE_DATA(0x2C);
  18.         TFT_WRITE_DATA(0x2D);


  19.         TFT_WRITE_COMMAND(0xB3);
  20.         TFT_WRITE_DATA(0x01);
  21.         TFT_WRITE_DATA(0x2C);
  22.         TFT_WRITE_DATA(0x2D);
  23.         TFT_WRITE_DATA(0x01);
  24.         TFT_WRITE_DATA(0x2C);
  25.         TFT_WRITE_DATA(0x2D);

  26.         TFT_WRITE_COMMAND(0xB4); //Column inversion
  27.         TFT_WRITE_DATA(0x07);


  28.         //ST7735R Power Sequence
  29.         TFT_WRITE_COMMAND(0xC0);
  30.         TFT_WRITE_DATA(0xA2);
  31.         TFT_WRITE_DATA(0x02);
  32.         TFT_WRITE_DATA(0x84);
  33.         TFT_WRITE_COMMAND(0xC1);
  34.         TFT_WRITE_DATA(0xC5);


  35.         TFT_WRITE_COMMAND(0xC2);
  36.         TFT_WRITE_DATA(0x0A);
  37.         TFT_WRITE_DATA(0x00);


  38.         TFT_WRITE_COMMAND(0xC3);
  39.         TFT_WRITE_DATA(0x8A);
  40.         TFT_WRITE_DATA(0x2A);
  41.         TFT_WRITE_COMMAND(0xC4);
  42.         TFT_WRITE_DATA(0x8A);
  43.         TFT_WRITE_DATA(0xEE);

  44.         TFT_WRITE_COMMAND(0xC5); //VCOM
  45.         TFT_WRITE_DATA(0x0E);


  46.         TFT_WRITE_COMMAND(0x36); //MX, MY, RGB mode
  47.         TFT_WRITE_DATA(0xC8);



  48.         //ST7735R Gamma Sequence
  49.         TFT_WRITE_COMMAND(0xe0);
  50.         TFT_WRITE_DATA(0x0F);
  51.         TFT_WRITE_DATA(0x1A);
  52.         TFT_WRITE_DATA(0x0F);
  53.         TFT_WRITE_DATA(0x18);
  54.         TFT_WRITE_DATA(0x2F);
  55.         TFT_WRITE_DATA(0x28);


  56.         TFT_WRITE_DATA(0x20);
  57.         TFT_WRITE_DATA(0x22);
  58.         TFT_WRITE_DATA(0x1F);

  59.         TFT_WRITE_DATA(0x1B);
  60.         TFT_WRITE_DATA(0x23);
  61.         TFT_WRITE_DATA(0x37);


  62.         TFT_WRITE_DATA(0x00);

  63.         TFT_WRITE_DATA(0x07);
  64.         TFT_WRITE_DATA(0x02);
  65.         TFT_WRITE_DATA(0x10);


  66.         TFT_WRITE_COMMAND(0xe1);
  67.         TFT_WRITE_DATA(0x0F);
  68.         TFT_WRITE_DATA(0x1B);
  69.         TFT_WRITE_DATA(0x0F);

  70.         TFT_WRITE_DATA(0x17);



  71.         TFT_WRITE_DATA(0x33);
  72.         TFT_WRITE_DATA(0x2C);

  73.         TFT_WRITE_DATA(0x29);

  74.         TFT_WRITE_DATA(0x2E);
  75.         TFT_WRITE_DATA(0x28);
  76.         TFT_WRITE_DATA(0x30);


  77.         TFT_WRITE_DATA(0x30);

  78.         TFT_WRITE_DATA(0x39);
  79.         TFT_WRITE_DATA(0x3F);

  80.         TFT_WRITE_DATA(0x00);
  81.         TFT_WRITE_DATA(0x07);
  82.         TFT_WRITE_DATA(0x03);
  83.         TFT_WRITE_DATA(0x10);

  84.         //设置为了 RGB 5-6-5  65k颜色mode
  85.         TFT_WRITE_COMMAND(0x2A); //65k mode
  86.         TFT_WRITE_DATA(0x00);
  87.         TFT_WRITE_DATA(0x00);
  88.         TFT_WRITE_DATA(0x00);
  89.         TFT_WRITE_DATA(0x7F);

  90.         TFT_WRITE_COMMAND(0x2B); //65k mode
  91.         TFT_WRITE_DATA(0x00);
  92.         TFT_WRITE_DATA(0x00);
  93.         TFT_WRITE_DATA(0x00);
  94.         TFT_WRITE_DATA(0x9F);

  95.         TFT_WRITE_COMMAND(0xF0); //65k mode
  96.         TFT_WRITE_DATA(0x01);
  97.         TFT_WRITE_COMMAND(0xF6); //65k mode
  98.         TFT_WRITE_DATA(0x00);


  99.         TFT_WRITE_COMMAND(0x3A); //这个指令将屏幕设置为了 65k颜色模式
  100.         TFT_WRITE_DATA(0x05);
  101.         TFT_WRITE_COMMAND(0x29);//Display on
  102.         lcd_set_direction();

  103.         TFT_WRITE_REG(0x36,(1<<3)|(1<<6)|(1<<7)); //这个指令很关键,控制了屏幕的显示方向等参数

  104.         TFT_WRITE_COMMAND(0xc0);//Display on  TFT_WRITE_COMMAND(0x36  );设置�?始坐�?
  105.         TFT_WRITE_DATA(0x0A);

  106.         lcd_clear(0xffe0);
  107.         led_high;
  108. }
 楼主| 逢dududu必shu 发表于 2022-5-29 13:07 | 显示全部楼层
显示数据
在初始化完成以后,就可以写数据了。
在写数据之前需要先设置显示的区域,然后在写入对应的数据。
与坐标设置相关的指令是2A,2B,2C。有了前面的教学,你应该可以看明白数据手册了,在此就不细说了。
程序源码在gitee源码
需要的点击下载就可以了。
Pulitzer 发表于 2022-10-5 08:29 | 显示全部楼层

代码量小的时候用来做条件判断
Uriah 发表于 2022-10-5 15:30 | 显示全部楼层

单片机一般都有内部程序区和数据区
Bblythe 发表于 2022-10-5 18:29 | 显示全部楼层

只要内存占用量不超过 256.0 就可以用 small 模式编译
周半梅 发表于 2023-4-1 07:26 | 显示全部楼层

格式化输出需要删除掉多余的空白行
Pulitzer 发表于 2023-4-1 08:29 | 显示全部楼层

I2C1工作时钟源选择;I2C1模块工作时钟的开启使能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

502

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部