Stm32 控制1.44寸液晶显示图片 基于stm32f051k8u6

  在线图片转BMP格式:https://app.xunjiepdf.com/img2bmp

一。使用工具对图片生成字符数组

1. 使用1.44寸的液晶其像素是128*128的16位真彩,则需要把图片调整为128*128的像素

2. 使用工具  ”  “  把图片生成一些对应的数据到 .c文件中,其实就是一个数组

    

生成的文件较大。

二 。 液晶与STM32的硬件连接原理图

 

分析原理图知道:液晶通过SPI总线与STM32通信的,这里我们让 LCD 当作从机只接受数据,所以可以把 MISO 改为片选功能引脚,在通过 Stm32CubeMX5 配置完SPI 后,我们自己使用代码把 MISO 配置为片选功能选择引脚

LCD背光 --------------- STM32的PB6

LCD的MOSI ---------  STM32的PB5

LCD的MISO --------   STM32的PB4

LCD的CLK -----------  STM32的PB3

LCD的SS  ------------- STM32的PA15

 三 。 LCD 的分析

1. 驱动芯片 ST3375S  SPI通信总线  SPI 操作时序图

2. 控制命令 0x2a , 0x2b , 0x2c 的描述,清屏中的描述,其他的命令详细看手册

四。 配置 stm32 外设使用 Stm32CubeMX5创建一个工程

1. 创建一个工程,选择keil编译工具,为每个外设生成对应的.c和.h文件

2. 配置时钟为最高48Mhz

3. 使用 st-link下载程序配置相应的引脚

4. 配置SPI 模式

5. 配置好外设 导出代码,然后打开工程

五。 移植LCD的驱动程序

1. 移植demo文件 ,把 LCD 的.c 和 .h文件分别放在 工程目录下的Inc和Src目录下,主要是方便工程管理,然后把lcd.c文件添加到keil工程中。

           

2. lcd.c文件源码如下:

#include "gpio.h"
#include "stdint.h"
#include "lcd.h"
#include "font_lcd.h"
#include "string.h"
#include "spi.h"

void Delay_ms(int time)
{
    int i,j;
    for(i=0;i<time*10;i++)
    {
        for(j=0;j<100;j++)
        {
        }
    }
}

void LCD_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
//  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);

  /*Configure GPIO pins : PB4 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

//向液晶屏写一个8位指令
void Lcd_WriteIndex(uint8_t Index)
{
   //SPI 写命令时序开始
    //NSS = 0;
    LCD_CS_CLR;
    LCD_RS_CLR;           //LCD_RS_CLR
    HAL_SPI_Transmit(&hspi1,&Index,1,0xfff);
    //NSS = 1;
    LCD_CS_SET;
}
//向液晶屏写一个8位数据
void Lcd_WriteData(uint8_t Data)
{
    LCD_CS_CLR;
    LCD_RS_SET;
    HAL_SPI_Transmit(&hspi1,&Data,1,0xfff);
    LCD_CS_SET;
}

void LCD_WriteData_16Bit(uint16_t Data)
{
  uint8_t Data_H = Data>>8;
  uint8_t Data_L = Data&0xFF;
  LCD_CS_CLR;
  LCD_RS_SET;
  HAL_SPI_Transmit(&hspi1,&Data_H,1,0xfff);     //写入高8位数据
  HAL_SPI_Transmit(&hspi1,&Data_L,1,0xfff);     //写入低8位数据
  LCD_CS_SET;
}

 //LCD Init For 1.44Inch LCD Panel with ST7735R.
void Lcd_Init(void)
{    

    LCD_GPIO_Init();
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    Lcd_WriteIndex(0x01);//Sleep exit
    HAL_Delay(120);
    Lcd_WriteIndex(0x11);//Sleep exit
    HAL_Delay(120);
    Lcd_WriteIndex(0x36); //MX, MY, RGB mode
    Lcd_WriteData(0xC8); 

    Lcd_WriteIndex(0x3A); //65k mode
    Lcd_WriteData(0x05); 

    Lcd_WriteIndex(0x29);//Display on
}

/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
void Lcd_SetRegion(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end)
{
    Lcd_WriteIndex(0x2a);
    Lcd_WriteData(0x00);
    Lcd_WriteData(x_start+2);
    Lcd_WriteData(0x00);
    Lcd_WriteData(x_end+2);

    Lcd_WriteIndex(0x2b);
    Lcd_WriteData(0x00);
    Lcd_WriteData(y_start+3);
    Lcd_WriteData(0x00);
    Lcd_WriteData(y_end+3);

    Lcd_WriteIndex(0x2c);
}
/*************************************************
函数名:Lcd_Clear
功能:全屏清屏函数
入口参数:填充颜色COLOR
返回值:无
*************************************************/
void Lcd_Clear(uint16_t Color)
{
   unsigned int i,m;
   Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
   Lcd_WriteIndex(0x2C);
   for(i=0;i<X_MAX_PIXEL;i++)
    for(m=0;m<Y_MAX_PIXEL;m++)
    {
     LCD_WriteData_16Bit(Color);
    }
}

