STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植

1.  实验任务:

        本实验使用 STM32F103R6 芯片,通过软件SPI的方式,控制128*128分辨率的LCD,实现在液晶屏上显示汉字,英文,数字,图片等内容。

2. 实验效果展示:

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第1张图片   

 3.  硬件设计

STM32F103 MCU

ST7735 显示屏

PA6

背光控制

PB13

SCK

PB15

MOSI

PB14

数据/命令 切换

PC9

显示屏复位控制

PB12

从机选择

 STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第2张图片

 4. 新建工程

        选择左侧GPIO,参考硬件设计里面的引脚,将控制液晶屏的6个引脚全部设置为推挽输出低电平,不上拉不下拉,IO口的速度选择高速。如果需要串口调试的话,需要把串口也打开。 STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第3张图片

 5. 文字取模

        想在液晶屏上显示任意的文字,需要将文字在128*128的像素上描点,1表示该像素点是点亮的,0表示该像素点不亮。这样多个像素组合在一起,就显示出了一个文字。我们需要做的就是在软件里面输入文字,然后生成16进制的数组,在液晶屏上进行描点,将1的地方点亮,0的地方不点亮,将数组里面的内容全部描点后就变成了一个文字。

       我们打开软件:PCtoLCD2002.exe,字模选项设置如下,然后输入文字,生成字模数组,将数组复制到程序里面。

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第4张图片

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第5张图片

 6. 图片取模

        如果我们想在液晶屏里面显示图片,需要先将图片用PS或者画图软件,转换成128*128的像素大小,因为我们液晶屏的像素就是128*128。下面以画图软件举例,将设置好的图片进行保存。STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第6张图片

         打开图片转换软件:Img2Lcd.exe,导入刚才设置好的图片,选择16位真彩色,然后点击保存,把图片生成的数组复制到程序里面。

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第7张图片

 7. 驱动芯片ST7735S的认知

        我们知道在自然界中,红、绿、蓝是光学三原色(RGB),自然界中的任何颜色都可以由红、绿、蓝三原色来叠加组成。 

        举例:红色与绿色1:1叠加就组成了黄色,红色与绿色与蓝色1:1:1叠加就组成了白色。

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第8张图片 

        红色是(R:255,G:0,B:0),也就是0xFF0000。绿色(R:0,G:255,B:0),也就是0x00FF00。蓝色就是(R:0,G:0,B:255),也就是0x0000FF。不同颜色的RGB值见下表:STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第9张图片

        虽然采用三个字节来表示RGB的颜色,能表示的颜色非常丰富,数据也非常的整齐 。但是嵌入式系统常常资源有限,使用三个字节表示一个像素过于消耗内存,所以在小型嵌入式系统中,常常使用两个字节(16Bit)来表示一个像素的颜色。

        我们的液晶屏用的驱动芯片是ST7735S,它也是用两个字节(16Bit)来表示一个像素的颜色。在(16Bit)的颜色系统中,常用的是5-6-5的组合形式,即红色占用5Bit,绿色占用6Bit,蓝色占用5Bit。如下图所示:

        用两个字节表示红色为(R:32,G:0,B:0),也就是0xF800,二进制为11111000 00000000.

        上面的图片转换软件,输出的时候选择16位真彩色也是这个原因。但是输出的数组,每一个是8位,而每个像素点需要16位的RGB值表示颜色。所以我们在程序里面,针对每个像素点,需要写入两次,每个数据8位,从而组成16位的RGB值。

        液晶屏有128*128个像素点,每个像素点需要写入两次,一共需要128*128*2个数据,也就是32768个数据。这也是为什么输出的图片数组有32768个的原因。

        驱动芯片将某种颜色,以16进制的方式,写入到液晶屏的每一个像素点,然后所有128*128个像素点就组成了完整的图像。STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第10张图片

8. 程序编写

        以下程序是用HAL库编写,首先是对液晶屏进行初始化,打开背光灯。然后全屏显示红色、绿色、蓝色、黑色、白色。

       再从左上角的第一个像素点X:Y(0:0)开始,垂直向下点亮8个像素点,这8个点就组成了一条直线。

       再从坐标轴X:Y(0:0)开始,调用文字的数组,打印出8个汉字,“重庆工程,文字测试”。

       再从坐标轴X:Y(10:80)开始,调用准备好的英文字体库,打印一串英文和数字。

       最后再调用图片的数组,打印出一张图片。在while (1)里面不做任何操作。

        驱动程序因为代码行太长了,这里不贴出。

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_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

    unsigned char i=0;
    LCD_Init();  //液晶屏初始化
    LCD_BL_ON; //打开LCD显示屏的背光

    printf("LCD测试实验\n\r");    
    Full_Display_Color(RED);//全屏显示红色
    HAL_Delay(500);
    Full_Display_Color(GREEN);//全屏显示绿色
    HAL_Delay(500);
    Full_Display_Color(BLUE);//全屏显示蓝色
    HAL_Delay(500);
    Full_Display_Color(BLACK);//全屏显示黑色
    HAL_Delay(500);
    Full_Display_Color(WHITE);//全屏显示白色
    HAL_Delay(500);

