由 WangChong 贡献,Ai-Thinker 进行整理
大家好,今天给大家带来3.5寸SPI彩屏的移植库(硬件SPI,因为软件SPI刷新率的问题,所不提供软件SPI)

接线图如下:

| M61-32S | 3.5寸SPI屏 |
|---|---|
| VCC | VCC |
| GND | GND |
| IO12 | CS |
| IO26 | RS |
| IO27 | D/C |
| IO19 | SDI |
| IO13 | SCL |
| IO28 | BL |
| IO18 | SDO |

库文件介绍
该移植库共包含五个部分,分别是:
- lcd_init.c LCD初始化函数相关源码文件
- lcd_init.h LCD初始化函数头文件
- lcd.c LCD显示相关源码文件
- lcd.h LCD显示相关头文件
- lcdfont.h 字体文件
- pic.h 显示图片相关
- USER_SPI.c SPI相关源码文件
- USER_SPI.h SPI相关头文件
**如何使用** 1 - 用户需要在CMakeLists.txt引入需要编译的库即可,如下所示(可自定义引入的路径) cmake
target_sources(app PRIVATE
USER_SPI.h
USER_SPI.C
LCD/lcd_init.c
LCD/lcd_init.h
LCD/lcd.c
LCD/lcd.h
LCD/lcdfont.h
LCD/pic.h
)2- 在main.c 中进行测试,或者手动调用lcd.h中的方法,下图为main.c的代码
c
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_gpio.h"
#include "LCD\lcd_init.h"
#include "LCD\lcd.h"
#include "LCD\pic.h"
int main(void)
{
uint8_t i, j;
float t = 0;
board_init();
LCD_Init();
LCD_Fill(0, 0, LCD_W, LCD_H, WHITE);
while (1) {
LCD_ShowString(0, 40, "LCD_W:", RED, WHITE, 16, 0);
LCD_ShowIntNum(48, 40, LCD_W, 3, RED, WHITE, 16);
LCD_ShowString(80, 40, "LCD_H:", RED, WHITE, 16, 0);
LCD_ShowIntNum(128, 40, LCD_H, 3, RED, WHITE, 16);
LCD_ShowString(80, 40, "LCD_H:", RED, WHITE, 16, 0);
LCD_ShowString(0, 70, "Increaseing Nun:", RED, WHITE, 16, 0);
LCD_ShowFloatNum1(128, 70, t, 4, RED, WHITE, 16);
t += 0.11;
for (j = 0; j < 7; j++) {
for (i = 0; i < 8; i++) {
LCD_ShowPicture(40 * i, 200 + j * 40, 40, 40, gImage_1);
}
}
bflb_mtimer_delay_ms(5000);
}
}3- lcd.h lcd显示相关函数定义(我已经加了详细的代码注释)
c
#ifndef __LCD_H
#define __LCD_H
#include "stdint.h"
/*********************************************屏幕显示函数开始********************************************/
/**
* @brief 在指定区域填充颜色
*
* @param xsta 起始坐标 x
* @param ysta 起始坐标y
* @param xend 结束坐标x
* @param yend 结束坐标y
* @param color 颜色
*/
void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint32_t color);
/**
* @brief 在指定位置画点
*
* @param x x坐标
* @param y y坐标
* @param color 颜色
*/
void LCD_DrawPoint(uint16_t x, uint16_t y, uint32_t color);
/**
* @brief 在指定位置画一个线段
*
* @param x1 起始坐标x
* @param y1 起始坐标y
* @param x2 结束坐标x
* @param y2 结束坐标y
* @param color 颜色
*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint32_t color);
/**
* @brief 在指定位置画一个矩形
*
* @param x1 起始坐标x
* @param y1 起始坐标y
* @param x2 结束坐标x
* @param y2 结束坐标y
* @param color 颜色
*/
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint32_t color);
/**
* @brief 在指定位置画一个圆
*
* @param x0 圆心坐标x
* @param y0 圆心坐标y
* @param r 半径
* @param color 颜色
*/
void Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r, uint32_t color);
/**
* @brief 指定位置显示一个字符
*
* @param x x坐标
* @param y y坐标
* @param num 要显示的char 字符
* @param fc 字体颜色
* @param bc 背景颜色
* @param sizey 字体大小 16 24 32
* @param mode 0叠加模式 / 1 不叠加
*/
void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t num, uint32_t fc, uint32_t bc, uint8_t sizey, uint8_t mode);
/**
* @brief 指定位置显示一个字符串
*
* @param x x坐标
* @param y y坐标
* @param p 要显示的字符串数组指针
* @param fc 字体颜色
* @param bc 背景颜色
* @param sizey 字体大小 16 24 32
* @param mode 0叠加模式 / 1 不叠加
*/
void LCD_ShowString(uint16_t x, uint16_t y, const uint8_t *p, uint32_t fc, uint32_t bc, uint8_t sizey, uint8_t mode);
/**
* @brief 求幂函数
*
* @param m 底数
* @param n 指数
* @return uint32_t 结果
*/
uint32_t mypow(uint8_t m, uint8_t n);
/**
* @brief 指定位置显示一个字符串
*
* @param x x坐标
* @param y y坐标
* @param num 要显示的数字
* @param len 长度
* @param fc 字体颜色
* @param bc 背景颜色
* @param sizey 字体大小 16 24 32
*/
void LCD_ShowIntNum(uint16_t x, uint16_t y, uint16_t num, uint8_t len, uint32_t fc, uint32_t bc, uint8_t sizey);
/**
* @brief 指定位置显示一个字符串
*
* @param x x坐标
* @param y y坐标
* @param num 要显示的数字
* @param len 长度
* @param fc 字体颜色
* @param bc 背景颜色
* @param sizey 字体大小 16 24 32
*/
void LCD_ShowFloatNum1(uint16_t x, uint16_t y, float num, uint8_t len, uint32_t fc, uint32_t bc, uint8_t sizey);
/**
* @brief 显示一张图片在屏幕上
*
* @param x x坐标
* @param y y坐标
* @param length 长
* @param width 宽
* @param pic 图片数组
*/
void LCD_ShowPicture(uint16_t x, uint16_t y, uint16_t length, uint16_t width, const uint8_t pic[]);
/*********************************************屏幕显示函数结束***********************************************/
/*---------------------------------------------------------------------------------------------------------*/
/*********************************************屏幕显示颜色定义开始********************************************/
#define WHITE 0xFCFCFC
#define BLACK 0X000000
#define RED 0xFC0000
#define GREEN 0x00FC00
#define BLUE 0x0000FC
/*********************************************屏幕显示颜色定义结束********************************************/
#endif
<img src='/img/bbsdiy/ai_m6x/866e90349a8c8036.gif' alt='' width='485' />
**代码如下**上传的附件: 
SPI_TEST.zip(20.55 KB, 下载次数: 26)
LCD图片和文字取模教程如下
上传的附件: 
03-LCD取模教程.zip(1.62 MB, 下载次数: 4)

移植验证 如果上述的操作无误的话,在代码烧录后,屏幕应该如下图所示 
常见问题汇总
- 上述文档中额外提供了图片的取模操作以及文字的取模操作即可在屏幕上显示中文或者显示图片,具体的步骤在压缩包内的文档中,需要自己摸索下。
- spi的速度不要超过50M,否则屏幕将会出现撕裂的情况
- 用户可以自定义除了SPI的其他pin。只需要初始化对应的IO和调整对应的功能函数即可
- 规格书较大,无法长传,可以搜索ILI9488 Data Sheet_100.pdf自行下载
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

