u8g2 使用IIC驱动uc1617 lcd 字符显示只显示上半部分,不显示下半部

使用u8g2 使用硬件iic驱动某些page为4个字节 带灰度的lcd显示屏幕的时候有时候只显示上半部,下半部不显示,例如uc1617等。

原因:

以uc1617为例,链接https://github.com/olikraus/u8g2/blob/master/csrc/u8x8_d_uc1617.c

在u8x8_d_uc1617_common方法中的case U8X8_MSG_DISPLAY_DRAW_TILE分支

uint8_t u8x8_d_uc1617_common(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{uint8_t x, y, c, a;uint8_t *ptr;switch(msg){case U8X8_MSG_DISPLAY_DRAW_TILE:u8x8_cad_StartTransfer(u8x8);y = ((u8x8_tile_t *)arg_ptr)->y_pos;y*=2;x = ((u8x8_tile_t *)arg_ptr)->x_pos;x *= 8;x += u8x8->x_offset;u8x8_cad_SendCmd(u8x8, 0x060 | (x&15));u8x8_cad_SendCmd(u8x8, 0x070 | (x>>4)); u8x8_cad_SendCmd(u8x8, 0x00 | (y));#ifdef NOT_REQUIREDu8x8_cad_SendCmd(u8x8, 0xf8 );	/* disable window */u8x8_cad_SendCmd(u8x8, 0xf4 );	/* page start */u8x8_cad_SendCmd(u8x8, y );	u8x8_cad_SendCmd(u8x8, 0xf5 );	/* x start */u8x8_cad_SendCmd(u8x8, x );	u8x8_cad_SendCmd(u8x8, 0xf6 );	/* page end */u8x8_cad_SendCmd(u8x8, y );	u8x8_cad_SendCmd(u8x8, 0xf7 );	/* x end */u8x8_cad_SendCmd(u8x8, 127 );	u8x8_cad_SendCmd(u8x8, 0xf9 );	/* enable window  */
#endifa = arg_int;do{c = ((u8x8_tile_t *)arg_ptr)->cnt;ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;do{u8x8_cad_SendData(u8x8, 8, u8x8_convert_tile_for_uc1617_lower4bit(ptr));ptr += 8;x += 8;c--;} while( c > 0 );	a--;} while( a > 0 );x = ((u8x8_tile_t *)arg_ptr)->x_pos;x *= 8;x += u8x8->x_offset;u8x8_cad_SendCmd(u8x8, 0x060 | (x&15));u8x8_cad_SendCmd(u8x8, 0x070 | (x>>4));    u8x8_cad_SendCmd(u8x8, 0x00 | (y+1));a = arg_int;do{c = ((u8x8_tile_t *)arg_ptr)->cnt;ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;do{u8x8_cad_SendData(u8x8, 8, u8x8_convert_tile_for_uc1617_upper4bit(ptr));ptr += 8;x += 8;c--;} while( c > 0 );	a--;} while( a > 0 );u8x8_cad_EndTransfer(u8x8);break;case U8X8_MSG_DISPLAY_SET_POWER_SAVE:if ( arg_int == 0 )u8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_powersave0_seq);elseu8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_powersave1_seq);break;case U8X8_MSG_DISPLAY_SET_FLIP_MODE:if ( arg_int == 0 ){u8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_flip0_seq);u8x8->x_offset = u8x8->display_info->default_x_offset;}else{u8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_flip1_seq);u8x8->x_offset = u8x8->display_info->flipmode_x_offset;}	break;
#ifdef U8X8_WITH_SET_CONTRASTcase U8X8_MSG_DISPLAY_SET_CONTRAST:u8x8_cad_StartTransfer(u8x8);u8x8_cad_SendCmd(u8x8, 0x081 );u8x8_cad_SendArg(u8x8, arg_int  );	/* uc1617 has range from 0 to 255 */u8x8_cad_EndTransfer(u8x8);break;
#endifdefault:return 0;}return 1;
}

在往lcd显示屏写写数据的时候,先用命令写显示地址,再写数据,命令和数据的区别在于iic地址不同,例如写命令使用iic地址0x78,写数据使用iic地址0x79,具体根据不同lcd数据手册iic地址有所不同。上面的分支U8X8_MSG_DISPLAY_DRAW_TILE作用是向lcd先写地址,再写数据,在这个分支中,只有一个u8x8_cad_StartTransfer与u8x8_cad_EndTransfer包含整个方法。

u8x8_cad_EndTransfer用于产生一个iic终止信号,代表操作完成

而在这个方法中,有2个写不同iic地址的行为,但是只产生了一个终止信号,导致可能后半部分无效,所以只显示半面。

解决方案:

添加多个u8x8_cad_StartTransfer与u8x8_cad_EndTransfer。

把对一个地址的操作行为用u8x8_cad_StartTransfer与u8x8_cad_EndTransfer包含起来

例如:

uint8_t u8x8_d_uc1617_common(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{uint8_t x, y, c, a;uint8_t *ptr;switch(msg){case U8X8_MSG_DISPLAY_DRAW_TILE:u8x8_cad_StartTransfer(u8x8);y = ((u8x8_tile_t *)arg_ptr)->y_pos;y*=2;x = ((u8x8_tile_t *)arg_ptr)->x_pos;x *= 8;x += u8x8->x_offset;u8x8_cad_SendCmd(u8x8, 0x060 | (x&15));u8x8_cad_SendCmd(u8x8, 0x070 | (x>>4)); u8x8_cad_SendCmd(u8x8, 0x00 | (y));#ifdef NOT_REQUIREDu8x8_cad_SendCmd(u8x8, 0xf8 );	/* disable window */u8x8_cad_SendCmd(u8x8, 0xf4 );	/* page start */u8x8_cad_SendCmd(u8x8, y );	u8x8_cad_SendCmd(u8x8, 0xf5 );	/* x start */u8x8_cad_SendCmd(u8x8, x );	u8x8_cad_SendCmd(u8x8, 0xf6 );	/* page end */u8x8_cad_SendCmd(u8x8, y );	u8x8_cad_SendCmd(u8x8, 0xf7 );	/* x end */u8x8_cad_SendCmd(u8x8, 127 );	u8x8_cad_SendCmd(u8x8, 0xf9 );	/* enable window  */
#endifa = arg_int;do{c = ((u8x8_tile_t *)arg_ptr)->cnt;ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;do{u8x8_cad_SendData(u8x8, 8, u8x8_convert_tile_for_uc1617_lower4bit(ptr));ptr += 8;x += 8;c--;} while( c > 0 );	a--;} while( a > 0 );
// 下面这2行是添加的
u8x8_cad_EndTransfer(u8x8);
u8x8_cad_StartTransfer(u8x8);x = ((u8x8_tile_t *)arg_ptr)->x_pos;x *= 8;x += u8x8->x_offset;u8x8_cad_SendCmd(u8x8, 0x060 | (x&15));u8x8_cad_SendCmd(u8x8, 0x070 | (x>>4));    u8x8_cad_SendCmd(u8x8, 0x00 | (y+1));a = arg_int;do{c = ((u8x8_tile_t *)arg_ptr)->cnt;ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;do{u8x8_cad_SendData(u8x8, 8, u8x8_convert_tile_for_uc1617_upper4bit(ptr));ptr += 8;x += 8;c--;} while( c > 0 );	a--;} while( a > 0 );u8x8_cad_EndTransfer(u8x8);break;case U8X8_MSG_DISPLAY_SET_POWER_SAVE:if ( arg_int == 0 )u8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_powersave0_seq);elseu8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_powersave1_seq);break;case U8X8_MSG_DISPLAY_SET_FLIP_MODE:if ( arg_int == 0 ){u8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_flip0_seq);u8x8->x_offset = u8x8->display_info->default_x_offset;}else{u8x8_cad_SendSequence(u8x8, u8x8_d_uc1617_flip1_seq);u8x8->x_offset = u8x8->display_info->flipmode_x_offset;}	break;
#ifdef U8X8_WITH_SET_CONTRASTcase U8X8_MSG_DISPLAY_SET_CONTRAST:u8x8_cad_StartTransfer(u8x8);u8x8_cad_SendCmd(u8x8, 0x081 );u8x8_cad_SendArg(u8x8, arg_int  );	/* uc1617 has range from 0 to 255 */u8x8_cad_EndTransfer(u8x8);break;
#endifdefault:return 0;}return 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libmodbus 疑问:对象结构体是如何关联的

1. 主要结构体 结构体 modbus_t : 包含 int slave(从机地址)、timeout、 backend(各种操作); backend_data 等 结构体modbus_backend_t: build_request_basis、set_slave、receive、send、connect 等操作 …

项目监督与控制

1.什么是项目过程度量?其方法有哪些? 项目过程度量是一种对项目执行过程中的活动和性能进行量化测量的方法。它涉及到收集、分析和解释项目数据,以便更好地理解项目的进度、质量和效率。过程度量的目的是提供关于项目健康状况的客观信息&…

爬虫的法律风险是什么?以及合法使用爬虫技术的建议。

爬虫的法律风险是什么? 网络爬虫技术,虽然在数据获取方面具有巨大优势,但其使用过程中可能引发的法律风险也不容忽视。这些风险主要包括违反数据保护法规、侵犯知识产权、构成不正当竞争等。下面将详细探讨网络爬虫的法律风险,并在…

【防火墙策略】实际使用

限制主机仅能从堡垒机登录,并设置开机自动加载防火墙规则。 1、 配置/etc/rc.local新增 /sbin/iptables-restore /etc/sysconfig/iptables 2、授权 chmod x /etc/rc.d/rc.local3、检查/etc/sysconfig/iptables文件是否存在,否则执行 ll /etc/sysconfi…

C/C++ 包管理工具汇总

在C/C中,包管理工具主要用于帮助开发者更方便地管理项目依赖的库和头文件。以下是一些常用的C/C包管理工具: vcpkg:由微软开发,支持Windows、macOS和Linux。vcpkg通过Git仓库维护一个庞大的库集合,可以轻松地安装、卸载…

代码随想录第28天|回溯算法

491. 非递减子序列 思路: 不可以排序, 否则会改变元素的顺序对收获的结果有要求, num.size() > 2, 且 num[i - 1] < num[i]需要进行去重, 不能使用排序后的方法去重每一层可用 unordered_set 去重组合问题, for 遍历需要标记起始位置 bug: 一定要先判断元素是否重复, …

使用CAPL创建系统变量之sysDefineNamespace

目录 0 前言 1 使用CAPL创建系统变量 0 前言 最近在项目中发现可以通过CAPL来创建系统变量&#xff0c;这样方法在一定程度上提高了代码的统一性和测试的便利性。想要加入HIL自动化测试群的小伙伴欢迎评论区留言或私信&#xff0c;让我们一起进步&#xff01; 1 使用CAPL创建…

染发膏粪大肠菌群检测 化妆品毒理学检测 功效测试

染发膏中粪大肠菌群的检测 染发膏中的粪大肠菌群检测是为了确保产品的卫生安全&#xff0c;因为粪大肠菌群通常存在于动物的肠道中&#xff0c;它们的存在可能表明产品受到了外部环境的污染。根据国家标准GB/T 7918.3-1987&#xff0c;对化妆品中粪大肠菌群的检测方法进行了规范…

【html】爱心跳动动画:CSS魔法背后的故事

效果展示&#xff1a; 代码介绍&#xff1a; 爱心跳动动画&#xff1a;CSS魔法背后的故事 在前端开发中&#xff0c;CSS不仅仅是一种用于控制网页样式的工具&#xff0c;它也是一种表达创意和想象力的艺术手段。今天&#xff0c;我要为大家介绍一段使用CSS实现的爱心跳动动画…

【bug】配置SpringCloudAlibaba AI的maven依赖问题

问题描述 尝鲜alibaba的ai模块&#xff0c;maven依赖一直报找不到包&#xff0c;报错如下 Unresolved dependency: org.springframework.ai:spring-ai-core:jar:0.8.1原因分析&#xff1a; 由于是按照官方文档配置的&#xff0c;所以检查了很多遍maven配置&#xff0c;加上去…

408上岸关键正确的四门课复习顺序

我个人认为最舒服的学习408的顺序是&#xff1a; 数据结构&#xff0c;操作系统&#xff0c;计算机组成原理&#xff0c;计算机网络 下面我来说说为什么要这么安排复习&#xff1a; 因为首先数据结构是基础&#xff0c;学好数据结构有利于理解操作系统中的一些算法&#xff0c;…

函数模板与类模板深入解析及实例

目录 函数模板 类模板 类模板成员函数的实例化 类模板的静态成员 全局特化与成员特化 缺省模板参数与数值形式的模板参数 结论 函数模板 函数模板允许我们编写适用于多种数据类型的通用函数。以下是函数模板的定义和使用示例&#xff1a; template <typename T>…

【Docker】——安装镜像和创建容器,详解镜像和Dockerfile

前言 在此记录一下docker的镜像和容器的相关注意事项 前提条件&#xff1a;已安装Docker、显卡驱动等基础配置 1. 安装镜像 网上有太多的教程&#xff0c;但是都没说如何下载官方的镜像&#xff0c;在这里记录一下&#xff0c;使用docker安装官方的镜像 Docker Hub的官方链…

mke2fs -- 比mkfs.ext4艺术成分更高

mke2fs 介绍 mke2fs 是一个用于创建 ext2/ext3/ext4 文件系统的工具&#xff0c;是 mkfs.ext2, mkfs.ext3, mkfs.ext4 的底层工具。它提供了丰富的选项和参数&#xff0c;可以对文件系统进行详细的配置和优化。下面是 mke2fs 的详细讲解&#xff0c;包括其主要功能、常用选项及…

如何在MobaXterm上创建以及删除自己的用户和目录?

一、创建用户的两种命令 adduser和useradd命令在Linux系统中用于创建新的用户账户&#xff0c;但它们之间存在一些关键的区别&#xff0c;主要涉及它们的交互性和默认行为&#xff1a; sudo adduser newuser sudo useradd newuser 交互性: adduser: 这个命令通常提供更多的…

内外网映射访问内网服务器

如果本地有公网ip&#xff0c;比如连接的宽带有公网ip&#xff0c;可以直接通过路由配置转发就行了&#xff0c;如果本地没有公网ip&#xff0c;那就需要通过下面这种方式来访问内网服务器了。 1&#xff1a;首先内网服务器需要连接外网&#xff0c;可以通过网线或者WiFi都可以…

小林图解系统-二.硬件结构 2.4CPU缓存一致性

CPU Cache的数据写入 CPU和内存的访问性能越差越大&#xff0c;于是在CPU内部嵌入CPU Cache(高速缓存)。 CPU Cache由Cache Line组成&#xff0c;Cache Line由头标志Tag数据块Data Block组成。 如果数据写入Cache&#xff0c;内存和Cache相对应的数据将不同&#xff0c;需要…

Redis-五种数据结构之列表(ziplist、quicklist)

列表 文章目录 列表压缩列表-ziplistziplist 定义级联更新 快速列表-quicklistquicklistNode 定义quicklist 定义quicklist常用操作其他操作quicklist 相对于普通链表优点quick应用场景在redis 中使用quicklist 列表数据类型可以存储一组按插入顺序排序的字符串&#xff0c;他很…

昇思大模型学习·第一天

mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…

Linux搭建Minio单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Linux搭建Minio单机环境 ⏱️ 创作时间&#xff1a; 2024年06月19日 目…