找回密码
 立即注册

只需一步,快速开始

搜索

[复旦微FM33LG0系列开发板测评] 驱动SPI TFT显示

0
回复
1966
查看
[复制链接]

166

主题

343

帖子

3076

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3076
QQ
2022-1-5 16:24:21 显示全部楼层 |阅读模式
[复旦微FM33LG0系列开发板测评] 驱动SPI TFT显示

原帖地址:[复旦微FM33LG0系列开发板测评] 驱动SPI TFT显示 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

看到淘宝有个9.9元的LCD SPI屏,拍下。买来发现是ST7735芯片控制的,一般淘宝里卖的比较多的基本是12864或者是由ILI93XX驱动的,用ST7735的比较少,所以我想写一篇关于ST7735的博文。在驱动屏幕之前我们需要看看它的产品手册。st7735有两种驱动方式,其中一种SPI通讯,另外一个是总线驱动。由于我买的液晶屏是SPI通讯的,所以我只讨论spi驱动。手册上有两个SPI通讯的时序图,分别是SPI三线和SPI四线。其实本质都是一样,只是三线SPI比四线SPI少了一个数据命令切换的控制。




SPI7735SPI三线时序图

ST7735SPI四线时序图:



   做驱动程序。移植一下午。搞定。



驱动函数:


  1. #include "lcd_init.h"
  2. //#include "delay.h"

  3. void LCD_GPIO_Init(void)
  4. {
  5. //        GPIO_InitTypeDef  GPIO_InitStructure;
  6. //         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能A端口时钟
  7. //        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;         
  8. //         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  9. //        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  10. //         GPIO_Init(GPIOA, &GPIO_InitStructure);          //初始化GPIOA
  11. //         GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
  12.         
  13.         
  14.         FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  15.    
  16.     FL_GPIO_ResetOutputPin(GPIOA, FL_GPIO_PIN_0|FL_GPIO_PIN_1|FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_5);
  17.    
  18.     GPIO_InitStruct.pin = FL_GPIO_PIN_0|FL_GPIO_PIN_1|FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_5;
  19.     GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT;
  20.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  21.     GPIO_InitStruct.pull = FL_DISABLE;
  22.     FL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  23. }


  24. /******************************************************************************
  25.       函数说明:LCD串行数据写入函数
  26.       入口数据:dat  要写入的串行数据
  27.       返回值:  无
  28. ******************************************************************************/
  29. void LCD_Writ_Bus(unsigned char dat)
  30. {        
  31.         unsigned char i;
  32.         LCD_CS_Clr();
  33.         for(i=0;i<8;i++)
  34.         {                          
  35.                 LCD_SCLK_Clr();
  36.                 if(dat&0x80)
  37.                 {
  38.                    LCD_MOSI_Set();
  39.                 }
  40.                 else
  41.                 {
  42.                    LCD_MOSI_Clr();
  43.                 }
  44.                 LCD_SCLK_Set();
  45.                 dat<<=1;
  46.         }        
  47.   LCD_CS_Set();        
  48. }


  49. /******************************************************************************
  50.       函数说明:LCD写入数据
  51.       入口数据:dat 写入的数据
  52.       返回值:  无
  53. ******************************************************************************/
  54. void LCD_WR_DATA8(unsigned char dat)
  55. {
  56.         LCD_Writ_Bus(dat);
  57. }


  58. /******************************************************************************
  59.       函数说明:LCD写入数据
  60.       入口数据:dat 写入的数据
  61.       返回值:  无
  62. ******************************************************************************/
  63. void LCD_WR_DATA(unsigned short dat)
  64. {
  65.         LCD_Writ_Bus(dat>>8);
  66.         LCD_Writ_Bus(dat);
  67. }


  68. /******************************************************************************
  69.       函数说明:LCD写入命令
  70.       入口数据:dat 写入的命令
  71.       返回值:  无
  72. ******************************************************************************/
  73. void LCD_WR_REG(unsigned char dat)
  74. {
  75.         LCD_DC_Clr();//写命令
  76.         LCD_Writ_Bus(dat);
  77.         LCD_DC_Set();//写数据
  78. }


  79. /******************************************************************************
  80.       函数说明:设置起始和结束地址
  81.       入口数据:x1,x2 设置列的起始和结束地址
  82.                 y1,y2 设置行的起始和结束地址
  83.       返回值:  无
  84. ******************************************************************************/
  85. void LCD_Address_Set(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2)
  86. {
  87.         if(USE_HORIZONTAL==0)
  88.         {
  89.                 LCD_WR_REG(0x2a);//列地址设置
  90.                 LCD_WR_DATA(x1+2);
  91.                 LCD_WR_DATA(x2+2);
  92.                 LCD_WR_REG(0x2b);//行地址设置
  93.                 LCD_WR_DATA(y1+1);
  94.                 LCD_WR_DATA(y2+1);
  95.                 LCD_WR_REG(0x2c);//储存器写
  96.         }
  97.         else if(USE_HORIZONTAL==1)
  98.         {
  99.                 LCD_WR_REG(0x2a);//列地址设置
  100.                 LCD_WR_DATA(x1+2);
  101.                 LCD_WR_DATA(x2+2);
  102.                 LCD_WR_REG(0x2b);//行地址设置
  103.                 LCD_WR_DATA(y1+1);
  104.                 LCD_WR_DATA(y2+1);
  105.                 LCD_WR_REG(0x2c);//储存器写
  106.         }
  107.         else if(USE_HORIZONTAL==2)
  108.         {
  109.                 LCD_WR_REG(0x2a);//列地址设置
  110.                 LCD_WR_DATA(x1+1);
  111.                 LCD_WR_DATA(x2+1);
  112.                 LCD_WR_REG(0x2b);//行地址设置
  113.                 LCD_WR_DATA(y1+2);
  114.                 LCD_WR_DATA(y2+2);
  115.                 LCD_WR_REG(0x2c);//储存器写
  116.         }
  117.         else
  118.         {
  119.                 LCD_WR_REG(0x2a);//列地址设置
  120.                 LCD_WR_DATA(x1+1);
  121.                 LCD_WR_DATA(x2+1);
  122.                 LCD_WR_REG(0x2b);//行地址设置
  123.                 LCD_WR_DATA(y1+2);
  124.                 LCD_WR_DATA(y2+2);
  125.                 LCD_WR_REG(0x2c);//储存器写
  126.         }
  127. }

  128. void LCD_Init(void)
  129. {
  130.         LCD_GPIO_Init();//初始化GPIO
  131.         
  132.         LCD_RES_Clr();//复位
  133.         FL_DelayMs(100);
  134.         LCD_RES_Set();
  135.         FL_DelayMs(100);
  136.         
  137.         LCD_BLK_Set();//打开背光
  138.   FL_DelayMs(100);
  139.         
  140.         //************* Start Initial Sequence **********//
  141.         LCD_WR_REG(0x11); //Sleep out
  142.         FL_DelayMs(120);              //Delay 120ms
  143.         //------------------------------------ST7735S Frame Rate-----------------------------------------//
  144.         LCD_WR_REG(0xB1);
  145.         LCD_WR_DATA8(0x05);
  146.         LCD_WR_DATA8(0x3C);
  147.         LCD_WR_DATA8(0x3C);
  148.         LCD_WR_REG(0xB2);
  149.         LCD_WR_DATA8(0x05);
  150.         LCD_WR_DATA8(0x3C);
  151.         LCD_WR_DATA8(0x3C);
  152.         LCD_WR_REG(0xB3);
  153.         LCD_WR_DATA8(0x05);
  154.         LCD_WR_DATA8(0x3C);
  155.         LCD_WR_DATA8(0x3C);
  156.         LCD_WR_DATA8(0x05);
  157.         LCD_WR_DATA8(0x3C);
  158.         LCD_WR_DATA8(0x3C);
  159.         //------------------------------------End ST7735S Frame Rate---------------------------------//
  160.         LCD_WR_REG(0xB4); //Dot inversion
  161.         LCD_WR_DATA8(0x03);
  162.         //------------------------------------ST7735S Power Sequence---------------------------------//
  163.         LCD_WR_REG(0xC0);
  164.         LCD_WR_DATA8(0x28);
  165.         LCD_WR_DATA8(0x08);
  166.         LCD_WR_DATA8(0x04);
  167.         LCD_WR_REG(0xC1);
  168.         LCD_WR_DATA8(0XC0);
  169.         LCD_WR_REG(0xC2);
  170.         LCD_WR_DATA8(0x0D);
  171.         LCD_WR_DATA8(0x00);
  172.         LCD_WR_REG(0xC3);
  173.         LCD_WR_DATA8(0x8D);
  174.         LCD_WR_DATA8(0x2A);
  175.         LCD_WR_REG(0xC4);
  176.         LCD_WR_DATA8(0x8D);
  177.         LCD_WR_DATA8(0xEE);
  178.         //---------------------------------End ST7735S Power Sequence-------------------------------------//
  179.         LCD_WR_REG(0xC5); //VCOM
  180.         LCD_WR_DATA8(0x1A);
  181.         LCD_WR_REG(0x36); //MX, MY, RGB mode
  182.         if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
  183.         else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
  184.         else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
  185.         else LCD_WR_DATA8(0xA0);
  186.         //------------------------------------ST7735S Gamma Sequence---------------------------------//
  187.         LCD_WR_REG(0xE0);
  188.         LCD_WR_DATA8(0x04);
  189.         LCD_WR_DATA8(0x22);
  190.         LCD_WR_DATA8(0x07);
  191.         LCD_WR_DATA8(0x0A);
  192.         LCD_WR_DATA8(0x2E);
  193.         LCD_WR_DATA8(0x30);
  194.         LCD_WR_DATA8(0x25);
  195.         LCD_WR_DATA8(0x2A);
  196.         LCD_WR_DATA8(0x28);
  197.         LCD_WR_DATA8(0x26);
  198.         LCD_WR_DATA8(0x2E);
  199.         LCD_WR_DATA8(0x3A);
  200.         LCD_WR_DATA8(0x00);
  201.         LCD_WR_DATA8(0x01);
  202.         LCD_WR_DATA8(0x03);
  203.         LCD_WR_DATA8(0x13);
  204.         LCD_WR_REG(0xE1);
  205.         LCD_WR_DATA8(0x04);
  206.         LCD_WR_DATA8(0x16);
  207.         LCD_WR_DATA8(0x06);
  208.         LCD_WR_DATA8(0x0D);
  209.         LCD_WR_DATA8(0x2D);
  210.         LCD_WR_DATA8(0x26);
  211.         LCD_WR_DATA8(0x23);
  212.         LCD_WR_DATA8(0x27);
  213.         LCD_WR_DATA8(0x27);
  214.         LCD_WR_DATA8(0x25);
  215.         LCD_WR_DATA8(0x2D);
  216.         LCD_WR_DATA8(0x3B);
  217.         LCD_WR_DATA8(0x00);
  218.         LCD_WR_DATA8(0x01);
  219.         LCD_WR_DATA8(0x04);
  220.         LCD_WR_DATA8(0x13);
  221.         //------------------------------------End ST7735S Gamma Sequence-----------------------------//
  222.         LCD_WR_REG(0x3A); //65k mode
  223.         LCD_WR_DATA8(0x05);
  224.         LCD_WR_REG(0x29); //Display on
  225. }