/*************************************************
函数名:LCD_DrawPoint
功能:画一个点
入口参数:无
返回值:无
*************************************************/
void Gui_DrawPoint(uint16_t x,uint16_t y,uint16_t Data)
{
    Lcd_SetRegion(x,y,x+1,y+1);
    LCD_WriteData_16Bit(Data);
}    

void Gui_DrawFont_GBK16(uint16_t x0, uint16_t y0, uint16_t fc, uint16_t bc, uint8_t *s)
{
  int i,j,k,x,y,xx;
  unsigned char qm;
  long int ulOffset;
  char  ywbuf[32];
 // char   temp[2];

  for(i = 0; i<strlen((char*)s);i++)
  {
    if(((unsigned char)(*(s+i))) >= 161)
    {
//      temp[0] = *(s+i);
//      temp[1] = ‘\0‘;
      return;
    }

    else
    {
      qm = *(s+i);

      ulOffset = (long int)(qm) * 16;

      for (j = 0; j < 16; j ++)
      {
        ywbuf[j]=Zk_ASCII8X16[ulOffset+j];
      }

      for(y = 0;y < 16;y++)
      {
        for(x=0;x<8;x++)
        {
          k=x % 8;

          if(ywbuf[y]&(0x80 >> k))
          {
            xx=x0+x+i*8;
            Gui_DrawPoint(xx,y+y0,fc);
          }
          else
          {

            xx=x0+x+i*8;
            Gui_DrawPoint(xx,y+y0,bc);
          }
        }
      }

    }
  }
}
/*************************************************
函数名:showimage
功能:显示一副图片
入口参数:图片缓存
返回值:无
*************************************************/
void showimage(const unsigned char *p)
{
   unsigned int i;
   uint16_t HData,LData;
   Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
   Lcd_WriteIndex(0x2C);
   for(i = 0;i < 128*128;i++)
   {
     LData = *(p+i*2);
     HData = *(p+i*2+1);
     LCD_WriteData_16Bit(HData<<8|LData);

   }
}

3.  lcd.h文件

#ifndef __LCD_H
#define __LCD_H
#include "stdint.h"
#include "stm32f0xx.h"

#define RED      0xf800
#define GREEN    0x07e0
#define BLUE     0x001f
#define WHITE    0xffff
#define BLACK    0x0000
#define YELLOW  0xFFE0

#define CYAN    0x07ff
#define BRIGHT_RED 0xf810   

#define GRAY0   0xEF7D       //灰色0 3165 00110 001011 00101
#define GRAY1   0x8410          //灰色1      00000 000000 00000
#define GRAY2   0x4208          //灰色2  1111111111011111

#define X_MAX_PIXEL            128
#define Y_MAX_PIXEL            128

//LCD的SPI引脚的定义
#define LCD_CTRL_PORT           GPIOB        //定义TFT数据端口
#define LCD_LED                  GPIO_PIN_6  //MCU_PB6 LCD背光--->>TFT --BL
#define LCD_RST                 RCC_FLAG_PINRST    //PB10--->>TFT --RST
#define LCD_RS                   GPIO_PIN_4    //PB4 MISO--->>TFT --RS/DC
#define LCD_SDA                  GPIO_PIN_5    //PB15 MOSI--->>TFT --SDA/DIN
#define LCD_SCL                  GPIO_PIN_3    //PB13 SCK--->>TFT --SCL/SCK

#define LCD_CS_PORT     GPIOA
#define LCD_CS            GPIO_PIN_15  //MCU_PA15--->>TFT --CS/CE

//液晶控制口置1操作语句宏定义
#define    LCD_CS_SET      HAL_GPIO_WritePin(LCD_CS_PORT, LCD_CS,GPIO_PIN_SET);
#define    LCD_RS_SET      HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS,GPIO_PIN_SET);
#define    LCD_SDA_SET      LCD_CTRL_PORT->BSRR=LCD_SDA
#define    LCD_SCL_SET      LCD_CTRL_PORT->BSRR=LCD_SCL
#define    LCD_RST_SET      LCD_CTRL_PORT->BSRR=LCD_RST
#define    LCD_LED_SET      LCD_CTRL_PORT->BSRR=LCD_LED 

//液晶控制口置0操作语句宏定义
#define    LCD_CS_CLR      HAL_GPIO_WritePin(LCD_CS_PORT, LCD_CS,GPIO_PIN_RESET);
#define    LCD_RS_CLR      HAL_GPIO_WritePin(LCD_CTRL_PORT, LCD_RS,GPIO_PIN_RESET);
#define    LCD_SDA_CLR      LCD_CTRL_PORT->BRR=LCD_SDA
#define    LCD_SCL_CLR      LCD_CTRL_PORT->BRR=LCD_SCL
#define    LCD_RST_CLR      LCD_CTRL_PORT->BRR=LCD_RST
#define    LCD_LED_CLR      LCD_CTRL_PORT->BRR=LCD_LED 

void LCD_GPIO_Init(void);
void Lcd_WriteIndex(uint8_t Index);
void Lcd_WriteData(uint8_t Data);
void Lcd_WriteReg(uint8_t Index,uint8_t Data);
uint16_t Lcd_ReadReg(uint8_t LCD_Reg);
void Lcd_Reset(void);
void Lcd_Init(void);
void Lcd_Clear(uint16_t Color);
void Lcd_SetXY(uint16_t x,uint16_t y);
void Gui_DrawPoint(uint16_t x,uint16_t y,uint16_t Data);
unsigned int Lcd_ReadPoint(uint16_t x,uint16_t y);
void Lcd_SetRegion(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end);
void LCD_WriteData_16Bit(uint16_t Data);
void showimage(const unsigned char *p);
void Lcd_ReadID(void);
void showimage_farsight(const unsigned char *p);
void Gui_DrawFont_GBK16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s);
void showimage(const unsigned char *p);
#endif

4. 对于font_lcd.c文件也是一些和图片的文件一样,这是字库如下所示:

5. 把图片生成的.c文件也添加到工程中

6.  main.c中代码

原文地址:https://www.cnblogs.com/electronic/p/11104366.html

时间: 2024-10-08 08:26:06

Stm32 控制1.44寸液晶显示图片 基于stm32f051k8u6的相关文章

如何用12864液晶显示图片和绘制任意函数图象(打点)

一. 显示图片 显示图片的要点在于:1.取模 2.利用扩展指令设置液晶3.清楚液晶地址的概念 1.1取模 取模软件用的是"字模221"下图是他的参数设置 这里对参数设置先解释一下,所谓横向取模就是,一张图片从图片最左上角的8位开始取模,从左向右,每次取8位二进制数据转化为16进制保存,第一排取完之后,接着到第二排最左边8位开始取模,以此类推.为什么要这样取模呢?因为12864液晶的横纵坐标就是这个取模顺序,这点在之后还会详细提到. 1.2液晶的设置 液晶显示图片必须用扩充指令集,初始化

MPU6050工作原理及STM32控制MPU6050

一·简介: 1.要想知道MPU6050工作原理,得先了解下面俩个传感器: ①陀螺仪传感器: 陀螺仪的原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的.人们根据这个道理,用它来保持方向.然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统.我们骑自行车其实也是利用了这个原理.轮子转得越快越不容易倒,因为车轴有一股保持水平的力量.现代陀螺仪可以精确地确定运动物体的方位的仪器,它在现代航空,航海,航天和国防工业中广泛使用的一种惯性导航仪器.传统的惯性陀螺仪主要部分有机械

