重庆网站推广优化/百度平台营销宝典
一个1.69寸SPI接口的液晶显示模块,有320*240=76800个点,每个点有2个字节表示RGB的颜色,所以需要153.6K个字节的数据来刷新全屏,如果SPI口输出数据不是高速并且不紧密排列的话,刷新就会比较慢,有从下到下的肉眼可见的刷新过程,现就是希望使用数据缓冲区(我理解这就是显存的概念吧)来快速刷新显示区域。
原始的单个字符的显示程序:
/******************************************************************************函数说明:显示单个字符入口数据:x,y显示坐标num 要显示的字符fc 字的颜色bc 字的背景色sizey 字号mode: 0非叠加模式 1叠加模式返回值: 无
******************************************************************************/
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{uint8_t temp,sizex,t,m=0;uint16_t i,TypefaceNum;//一个字符所占字节大小uint16_t x0=x;sizex=sizey/2;TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;num=num-' '; //得到偏移后的值LCD_Address_Set(x,y,x+sizex-1,y+sizey-1); //设置光标位置for(i=0;i<TypefaceNum;i++){ if(sizey==12)temp=ascii_1206[num][i]; //调用6x12字体else if(sizey==16)temp=ascii_1608[num][i]; //调用8x16字体else if(sizey==24)temp=ascii_2412[num][i]; //调用12x24字体else if(sizey==32)temp=ascii_3216[num][i]; //调用16x32字体else return;for(t=0;t<8;t++){if(!mode)//非叠加模式{if(temp&(0x01<<t))LCD_WR_DATA(fc); //每一个点发送2个字节数据else LCD_WR_DATA(bc);m++;if(m%sizex==0){m=0;break;}}else//叠加模式{if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizex){x=x0;y++;break;}}}}
}
由if(temp&(0x01<<t))LCD_WR_DATA(fc); //每一个点发送2个字节数据
else LCD_WR_DATA(bc);
这几句说明每个点,由SPI发送2个字节的数据出去,而且是一边计算数据,一边发送数据,速度较慢,可以肉眼可见的逐字显示的。
改用缓冲区显示单个字符:
void LCD_ShowChar_new(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{uint8_t temp,sizex,t,m=0;uint16_t i,TypefaceNum;//一个字符所占字节大小uint16_t x0=x;sizex=sizey/2;TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;num=num-' '; //得到偏移后的值//LCD_Address_Set(x,y,x+sizex-1,y+sizey-1); //设置光标位置//uint8_t data[TypefaceNum * 2 * 8]; //=========static uint8_t data[1024]; //=========重要,用静态变量,或者用全局变量,一个字符作为一个缓冲区uint16_t xx = 0;for(i=0; i<TypefaceNum; i++){if(sizey==12)temp=ascii_1206[num][i]; //调用6x12字体else if(sizey==16)temp=ascii_1608[num][i]; //调用8x16字体else if(sizey==24)temp=ascii_2412[num][i]; //调用12x24字体else if(sizey==32)temp=ascii_3216[num][i]; //调用16x32字体else return;for(t=0;t<8;t++){if(!mode)//非叠加模式 带缓冲区,实现快显示功能{if(temp&(0x01<<t)){data[xx++] = fc>>8;data[xx++] = fc;
// data[i*2*8 + t] == fc<<8;
// data[i*2*8 + t + 1] == fc;
// LCD_WR_DATA(fc);}else{data[xx++] = bc>>8;data[xx++] = bc;
// data[i*2*8 + t] == bc<<8;
// data[i*2*8 + t + 1] == bc;
// LCD_WR_DATA(bc);}m++;if(m%sizex==0){m=0;break;}}else//叠加模式{if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizex){x=x0;y++;break;}}}}while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX); //等待SPI发送完成LCD_Address_Set(x,y,x+sizex-1,y+sizey-1); //设置光标位置//while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX); //等待SPI发送完成HAL_SPI_Transmit_DMA(&hspi1, &data, TypefaceNum * 2 * 8); //这句有严重问题,会死机,OK
// while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX); //等待SPI发送完成}
使用缓冲区的方法还是和全屏刷新一样,先把数据都放在数组,然后一次性SPI口发送出去。
缓冲区的大小是按照32字体大小的字符来计算,32字体是 16*32=512个点,1024个字节,所以使用data是1024个字节的缓冲区,这个缓冲区必须是静态或者全局的(这个问题困扰了我好久,一开始就是显示不正常,或者死机),我的理解是SPI要取数据发送,但缓冲区没有了,被系统回收了。
使用缓冲区后,字符显示都是直接显示,不再是一个一个字符逐个显示的感觉了
相关文章:

STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能
一个1.69寸SPI接口的液晶显示模块,有320*24076800个点,每个点有2个字节表示RGB的颜色,所以需要153.6K个字节的数据来刷新全屏,如果SPI口输出数据不是高速并且不紧密排列的话,刷新就会比较慢,有从下到下的肉…...

SpringBoot AOP
依赖引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>代码实现 以给公共字段注入值为例 公共字段与枚举类: private LocalDateTime createT…...

鉴源论坛 · 观模丨浅谈Web渗透之信息收集(下)
作者 | 林海文 上海控安可信软件创新研究院汽车网络安全组 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 信息收集在渗透测试过程中是最重要的一环,“浅谈web渗透之信息收集”将通过上下两篇,对信息收集、…...

构建自己的私人GPT-支持中文
上一篇已经讲解了如何构建自己的私人GPT,这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型,GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品,llama.cpp 不再…...

php将文本内容写入一个文件(面向过程写法)
一、封装2个函数,读写文件 /*** desc 读取文件内容* param string $filename* return array*/ private function readContent(string $filename): array {$text file_get_contents($filename);if (!$text) {return [];}$result json_decode($text,true);return…...

SPDK As IPU Firmware
对于不熟悉术语Infrastructure Processing Unit (IPU, 基础设施处理器)的同学,IPU是PCIe形态的卡,连接到主机系统后可以卸载主机的“基础设施”工作。它通常是面向云服务商或者超融合服务提供商的。对于熟悉SPDK的开发人员来理解,这些卡通常具…...

快速删除node_modules文件夹
文章目录 快速删除node_modules文件夹PowerShell命令快速删除使用npm提供的命令删除node_modules 快速删除node_modules文件夹 前端开发过程中,经常会遇到npm操作问题,有时候不得不需要删除node_modules目录下所有的文件,然后重新npm install npm cache clean --force rm -rf…...

Mac安装nvm以及使用nvm安装node
1. 安装nvm命令 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev0 --tags2. 配置环境变量 vi ~/.bash_profileexport NVM_DIR"$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] &&…...

vue element-ui的table列表中展示缩略图片效果实例
这篇文章主要给大家介绍了关于vue element-ui的table列表中展示多张图片(可放大)效果的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下 一、效果图 二、代码部分 1、原理 使用 <el-table-column> 和 <el-image> 组件来在表格中插入缩略图 2、te…...

C/C++动态内存管理
文章目录 前言1.C/C内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数 5. new和delete的实现原…...

矩阵中的最长递增路径
题目链接 矩阵中的最长递增路径 题目描述 注意点 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕) 解答思路 因为最长递增路径一定是连续的,所以想到使用深度优先遍历来做。如果只使用深度优先遍历会导致超时(同一个…...

vue2 element 弹出框拖拽会出现一层阴影问题
问题如图所示: 因增加 draggable 属性导致我弹窗表单清空文本框时,从右向左选中字体会出现拖拽阴影效果 去掉 draggable 即可 <template><div class"sys-jobTrigger-container"><el-dialog:visible.sync"state.isShowD…...

idea git回滚之前提交记录
提交代码时,如果不小心提交了不需要提交的内容,在本地仓库中,此时需要回滚版本,如何回滚 1.打开git控制台,左下角git,选择要处理的分支,选择刷新获取最新git提交记录 2)选中自己commit需要回滚…...

什么是Modbus协议?
Modbus协议是一种在工业自动化领域广泛应用的通信协议,它允许不同设备之间进行可靠的数据交换和控制。该协议最初由Modicon公司于1979年创建,旨在提供一种简单而有效的方法,使PLC(可编程逻辑控制器)和其他自动化设备能…...

222.【2023年华为OD机试真题(C卷)】分配土地(扫描线算法-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-分配土地二.解题思路三.题解代码Python题解代码…...

Linux网络编程(一-网络相关知识点)
目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信,任何数字通信都离…...

IO进程线程day5
1.实现互斥机制 #include <head.h>char buf[128]; //全局数组,临界资源//1、创建一个互斥锁 pthread_mutex_t mutex;//定义分支线程 void *task(void *arg) {while(1){//3、获取锁资源pthread_mutex_lock(&mutex);printf("分支线程中&…...

读元宇宙改变一切笔记04_网络化
1. 思想实验 1.1. 如果森林中的一棵树倒下,但周围没有人听到,那它是否会发出声音? 1.1.1. “贝克莱的树” 1.2. 主观唯心主义哲学家乔治贝克莱(George Berkeley)提出的,他认为“存在就是被感知” 1.2.1. 如果有人或有其他事物…...

用Promise实现util函数
有些时候,我们需要依赖于异步的返回结果做一些后续处理,until函数在这种场景下非常有用,你能实现它吗 ? 让我们来试试吧 👇: <script setup langts> import { ref,watch } from "vue"const count ref(0)/*** I…...

使用numpy处理图片——白色背景变全透明
在《使用numpy处理图片——基础操作》一文中,我们通过对所有像素的alpha值做修改,让图片变成半透明。 我们看到本来是黑色的字体也因为半透明的原因变得颜色比较淡。 本文我们将判断每个像素的RGB值。如果是纯白底色,则将该像素的alpha值调…...

计算机网络层之ICMP与IGMP
计算机网络传输层协议有:tcp和udp,这两个接触最多,较为熟悉。除此之外,还有ICMP和IGMP,我们接触较少。 ICMP(Internet Control Message Protocol)和IGMP(Internet Group Management Protocol)是…...

FlinkAPI开发之自定义函数UDF
案例用到的测试数据请参考文章: Flink自定义Source模拟数据流 原文链接:https://blog.csdn.net/m0_52606060/article/details/135436048 概述 用户自定义函数(user-defined function,UDF),即用户可以根据…...

阿里云国际服务器设置安全防护程序
阿里云云服务器(ECS)提供弹性、安全、高性能、高性价比的虚拟云服务器,满足您的所有需求。立即在这里免费注册! 常见 Web 应用程序 请勿对 Web 服务控制台(如 WDCP、TOMCAT、Apache、Nginx、Jekins、PHPMyAdmin、Web…...

C++获取内存使用情况
在程序编程过程中,为了防止出现内存泄漏情况出现,需要持续关注内存程序内存占用情况。如下方式实现获取当前进程内存使用情况: linux: void my_top(string path, bool flag) {if(flag){FILE* read_top fopen("/proc/self/…...

CRMEB多商户短信开发
在使用CRMEB多商户系统的时候,想要二开使用其他平台的短信,这里以阿里云短信为例的具体实现方法。 一、加载阿里云短信的SDK,执行命令:composer require alibabacloud/dysmsapi-20170525 二、增加阿里云短信的驱动 1.在 crmeb\…...

Leetcode 1049 最后一块石头的重量II
题意理解: 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。 思路转化:我们可…...

【设计模式之美】SOLID 原则之二:开闭原则方法论、开闭原则如何取舍
文章目录 一. 如何理解“对扩展开放、修改关闭”?二. 修改代码就意味着违背开闭原则吗?三. 如何做到“对扩展开放、修改关闭”?四. 如何在项目中灵活应用开闭原则? 一. 如何理解“对扩展开放、修改关闭”? 具体的说&a…...

Kafka 基本概念和术语
1、消息 Record:Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。 2、主题 Topic:主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。在Kafka 中发布订阅的对象是 Topic。 3、分区 Partition…...

【每日面试题】Docker常见面试题精选
什么是Docker容器? Docker容器是一种轻量级的虚拟化技术,可以将应用及其依赖项打包在一个可移植的容器中,以便在多个环境中运行。 Docker镜像和容器之间有什么区别? Docker镜像是一个包含了应用程序及其依赖项的只读模板…...

uniapp项目怎么删除顶部导航栏
uniapp去掉顶部导航的方法: 1、去掉所有导航栏 "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "uni-app", "navigationBarBackgroundColor": "#007AFF"…...