/**
****************************************************************************************************
* @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
没有合适的资源?快使用搜索试试~ 我知道了~
物联网嵌入式ESP32开发Arduino例程16-IR红外遥控器发送数据.rar
共15个文件
h:7个
cpp:6个
url:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 112 浏览量
2024-04-21
20:20:49
上传
评论 1
收藏 28KB RAR 举报
温馨提示
1、嵌入式物联网ESP32项目实战开发。例程经过精心编写,简单好用。 2、代码使用Arduino开发。例程在ESP32-S3上运行。若在其他型号上运行,请自行调整。 3、如果接入其他传感器,请点击头像查看发布的其他资料。 4、ESP32与模块的接线,在代码当中均有定义,请自行对照。 5、若硬件差异,请根据自身情况适当调整代码,程序仅供参考。 6、代码有注释说明,请耐心阅读。 7、技术v:349014857; 8、配套开发例程、操作指南,点击左侧头像进主页查找。 9、资料为压缩包文件,请安装解压软件解压后使用。
资源推荐
资源详情
资源评论
收起资源包目录
物联网嵌入式ESP32开发Arduino例程16_IR红外遥控器发送数据.rar (15个子文件)
物联网嵌入式ESP32开发Arduino例程16_IR红外遥控器发送数据
16_infrared_transmission
uart.cpp 1KB
xl9555.h 5KB
emission.cpp 1KB
uart.h 1KB
emission.h 894B
remote.h 942B
led.h 1KB
font.h 68KB
16_infrared_transmission.ino 3KB
remote.cpp 2KB
spilcd.h 6KB
spilcd.cpp 30KB
xl9555.cpp 6KB
led.cpp 991B
技术答疑,双击打开.url 121B
共 15 条
- 1
资源评论
- 能力越小责任越小12024-05-06感谢资源主的分享,这个资源对我来说很有用,内容描述详尽,值得借鉴。
物联技术666
- 粉丝: 2765
- 资源: 839
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功