W806+ST7735R+tftLCD程序开发

**本文使用环境:

电脑:WIN10
开发板:W80X (w806 w801 w800 air101 air 103)
平台:CDK
显示屏:openmv 1.8英寸SPI显示屏128X160(st7735r ,程序兼容st7735s
显示屏资料:https://openmv.io/products/lcd-shield (128RMB,为什么会这么贵,搞不清楚)**

本项目github地址

一、显示接口连接

1、显示屏接口:
典型的SPI接口
SPI显示屏接口
2、开发板接口
自己可以下去查看手册,这里不再赘述了,直接看SPI的IO口是哪些。80X带有硬件SPI,速度最快20MHZ,所以刷屏会有些慢。SPI接口如下程序:

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
	__HAL_RCC_SPI_CLK_ENABLE();
	__HAL_AFIO_REMAP_SPI_CS(GPIOB, GPIO_PIN_4);
	__HAL_AFIO_REMAP_SPI_CLK(GPIOB, GPIO_PIN_2);
	__HAL_AFIO_REMAP_SPI_MISO(GPIOB, GPIO_PIN_3);
	__HAL_AFIO_REMAP_SPI_MOSI(GPIOB, GPIO_PIN_5);

注意:SPI端口中B3没有使用,因为LCD只需要数据传入,不需要数据传出,单片机作为M,LCD作为S。

除此之外LCD还需要额外的三个IO口控制,如下:复位、背光和数据控制切换端口,我这里分别采用的是B0 B1 B6 ,因为2、3、4、5已经作为SPI用了。

#define LCD_RES_Clr()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)//RES
#define LCD_RES_Set()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET)

#define LCD_BLK_Clr()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)//BLK
#define LCD_BLK_Set()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)

#define LCD_DC_Clr()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)//DC
#define LCD_DC_Set()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET)

端口对应表:

开发板引脚LCD引脚
PB0RES
PB1BLK
PB2CLK
PB4CS
PB5MOSI
PB6DC

二、 程序

这里需要特别说明的是:由于SPI_DMA无法调试成功,所以用的仅仅是硬件SPI,速度20MHZ所以初始化程序将DMA也初始化了,但是没有使用DMA。后期有大佬做出来DMA再更新,
如果是ST7735R可以直接使用程序如果是ST7735S需要注释下列宏定义
在这里插入图片描述

1、main.c:


#include <stdio.h>
#include "wm_hal.h"
#include "lcd_init.h"
#include "tft7735r.h"
void Error_Handler(void);

SPI_HandleTypeDef hspi;
DMA_HandleTypeDef hdma_spi_tx;
DMA_HandleTypeDef hdma_spi_rx;

static void SPI_Init(void);
static void DMA_Init(void);
#define data_len (10000)
uint8_t tx_data[data_len] = {0};
uint8_t rx_data[data_len] = {0};

int main(void)
{

	
	SystemClock_Config(CPU_CLK_240M);
	printf("enter main\r\n");
	LCD_GPIO_Init();
	DMA_Init();
	SPI_Init();
	__HAL_SPI_SET_CS_LOW(&hspi);
	LCD_Init();//LCD初始化

	while(1)
	{
		uint32_t start = HAL_GetTick();
		LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
		uint32_t end = HAL_GetTick();
		printf("time %dms \r\n",end - start);
		
		LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
		HAL_Delay(1000);
		LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
		HAL_Delay(1000);
		LCD_Fill(0,0,LCD_W,LCD_H,BRED);
		HAL_Delay(1000);
		LCD_Fill(0,0,LCD_W,LCD_H,GRED);
		HAL_Delay(1000);
		LCD_Fill(0,0,LCD_W,LCD_H,GBLUE);
		HAL_Delay(1000);
		LCD_Fill(0,0,LCD_W,LCD_H,MAGENTA);
		HAL_Delay(1000);
		LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
		HAL_Delay(1000);
		
	}
}

static void SPI_Init(void)
{
	hspi.Instance = SPI;
	hspi.Init.Mode = SPI_MODE_MASTER;
	hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
	hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
	hspi.Init.NSS = SPI_NSS_SOFT;
	hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
	hspi.Init.FirstByte = SPI_LITTLEENDIAN;
	
	if (HAL_SPI_Init(&hspi) != HAL_OK)
	{
		Error_Handler();
	}
}

static void DMA_Init(void)
{
	__HAL_RCC_DMA_CLK_ENABLE();
	
	HAL_NVIC_SetPriority(DMA_Channel0_IRQn, 0);
	HAL_NVIC_EnableIRQ(DMA_Channel0_IRQn);
	
	HAL_NVIC_SetPriority(DMA_Channel1_IRQn, 0);
	HAL_NVIC_EnableIRQ(DMA_Channel1_IRQn);
}

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
	__HAL_SPI_SET_CS_HIGH(hspi);
	printf("tx cplt\r\n");
}

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
	__HAL_SPI_SET_CS_HIGH(hspi);
	printf("rx cplt\r\n");
}