//    从X和Y的坐标轴(0,0)开始,向下画一条直线 
    for(i=0; i<8; i++ )    Draw_Point(0, i, RED);
    HAL_Delay(1000);

//    在坐标X和Y,以字体为红色,背景为灰色,将数组Font_Image_test里面的第i个汉字打印出来
    for(i=0; i<4; i++ ) Display_Font(32*i,0,RED,GRAY0,Font_Image_test,i);
    for(i=0; i<4; i++ ) Display_Font(32*i,32,BLUE,GRAY0,Font_Image_test,4+i);

//    在坐标X和Y,以字体为红色,背景为灰色,显示英文字体
    Display_String(10,80,BLACK,RED,"STM32F103R6HAL");
    Display_String(10,100,BLACK,RED,"demo test!");
    HAL_Delay(1000);

    Display_Picture(Image_test);//全屏显示图片
    HAL_Delay(500);

  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

         以下程序是用标准库编写,液晶屏显示内容和HAL库编写的一样。驱动程序因为代码行太长了,这里不贴出。

int main(void)
{    
    unsigned char i=0;
    delay_init(72);    
    delay_ms(200);
    LCD_Init();  //显示屏初始化
    GPIO_SetBits(GPIOA,GPIO_Pin_6); //打开LCD显示屏的背光

    DispColor(BLACK);//全屏显示黑色
    delay_ms(1000);
    DispColor(RED);//全屏显示红色
    delay_ms(1000);
    DispColor(GREEN);//全屏显示绿色
    delay_ms(1000);
    DispColor(BLUE);//全屏显示蓝色
    delay_ms(1000);
    DispColor(WHITE);//全屏显示白色
    delay_ms(1000);

    DrawPoint(0, 0, BLACK);//从X和Y的坐标轴(0,0)开始,向下画一条直线。
    DrawPoint(0, 1, BLACK);
    DrawPoint(0, 2, BLACK);
    DrawPoint(0, 3, BLACK);
    DrawPoint(0, 4, BLACK);
    DrawPoint(0, 5, BLACK);
    delay_ms(2000);


    for(i=0; i<4; i++ ) Gui_DrawFont_Num32(32*i,0,RED,GRAY0,Num[i]); //打印出汉字:重庆工程,文字测试  
    for(i=0; i<4; i++ ) Gui_DrawFont_Num32(32*i,32,RED,GREEN,Num[4+i]);


    Gui_DrawFont_GBK16(10,64,BLACK,GRAY0,"STM32F103_HAL");//打印出英文
    Gui_DrawFont_GBK16(10,80,RED,GRAY2,"demo test!");


//    Gui_DrawFont_Num32_123(95,95,RED,GRAY0,Num[5]);//打印出5,4,3,2,1,0的倒计时
//    delay_ms(5000);
//    Gui_DrawFont_Num32_123(95,95,RED,GRAY0,Num[4]);
//    delay_ms(5000);
    Gui_DrawFont_Num32_123(95,95,RED,GRAY0,Num[3]);
    delay_ms(5000);
    Gui_DrawFont_Num32_123(95,95,RED,GRAY0,Num[2]);
    delay_ms(5000);
    Gui_DrawFont_Num32_123(95,95,RED,GRAY0,Num[1]);
    delay_ms(5000);
    Gui_DrawFont_Num32_123(95,95,RED,GRAY0,Num[0]);    
    delay_ms(9000);


    DispPic(gImage_zhang123);//DispPic(gImage_zhang); 全屏显示一张图片
    delay_ms(5000);
    while(1) 
    {     }      
 }

 9.运行效果

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植_第11张图片

 10. 完整代码下载

        HAL库程序代码,含文字和图片取模软件:

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用了CubeMX的HAL库开发方式-C/C++文档类资源-CSDN文库

        标准库程序代码,含文字和图片取模软件:

STM32F103驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用标准库开发。含文字和图片取模软件-C/C++文档类资源-CSDN文库

 

你可能感兴趣的:(STM32,stm32,单片机,arm)