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=;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的更多相关文章
- STM32 控制步进电机 28BYJ-48
STM32 控制步进电机 28BYJ-48 http://blog.chinaunix.net/uid-12664992-id-300272.html 步进电机驱动最简化的逻辑: //四相八拍:A- ...
- MPU6050工作原理及STM32控制MPU6050
源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍
- .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度
.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度 随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一 ...
- (stm32学习总结)—LCD—液晶显示
显示器简介 显示器属于计算机的 I/O 设备,即输入输出设备.它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具.常见的有 CRT 显示器.液晶显示器.LED 点阵显示器及OLED 显示器 本章 ...
- STM32 控制红外线收发
买了一块STM32的板子,这次需要将IR的code移植到STM32上面,因为STM32成本比树莓派低得多,所以 一些简单的外设挂在STM32上就行了. 我买的板子的型号是STM32F103C8T6,价 ...
- 4.4 使用STM32控制MC20进行GPS帧数据解析
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- 4.3 使用STM32控制MC20进行GPRS通讯
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- stm32控制步进电机加减速
实习公司项目需要控制步进电机,电机方面主要包括控制运动.加减速.限位.下面介绍一下在电机控制方面的心得,由于对于电机的控制不需要很精确,并且自身能力有限,相比于大牛有很大的差距. 1.需要实现的功能 ...
- 使用STM32控制TMC5160驱动步进电机
首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...
随机推荐
- 分批插入数据基于mybatis
DB框架:Mybatis.DataBase:Oracle. ---------------------------------------------------------------------- ...
- opensns建站
opensns建站 标签(空格分隔):软件工程 贪玩蓝月 购买云服务器 首选阿里云,一个月9.9元,还能直接安全宝塔Linux界面 后台初始化 输入ip地址:8888访问宝塔后台,第一次进入后台会让你 ...
- zxing opencv
- MongoDB服务的安装与删除
服务的安装: 在MongoDB的目录下创建两个文件夹 data和logs, 在通过cmd进入bin目录下,执行命令: mongod --dbpath "C:\Program Files\Mo ...
- linux 应用层常用API/命令
一 API 1. bsearch NAME bsearch - binary search of a sorted array SYNOPSIS #include <stdlib.h> v ...
- shell读取文件第一行和最后一行,小数的运算比较
1. 读取文件的第一行:head -n +1 file.txt 读取文件的最后一行: tail -n -1 file.txt echo 12:30:55 | cut -d: -f 1 结果为12,意思 ...
- bzoj 2435
http://www.lydsy.com/JudgeOnline/problem.php?id=2435 noi 你为什么那么diao, 这种世纪水题刷一道少一道啊... 我原来还以为是两边的联通块大 ...
- I2C用户态驱动设计
一.用户态驱动模型 1.1 I2C通用驱动代码 i2c_dev_init: static int __init i2c_dev_init(void) { int res; printk(KERN_IN ...
- 【LeetCode 37】解数独
题目链接 [题解] 回溯法搞一下. 用set和数组下标判重. [代码] class Solution { public: set<int> myset[9]; int hang[9][10 ...
- 集训队8月1日(拓扑排序+DFS+主席树入门)
上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...