STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

2024-02-29 04:44

本文主要是介绍STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例


  • 📍相关篇《Arduino框架下ESP32/ESP8266+合宙1.54“ 电子墨水屏(e-paper)驱动显示示例》
  • 🔖程序是从GooDisplay品牌和微雪电子下同型号规格墨水屏的示例程序参考Arduino框架下的驱动显示代码修改得来的。
  • 📍移植参考程序(👎不推荐👎):(GooDisplay)https://www.good-display.cn/product/380.html
  • 📌同类型的,微雪品牌的相关资料参考:https://www.waveshare.net/wiki/1.54inch_e-Paper_Module

🔖使用GooDisplay仅仅是实现刚刚点亮屏幕,点亮屏幕是迈出的重要的第一步,基于标准库,使用STM32f103芯片,软件SPI方式。

  • 🌾使用微雪电子同型号规格的墨水屏驱动示例代码成功驱动。内容显示正常,包含完整的对应显示接口函数,完全可以拿来直接使用。完全兼容EPD_1in54_test版本,其他版本点不亮。(✨推荐✨)
  • 🐛使用GooDisplay代码移植后,有bug。显示是:上下反置的效果,合宙1.54“ 电子墨水屏(e-paper)没有对应的手册可查询,只能参考Arduino驱动代码进行查找进行修复。测试使用局部刷新指令,来刷全局可以部分显示正常。问题可能还是在全局指令上。
    在这里插入图片描述
    在这里插入图片描述

📝GooDisplay参考代码修改位置

  • 🌿初始化函数:EPD_HW_Init()
