在线图片转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. Redis数据库总结

    1.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI ...

  2. windows server 2012 R2修改默认远程端口

    因客户现场网络复杂,将windows系统的默认远程端口3389归入安全策略中,所以服务器需要修改此端口,配置如下: 首先:登录操作系统,win+R调出运行菜单后输入regedit, 进入注册表编辑相关 ...

  3. NFA 、DFA 简述

    转载请注明出处 https://www.cnblogs.com/majianming/p/11823697.html 目前常见的正则表达引擎总体分为2种,DFA (确定型有穷状态自动机) 和 NFA ...

  4. java-特殊字符转义转换

    常见特殊字符:如下 <>…&—\"·‘’ java替换 /* * 特殊字符转换 */ public static String replacesss(String ss) ...

  5. Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)

    在将自己写的工具打成.jar包的时候,有时候会需要引用到res中的资源,这时候不能将资源一起打包,只能通过反射机制动态的获取资源. /** * 反射得到组件的id号 */ public static ...

  6. SQL Server中char、varchar、text和nchar、nvarchar、ntext的区别 (转)

    转:http://blog.csdn.net/jackychu/article/details/4183118 http://www.cnblogs.com/jhxk/articles/1633578 ...

  7. MySQL 5.7免安装版设置编码格式、设置root用户密码 远程登录.

    一.设置默认编码格式为utf-8 ... 由于免安装版并没有my.ini的配置文件.需要自行粘贴配置并创建一个my.ini 配置如下: [mysql] # 设置mysql客户端默认字符集 defaul ...

  8. Redis入门很简单之一【简介与环境搭建】

    Redis入门很简单之一[简介与环境搭建] 博客分类: NoSQL/Redis/MongoDB redisnosqlmemcached缓存中间件  [Redis简介] <一>. NoSQL ...

  9. Qwidget布局操作之QGridLayout(网格布局)

    QMainWindow并没有setLayout()函数,因此不能使用setLayout()函数来设置layout,需要使用间接的方法. 需要做的只是先定义一个QWidget对象,然后使用QMainWi ...

  10. 漫谈C语言结构体【转】

    相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...