void Error_Handler(void)
{
	while (1)
	{
	}
}

void assert_failed(uint8_t *file, uint32_t line)
{
	printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}

2、程序优化

LCD是参考的STM32的代码,在实际使用过程中发现,在传输数据的时候,单字节的传输时间较慢,如下所示:

/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(uint16_t dat)
{
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}

这个函数是一个字节字节的传输,我的算下来一帧图像的时间是114ms,,较长,因为这里是一字节一字节的传输。由于W806的SPI传输中可以多字节发送,所以我做了如下修改:

/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(uint16_t dat)
{
	uint8_t data[2];
	data[0] = dat>>8;
	data[1] = dat;
	HAL_SPI_Transmit(&hspi,(uint8_t *)data,2,100);
}

修改后的代码可以直接发生两个字节的数据,可以极大的节约时间,这点出乎我的意料。实际测下来,采用这种方式的发送时间是:69ms。114 到 69 这还是很有说服力的。

三、演示效果

1、图片展示

在这里插入图片描述

2、程序运行时间统计

通过串口助手打印显示,每一帧的时间大概是69ms左右:当然这个时间可以通过修改系统时钟频率变小一点,我大概测了一下是小了10个ms左右,意义不大就不在贴方法了。
在这里插入图片描述

3、视频展示

W806驱动TFTLCD-st7735r

四、程序地址

本项目github地址

### ST7735 MicroPython 驱动程序教程 #### 1. 安装依赖库 为了使ST7735显示屏能够正常工作于MicroPython环境中,需安装必要的驱动库。通常情况下,这些库可以通过在线资源获取。 对于Raspberry Pi Pico或其他兼容设备而言,可以利用`micropython-st7735r`库来实现对ST7735屏幕的支持[^3]。该库提供了初始化配置以及基本绘图函数等功能,极大地方便了开发者快速上手使用TFT彩屏进行开发创作。 #### 2. 初始化设置 在开始编程之前,首先要完成硬件连接部分的工作,即把SPI总线与LCD模块正确对接好之后,在代码层面也需要做相应的初始化设定: ```python from machine import Pin, SPI import st7735 # 设置SPI参数 spi = SPI(1, baudrate=40000000, polarity=1, phase=0) # 创建ST7735对象实例化 tft = st7735.ST7735( spi, cs=Pin(9), # 芯片选择信号引脚编号 dc=Pin(8), # 数据/命令控制引脚编号 rst=None, # 复位引脚(可选) width=128, height=160,# 屏幕分辨率大小 rotation=3 # 显示方向调整 ) ``` 这段代码定义了一个基于SPI通信协议的对象`tft`用于后续操作ST7735显示器。其中包含了指定SPI端口、数据传输速率等重要属性;同时也指定了具体的GPIO管脚用来发送指令给LCD面板。 #### 3. 基本图形绘制方法 有了上述准备工作后就可以着手编写一些简单的例子来进行测试验证了。下面给出几个常用的功能示范: ##### 绘制矩形框 通过调用`tft.rect()`方法可以在屏幕上画出不同颜色填充效果的矩形区域。 ```python def draw_rectangle(x, y, w, h, color): tft.fill_rect(x, y, w, h, color) # 实心矩形 tft.rect(x, y, w, h, color ^ 0xFFFF) # 边框线条 ``` ##### 文字打印输出 借助内置字体表可以直接向指定位置书写ASCII字符字符串。 ```python def write_text(text, x, y, fgcolor, bgcolor): tft.text(font, text, x, y, fgcolor, bgcolor) ``` 以上仅列举了一些基础性的API接口供参考学习之用,实际上还有更多高级特性等待探索发现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr·赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值