/**
****************************************************************************************************
* @file spilcd.cpp
* @author
* @version V1.0
* @date 2023-12-01
* @brief SPILCD 驱动代码
* @license
****************************************************************************************************
* @attention
*
* 定制开发,技术V:349014857
* 更多例程:https://iot666.blog.csdn.net/
* 开发咨询:http://doc.yotill.com
*
* 修改说明
* V1.0 20231201
* 第一次发布
*
****************************************************************************************************
*/
#include "spilcd.h"
#include "font.h"
#include <SPI.h>
#include "xl9555.h"
#define SPI_LCD_TYPE 1 /* SPI接口屏幕类型(1:2.4寸SPILCD 0:1.3寸SPILCD) */
/* LCD的宽和高定义 */
#if SPI_LCD_TYPE /* 2.4寸SPI_LCD屏幕 */
uint16_t spilcd_width = 240; /* 屏幕的宽度 240(竖屏) */
uint16_t spilcd_height = 320; /* 屏幕的宽度 320(竖屏) */
#else
uint16_t spilcd_width = 240; /* 屏幕的宽度 240(竖屏) */
uint16_t spilcd_height = 240; /* 屏幕的宽度 240(竖屏) */
#endif /* 1.3寸SPI_LCD屏幕 */
uint8_t spilcd_dir = 1; /* 默认横屏(1)、竖屏(0) */
#define USE_LCD_BUF 1 /* 默认使用lcd_buf,使用lcd_buf刷屏速度会大幅度提升,牺牲空间提高速度,内存不够时,置0即可 */
#if USE_LCD_BUF
#if SPI_LCD_TYPE
uint16_t lcd_buf[320 * 240]; /* 存放一帧图像数据 */
#else
uint16_t lcd_buf[240 * 240]; /* 存放一帧图像数据 */
#endif
#endif
/* LCD的画笔颜色和背景色 */
uint32_t g_point_color = 0XF800; /* 画笔颜色 */
uint32_t g_back_color = 0XFFFF; /* 背景色 */
static const int SPICLK = 80000000; /* SPI通信速率(屏幕显示异常,调低SPICLK) */
SPIClass* spi_lcd = NULL; /* 定义一个未初始化指向SPI对象的指针 */
/**
* @brief 往LCD写命令
* @param cmd:命令
* @retval 无
*/
static void lcd_write_cmd(uint8_t cmd)
{
LCD_WR(0);
spi_lcd->transfer(cmd);
}
/**
* @brief 往LCD写数据
* @param data:数据
* @retval 无
*/
static void lcd_write_data(uint8_t data)
{
LCD_WR(1);
spi_lcd->transfer(data);
}
/**
* @brief 往LCD写指定数量的数据
* @param data:数据的起始地址
* @param size:发送数据大小
* @return 无
*/
static void lcd_write_bytes(uint8_t *data, uint32_t size)
{
LCD_WR(1);
spi_lcd->transfer(data, size);
}
/**
* @brief 往LCD写像素数据
* @param data:像素数据
* @retval 无
*/
static void lcd_write_pixeldata(uint16_t data)
{
LCD_WR(1);
spi_lcd->transfer16(data);
}
/**
* @brief 设置LCD行列地址
* @param xs: 列起始地址
* ys: 行起始地址
* xe: 列结束地址
* ye: 行结束地址
* @retval 无
*/
void lcd_set_address(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye)
{
lcd_write_cmd(0x2A);
lcd_write_data((uint8_t)(xs >> 8) & 0xFF);
lcd_write_data((uint8_t)xs & 0xFF);
lcd_write_data((uint8_t)(xe >> 8) & 0xFF);
lcd_write_data((uint8_t)xe & 0xFF);
lcd_write_cmd(0x2B);
lcd_write_data((uint8_t)(ys >> 8) & 0xFF);
lcd_write_data((uint8_t)ys & 0xFF);
lcd_write_data((uint8_t)(ye >> 8) & 0xFF);
lcd_write_data((uint8_t)ye & 0xFF);
lcd_write_cmd(0x2C);
}
/**
* @brief 设置LCD的自动扫描方向
* @note 一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
* @param dir:0~7,代表8个方向(具体定义见lcd.h)
* @retval 无
*/
void lcd_scan_dir(uint8_t dir)
{
uint16_t regval = 0;
uint16_t dirreg = 0;
uint16_t temp;
if (spilcd_dir == 1) /* 横屏时,需改变扫描方向! */
{
switch (dir) /* 方向转换 */
{
case 0:
dir = 5;
break;
case 1:
dir = 7;
break;
case 2:
dir = 4;
break;
case 3:
dir = 6;
break;
case 4:
dir = 1;
break;
case 5:
dir = 0;
break;
case 6:
dir = 3;
break;
case 7:
dir = 2;
break;
}
}
/* 根据扫描方式 设置 0x36 寄存器 bit 5,6,7 位的值 */
switch (dir)
{
case L2R_U2D:/* 从左到右,从上到下 */
regval |= (0 << 7) | (0 << 6) | (0 << 5);
break;
case L2R_D2U:/* 从左到右,从下到上 */
regval |= (1 << 7) | (0 << 6) | (0 << 5);
break;
case R2L_U2D:/* 从右到左,从上到下 */
regval |= (0 << 7) | (1 << 6) | (0 << 5);
break;
case R2L_D2U:/* 从右到左,从下到上 */
regval |= (1 << 7) | (1 << 6) | (0 << 5);
break;
case U2D_L2R:/* 从上到下,从左到右 */
regval |= (0 << 7) | (0 << 6) | (1 << 5);
break;
case U2D_R2L:/* 从上到下,从右到左 */
regval |= (0 << 7) | (1 << 6) | (1 << 5);
break;
case D2U_L2R:/* 从下到上,从左到右 */
regval |= (1 << 7) | (0 << 6) | (1 << 5);
break;
case D2U_R2L:/* 从下到上,从右到左 */
regval |= (1 << 7) | (1 << 6) | (1 << 5);
break;
}
dirreg = 0x36;
spi_lcd->beginTransaction(SPISettings(SPICLK, MSBFIRST, SPI_MODE3));
LCD_CS(0);
lcd_write_cmd(dirreg);
lcd_write_data(regval);
if (regval & 0x20)
{
if (spilcd_width < spilcd_height) /* 交换X,Y */
{
temp = spilcd_width;
spilcd_width = spilcd_height;
spilcd_height = temp;
}
}
else
{
if (spilcd_width > spilcd_height) /* 交换X,Y */
{
temp = spilcd_width;
spilcd_width = spilcd_height;
spilcd_height = temp;
}
}
lcd_set_address(0, 0, spilcd_width - 1, spilcd_height - 1);
LCD_CS(1);
spi_lcd->endTransaction();
}
/**
* @brief 设置LCD显示方向
* @param dir:0,竖屏; 1,横屏
* @retval 无
*/
void lcd_display_dir(uint8_t dir)
{
spilcd_dir = dir;
if (SPI_LCD_TYPE) /* 2.4寸屏需要做处理,1.3寸屏不需要处理 */
{
if (dir == 0) /* 竖屏 */
{
spilcd_width = 240;
spilcd_height = 320;
}
else /* 横屏 */
{
spilcd_width = 320;
spilcd_height = 240;
}
}
lcd_scan_dir(DFT_SCAN_DIR);
}
/**
* @brief 清屏函数
* @param color: 要清屏的颜色
* @retval 无
*/
void lcd_clear(uint16_t color)
{
uint32_t index = 0;
uint32_t totalpoint = spilcd_width * spilcd_height;
spi_lcd->beginTransaction(SPISettings(SPICLK, MSBFIRST, SPI_MODE3));
LCD_CS(0);
lcd_set_address(0, 0, spilcd_width - 1 ,spilcd_height - 1);
LCD_WR(1);
#if USE_LCD_BUF
uint16_t color_tmp = ((color & 0x00FF) << 8) | ((color & 0xFF00) >> 8); /* 需要转换一下颜色值 */
for (uint32_t i = 0; i < spilcd_width * spilcd_height; i++) /* 对lcd_buf填满数据 */
{
lcd_buf[i] = color_tmp;
}
spi_lcd->transfer(lc
电子类产品开发
- 粉丝: 3209
- 资源: 891
最新资源
- 盲道损坏检测数据集VOC+YOLO格式4195张1类别.zip
- WebStorm下配置微信小程序代码提醒jar.zip
- weapp.qrcode.js 在微信小程序中,快速生成二维码.zip
- Wafer2 腾讯云一站式小程序解决方案.zip
- Wafer - 快速构建具备弹性能力的微信小程序.zip
- Wafer - 企业级微信小程序全栈方案.zip
- Vue,React,微信小程序,快应用,TS , Koa, JS 一把梭.zip
- unocss微信小程序预设,unocss小程序默认,在 taro uniapp 原生小程序中使用unocss.zip
- c++ -msvc-chrono.hpp 时间类: 对本头文件的注释,以便于理解 STL 里引入的时间方面的操作
- uni-app小程序.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