STM32峰会2017:半小时开发基于STM32的室内智能环境监测仪

前言:随着空气污染问题得到越来越多人的关注,雾霾.PM2.5.甲醛等词汇也频繁出现在大家的生活中,特别有小孩.老人的家庭越来越关注PM2.5.甲醛的危害.正是空气污染的危害得到越来越多人的重视,空气质量监测的需求也越来越广泛,机智云智能硬件开发平台可以为广大空气检测设备厂商提供可靠的智能解决方案,帮助企业快速开发产品推向市场.本文以室内智能环境监测仪为例,利用机智云自助开发平台,只需30分钟即可搭建产品原型. 一.    目标 室内智能环境监测仪具备实时采集环境数据的能力,能够监测室内温度.湿度

js实现一套代码来控制所有的运动,图片的淡入淡出,winth,height的变宽

介绍了那么多运动,這次一套代码实现所有运动 1.html代码和css代码,只是定义一个div 1 <style> 2 div{ 3 width:200px; 4 height:200px; 5 margin:20px; 6 float:left; 7 background:yellow; 8 border:10px solid black; 9 filter:alpha(opacity:30); 10 opacity:0.3; 11 } 12 </style> 13 <bod

stm32控制LED的亮灭

其实这个小实验就是学会运用GPIO这个外设. GPIO是一个片上高速外设,它是由几个寄存器来控制的,每个寄存器占据0x04: GPIOx_BSSR: 端口位设置/清除寄存器,这个寄存器的BSy位是0-15位(BS0-BS15),BRy位是16-31位(BR0-BR15):通过这两个位可以控制16个引脚:BSy只写,写0对ODRy无作用,写1置ODRy位1:BSy只写,写0对ODRy无作用,写1清除ODRy为0:如若两个位同时设置,BSy位起作用. GPIOx_CRL/CRH: 端口配置低/高寄存

【安富莱专题教程第1期】基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24

说明:1. 首先感谢ST终于推出了ARGB格式的emWin库,可谓千呼万唤始出来,使用STM32的硬件RGB888接口刷新图片慢的问题终于得到解决.2. 这个问题由来已久,是之前为我们的STM32-V6板子制作emWin模板时发现的.V6板子的硬件配置是STM32F429BIT6 + 32位带宽的SDRAM + 硬件RGB888接口.实际测试中发现,将F429配置为16位色的RGB565,刷新800*480分辨率的图片可以做到15ms左右一帧,而测试24位色的RGB888或者32位色的ARGB8

STM32驱动ILI9341控制器控制TFTLCD显示

STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD显存对应的概念:所谓色彩深度就是每个像素点需要多少位的RGB 数据表示该点的颜色信息.注意,不同的TFTLCD显示器的RGB的对应关系不一样,这个可以在LCD 控制芯片手册中找到答案. 例: 某LCD显示支持8.16.24位RGB,这些位数是指该像素点颜色由8.16.24位RGB构成,但是 R\G\

【IOS 开发】IOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

一. IOS 项目简介 1. IOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类和资源; (1) HelloWorld 目录 HelloWorld 目录介绍 : -- 命名规则 : 该目录名称与 IOS 项目名称相同, 是主目录; -- 存放内容 : IOS 项目的 源码文件, 界面设计文件, 资源文件都存放在该目录下; -- 源文件 : Objective C 的 .m 和

证件照(1寸2寸)拍摄处理知识汇总 此博文包含图片

一.电子版照片要求: 1.近期免冠照片,照片清晰,完整,背景红色.蓝色均可. 2.照片为jpg格式:大小为15KB—35KB之间:图片的尺寸为宽150像素,高210像素. 3.照片必须由数码相机拍摄,相机像素不得少于400万. 4.头像大小及位置:人像在相片矩形框内水平居中,头顶发迹距相片顶部占照片高度的2/10,照片下边缘以刚露出锁骨或者衬衣领尖为准.  双耳要露出,平时带眼睛的需要带上眼睛拍照. 5.着装要求:服装不要与背景色相近,建议穿深色衣服:男士(西服+衬衫+领带):女士(西服+衬衣)