复制代码

mian()://主函数

  1. #include "main.h"
  2. #include "user_init.h"
  3. #include "lcd_init.h"
  4. #include "lcd.h"


  5. int main(void)
  6. {
  7.     /* Reset of all peripherals, Initializes the Flash inte**ce and the Systick. */
  8.     /* SHOULD BE KEPT!!! */
  9.     MF_Clock_Init();

  10.     /* Configure the system clock */
  11.     /* SHOULD BE KEPT!!! */
  12.     MF_SystemClock_Config();

  13.     /* Initialize FL Driver Library */
  14.     /* SHOULD BE KEPT!!! */
  15.     FL_Init();

  16.     /* Initialize all configured peripherals */
  17.     /* SHOULD BE KEPT!!! */
  18.     MF_Config_Init();

  19.     UserInit();


  20.                 LCD_Init();//LCD初始化
  21.                 LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
  22.                 FL_DelayMs(100);
  23.                 LCD_ShowString(18,30,"Fudan",WHITE,BLUE,32,0);
  24.                 LCD_ShowString(5,90,"FM33LG0",WHITE,BLUE,32,0);
  25.                 FL_DelayMs(10);
  26.         while(1)
  27.     {
  28.         LED0_TOG();
  29. //                        printf("祝福复旦微电子越办越好!\r\n");
  30.         FL_DelayMs(1000);
  31.     }
  32. }
复制代码

1111111.jpg

22222222.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

返回顶部