在线图片转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=;i<time*;i++)
{
for(j=;j<;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,,0xfff);
//NSS = 1;
LCD_CS_SET;
}
//向液晶屏写一个8位数据
void Lcd_WriteData(uint8_t Data)
{
LCD_CS_CLR;
LCD_RS_SET;
HAL_SPI_Transmit(&hspi1,&Data,,0xfff);
LCD_CS_SET;
} void LCD_WriteData_16Bit(uint16_t Data)
{
uint8_t Data_H = Data>>;
uint8_t Data_L = Data&0xFF;
LCD_CS_CLR;
LCD_RS_SET;
HAL_SPI_Transmit(&hspi1,&Data_H,,0xfff); //写入高8位数据
HAL_SPI_Transmit(&hspi1,&Data_L,,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();
Lcd_WriteIndex(0x11);//Sleep exit
HAL_Delay();
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+);
Lcd_WriteData(0x00);
Lcd_WriteData(x_end+); Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y_start+);
Lcd_WriteData(0x00);
Lcd_WriteData(y_end+); Lcd_WriteIndex(0x2c);
}
/*************************************************
函数名:Lcd_Clear
功能:全屏清屏函数
入口参数:填充颜色COLOR
返回值:无
*************************************************/
void Lcd_Clear(uint16_t Color)
{
unsigned int i,m;
Lcd_SetRegion(,,X_MAX_PIXEL-,Y_MAX_PIXEL-);
Lcd_WriteIndex(0x2C);
for(i=;i<X_MAX_PIXEL;i++)
for(m=;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+,y+);
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[];
// char temp[2]; for(i = ; i<strlen((char*)s);i++)
{
if(((unsigned char)(*(s+i))) >= )
{
// temp[0] = *(s+i);
// temp[1] = '\0';
return;
} else
{
qm = *(s+i); ulOffset = (long int)(qm) * ; for (j = ; j < ; j ++)
{
ywbuf[j]=Zk_ASCII8X16[ulOffset+j];
} for(y = ;y < ;y++)
{
for(x=;x<;x++)
{
k=x % ; if(ywbuf[y]&(0x80 >> k))
{
xx=x0+x+i*;
Gui_DrawPoint(xx,y+y0,fc);
}
else
{ xx=x0+x+i*;
Gui_DrawPoint(xx,y+y0,bc);
}
}
} }
}
}
/*************************************************
函数名:showimage
功能:显示一副图片
入口参数:图片缓存
返回值:无
*************************************************/
void showimage(const unsigned char *p)
{
unsigned int i;
uint16_t HData,LData;
Lcd_SetRegion(,,X_MAX_PIXEL-,Y_MAX_PIXEL-);
Lcd_WriteIndex(0x2C);
for(i = ;i < *;i++)
{
LData = *(p+i*);
HData = *(p+i*+);
LCD_WriteData_16Bit(HData<<|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中代码

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

  1. STM32 控制步进电机 28BYJ-48

    STM32 控制步进电机 28BYJ-48  http://blog.chinaunix.net/uid-12664992-id-300272.html 步进电机驱动最简化的逻辑: //四相八拍:A- ...

  2. MPU6050工作原理及STM32控制MPU6050

    源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍

  3. .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度

    .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度   随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一 ...

  4. (stm32学习总结)—LCD—液晶显示

    显示器简介 显示器属于计算机的 I/O 设备,即输入输出设备.它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具.常见的有 CRT 显示器.液晶显示器.LED 点阵显示器及OLED 显示器 本章 ...

  5. STM32 控制红外线收发

    买了一块STM32的板子,这次需要将IR的code移植到STM32上面,因为STM32成本比树莓派低得多,所以 一些简单的外设挂在STM32上就行了. 我买的板子的型号是STM32F103C8T6,价 ...

  6. 4.4 使用STM32控制MC20进行GPS帧数据解析

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  7. 4.3 使用STM32控制MC20进行GPRS通讯

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  8. stm32控制步进电机加减速

    实习公司项目需要控制步进电机,电机方面主要包括控制运动.加减速.限位.下面介绍一下在电机控制方面的心得,由于对于电机的控制不需要很精确,并且自身能力有限,相比于大牛有很大的差距. 1.需要实现的功能 ...

  9. 使用STM32控制TMC5160驱动步进电机

    首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...

随机推荐

  1. Codeforces 364D 随机算法

    题意:给你一个序列,定义ghd为一个序列中任意n / 2个数的gcd中最大的那个,现在问这个序列的ghd为多少. 思路:居然是论文题...来自2014年国家集训队论文<随机化算法在信息学竞赛中的 ...

  2. 12.Unsafe原子性操作

    import sun.misc.Unsafe; /** * JDK8 * JDK 的此jar 包中的 Unsafe 类提供了硬件级别的原子性操作 */ public class UnsafeTest ...

  3. python连接mongodb集群

    一 安装模块pymongo pip3 install pymongo 二 创建一个MongoClient conn=MongoClient('mongodb://cbi:pass@ip1:20000, ...

  4. Spring 讲解(一 )

    1.如何理解 Spring 框架 简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. 因为以前写代码的时候,在使用类对象的时候,经常需要实例化创建(new 出来) ...

  5. Java中JDBC连接池&JDBCTemplate

    数据库连接池 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归 ...

  6. 77 geometry process

    0 引言 记录几何方面的一些处理技术. 1 任意多边形面积计算:包含凸多边形和凹多边形 转载了JustDoIT https://www.cnblogs.com/TenosDoIt/p/4047211. ...

  7. implements Serializable有什么作用

    转自 http://blog.csdn.net/dinghqalex/article/details/46009911

  8. delphi 运行时提升软件到管理员权限

    //以管理员身份运行procedure RunAsAdmin(hWnd: HWND; aFile: string; aParameters: string);varsei: TShellExecute ...

  9. 说下vue工程中代理配置proxy

    这个代理配置不需要后台进行ngnix代理跳转了,前端可以做.在vue.config.js文件中进行配置,如下: module.exports = { publicPath: process.env.V ...

  10. [CSP-S模拟测试]:简单的区间(分治)

    题目描述 给定一个长度为$n$的序列$a$以及常数$k$,序列从$1$开始编号.记$$f(l,t)=\sum \limits_{i=l}^ra_i-\max \limits_{i=l}^r\{a_i\ ...