const unsigned char lut_full_update[] =
{0x02, 0x02, 0x01, 0x11, 0x12, 0x12, 0x22, 0x22, 0x66, 0x69, 0x69, 0x59, 0x58, 0x99, 0x99, 0x88, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xB4, 0x13, 0x51, 0x35, 0x51, 0x51, 0x19, 0x01, 0x00
};
//局部刷新指令
const unsigned char lut_partial_update[] =
{0x10, 0x18, 0x18, 0x08, 0x18, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x44, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//Full screen refresh initialization
void EPD_HW_Init(void)
{int i;EPD_W21_RST_0;  // Module reset   delay_xms(20);//At least 10ms delay EPD_W21_RST_1;delay_xms(20); //At least 10ms delay Epaper_READBUSY();   EPD_W21_WriteCMD(0x12);  //SWRESETEpaper_READBUSY();   EPD_W21_WriteCMD(0x01); //Driver output control      
//	EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
//	EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);EPD_W21_WriteDATA((EPD_HEIGHT-1)& 0xFF);    EPD_W21_WriteDATA(((EPD_HEIGHT - 1) >> 8) & 0xFF);
//	EPD_W21_WriteDATA(0x00);//	EPD_W21_WriteCMD(0x11); //data entry mode       
//	EPD_W21_WriteDATA(0x01);//	EPD_W21_WriteCMD(0x44); //set Ram-X address start/end position   
//	EPD_W21_WriteDATA(0x00);
//	EPD_W21_WriteDATA(EPD_WIDTH/8-1);    //	EPD_W21_WriteCMD(0x45); //set Ram-Y address start/end position          
//	EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
//	EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
//	EPD_W21_WriteDATA(0x00);
//	EPD_W21_WriteDATA(0x00); //	EPD_W21_WriteCMD(0x3C); //BorderWavefrom
//	EPD_W21_WriteDATA(0x05);	
//	  	
//  EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
//	EPD_W21_WriteDATA(0x80);	//	EPD_W21_WriteCMD(0x4E);   // set RAM x address count to 0;
//	EPD_W21_WriteDATA(0x00);
//	EPD_W21_WriteCMD(0x4F);   // set RAM y address count to 0X199;    
//	EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
//	EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
//  Epaper_READBUSY();EPD_W21_WriteCMD(0x0c);EPD_W21_WriteDATA(0xD7);EPD_W21_WriteDATA(0xD6);EPD_W21_WriteDATA(0x9D);EPD_W21_WriteCMD(0x2c);EPD_W21_WriteDATA(0xA8);                     // VCOM 7C  0xA8EPD_W21_WriteCMD(0x3a);EPD_W21_WriteDATA(0x1A);                     // 4 dummy lines per gateEPD_W21_WriteCMD(0x3b);EPD_W21_WriteDATA(0x08);                     // 2us per lineEPD_W21_WriteCMD(0x11);EPD_W21_WriteDATA(0x03);                     // X increment; Y increment EPD_W21_WriteCMD(0x32);/* the length of look-up table is 30 bytes */for ( i = 0; i < 30; i++) {EPD_W21_WriteDATA(lut_full_update[i]);}
}
  • 🌿刷新显示函数:EPD_Update()
//Full screen refresh update function
void EPD_Update(void)
{   EPD_W21_WriteCMD(0x22); //Display Update Control//  EPD_W21_WriteDATA(0xF7);//注释掉该指令
EPD_W21_WriteDATA(0xc4);	//新增EPD_W21_WriteCMD(0x20); //Activate Display Update Sequence
//	EPD_W21_WriteDATA(0xFF);//  新增 TERMINATE_FRAME_READ_WRITE 不启用,没有发现其他异常Epaper_READBUSY();   }
  • 合宙1.54“ 电子墨水屏(e-paper)屏幕不兼容GooDisplay的快速刷屏指令,
📄GooDisplay示例程序引脚定义
  • Display_EPD_W21_spi.h中:
#define EPD_W21_MOSI_0	GPIO_ResetBits(GPIOD, GPIO_Pin_10)
#define EPD_W21_MOSI_1	GPIO_SetBits(GPIOD, GPIO_Pin_10)#define EPD_W21_CLK_0	GPIO_ResetBits(GPIOD, GPIO_Pin_9)
#define EPD_W21_CLK_1	GPIO_SetBits(GPIOD, GPIO_Pin_9)#define EPD_W21_CS_0	GPIO_ResetBits(GPIOD, GPIO_Pin_8)
#define EPD_W21_CS_1	GPIO_SetBits(GPIOD, GPIO_Pin_8)#define EPD_W21_DC_0	GPIO_ResetBits(GPIOE, GPIO_Pin_15)
#define EPD_W21_DC_1	GPIO_SetBits(GPIOE, GPIO_Pin_15)#define EPD_W21_RST_0	GPIO_ResetBits(GPIOE, GPIO_Pin_14)
#define EPD_W21_RST_1	GPIO_SetBits(GPIOE, GPIO_Pin_14)#define isEPD_W21_BUSY GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_13) // for solomen solutions
📚合宙1.54墨水屏适配程序
  • 🔖后续如果修复bug,将更新。
链接:https://pan.baidu.com/s/1_elRESwoOvCxe2ataPG4ug?pwd=em1y 
提取码:em1y

📗微雪对应型号驱动程序

  • 🔖经测试,完全兼容微雪同型号的V1版本(EPD_1in54_test)的程序。
  • 📑微雪对应的驱动程序有2套.
    • 针对带驱动板的程序(标准库):https://www.waveshare.net/wiki/E-Paper_Shield
资源地址:https://www.waveshare.net/w/upload/6/69/E-Paper_Shield_Code.7z

在这里插入图片描述

    /**SPI1 GPIO Configuration    PA5     ------> SPI1_SCK  SCLPA6     ------> SPI1_MISO不需要接PA7     ------> SPI1_MOSI DIN(SDA)*/
#define SD_CS_Pin GPIO_PIN_10
#define SD_CS_GPIO_Port GPIOB#define EPD_DC_Pin GPIO_PIN_7
#define EPD_DC_GPIO_Port GPIOC#define EPD_BUSY_Pin GPIO_PIN_8
#define EPD_BUSY_GPIO_Port GPIOA#define EPD_RST_Pin GPIO_PIN_9
#define EPD_RST_GPIO_Port GPIOA#define SPIRAM_CS_Pin GPIO_PIN_4
#define SPIRAM_CS_GPIO_Port GPIOB#define EPD_CS_Pin GPIO_PIN_6
#define EPD_CS_GPIO_Port GPIOB
    • 仅针对屏幕的驱动程序EPD_1in54_test版本(HAL库):https://www.waveshare.net/wiki/1.54inch_e-Paper_Module_Manual#STM32
资源地址:https://www.waveshare.net/w/upload/3/39/E-Paper_code.7z

在这里插入图片描述

    PA5     ------> SPI1_SCKPA7     ------> SPI1_MOSI
#define RST_Pin GPIO_PIN_1
#define RST_GPIO_Port GPIOA
#define DC_Pin GPIO_PIN_2
#define DC_GPIO_Port GPIOA
#define BUSY_Pin GPIO_PIN_3
#define BUSY_GPIO_Port GPIOA
#define SPI_CS_Pin GPIO_PIN_4
#define SPI_CS_GPIO_Port GPIOA
  • 🪓图片取模教程和工具介绍:https://www.waveshare.net/wiki/Image2Lcd%E5%9B%BE%E7%89%87%E5%8F%96%E6%A8%A1%E6%AD%A5%E9%AA%A4

-🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。

这篇关于STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757610

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav