STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)

2023-05-16

文章目录

  • 前言
  • 一、LCD上的坐标
    • 这个坐标是怎么确定的?
      • X轴
      • Y轴
  • 二、高亮显示类型
  • 三、部分真题要求解析
  • 四、如何高亮显示选中数据
  • 五、代码分析
  • 总结


前言

相关说明:

开发板:CT117E-M4(STM32G431RB 蓝桥杯嵌入式比赛板)
开发环境: CubeMX+Keil5
第六届到第十二届省赛题中,高亮显示考察了四次,分别是第六、七、九、十届,第十一届和第十二届没有考察,今年考察几率仍然较大。


说明:

一、LCD上的坐标

如何看这块LCD的坐标?将单片机顺时针旋转90°即可,如下图所示,右下角为原点,Y轴正方向为上,X轴正方向为左
在这里插入图片描述

这个坐标是怎么确定的?

(有点啰嗦,不关心可以直接跳过这一部分……)

X轴

我是从代码分析的,如高亮显示的这行代码,实现的功能是在第0行显示空格字符串。
在这里插入图片描述点F12进函数内部看一下,注意高亮显示的代码,继续F12。
在这里插入图片描述
继续F12。
在这里插入图片描述到这里可以看到上图传递过来的第一个参数是Line(行),到下面就成了Xpos(X轴坐标),这就说明行改变时X坐标也改变,X坐标控制行显示
在这里插入图片描述X轴正方向是如何确定的呢,在函数调用时我们有用到Line0~Line9。
在这里插入图片描述鼠标点到Line0,F12一下。可以看到从Line0到Line9,值是依次增大24的,这就说明X轴坐标正方向是向左的,且一个字符的高度为24
在这里插入图片描述

Y轴

还是这行代码,F12进去。
在这里插入图片描述这里面有个变量refcolumn,根据上面几张图片可以知道这个变量作为参数传递,到最后会成为Ypos(Y轴坐标)。ptr是字符串指针,每次循环ptr都会自增1(指向下一个字符),所以行显示函数内部其实就是一个一个字符从左到右显示出来(LCD面向自己),并且可以确定Y坐标控制列显示
在这里插入图片描述
Y轴正方向是如何确定的呢,看refcolumn值的变化,从左到右显示时,refcolumn每次自减16,所以可以得出Y轴正方向是向上的,并且每个字符宽度为16
在这里插入图片描述

二、高亮显示类型

(下文中的纵向横向均为LCD面向自己的情况)
在这里插入图片描述
高亮显示的类型主要有两种
1.横向选择高亮(数据在同一行,如时间)
2.纵向选择高亮(数据在不同行)

这两种高亮显示都是根据坐标来操作的,纵向选择高亮则改变X坐标,横向选择高亮则改变Y坐标,注意每个字符高度为24,宽度为16,从上到下X坐标递增(Line0~Line9),从左到右Y坐标递减(320 ~ 0)。

三、部分真题要求解析

其中第六届和第九届考的是横向选择高亮
在这里插入图片描述在这里插入图片描述
第七届和第十届考的是纵向选择高亮

在这里插入图片描述在这里插入图片描述

四、如何高亮显示选中数据

从上面几张图可以看出,数据切换选中都是由按键控制的,所以首先会有一个按键扫描的函数检测按键按下,检测到按键按下修改当前坐标值(纵向:更改X坐标;横向:更改Y坐标),再根据当前坐标值对选中数据高亮(选中高亮),上一数据恢复即可(恢复显示),选中高亮和恢复显示都是LCD更新操作。

其中LCD更新显示可以分为四个步骤

假如原来的颜色配置为白底蓝字。

LCD_SetBackColor(White);//原色为白底蓝字
LCD_SetTextColor(Blue);

1.修改颜色
即修改LCD接下来显示内容的背景色和字体色,这里高亮的颜色只是进行了颜色反转,从白底蓝字变为蓝底白字。

/* 颜色高亮 */
LCD_SetBackColor(Blue);//颜色翻转(高亮)
LCD_SetTextColor(White);

2.重新显示选中数据
修改了颜色之后重新显示选中数据即可实现选中高亮。

3.恢复颜色
恢复颜色就是将LCD显示颜色更改回原本的背景色和字体色。

/* 颜色恢复 */
LCD_SetBackColor(White);//原色为白底蓝字
LCD_SetTextColor(Blue);

4.重新显示上一数据
选中数据改变后,上一数据要恢复颜色。
特殊情况:纵向选择高亮时,第一行高亮显示后,要恢复显示是最后一行;横向选择高亮时,第一个数据高亮显示后,要恢复显示是最后一个数据。

五、代码分析

综合上述四点,再具体从代码分析一下,如纵向选中高亮代码(第七届)

const uint8_t line_step=24*2;  //数据间的间隔为两行,line_now加line_step即为下一数据对应的坐标
const uint8_t line_beg=Line4;  //起始行为第四行
const uint8_t line_end=Line8;  //末尾行为第八行
uint8_t line_now=line_beg;	   //当前行对应坐标

void Line_change()//LCD更新显示
{
	char str1[30];//用于存储当前行显示数据
	char str2[30];//用于存储上一行显示数据
	switch(line_now)//用switch判断当前是哪一行数据
	{
		case line_beg+0*line_step: //当前行坐标(X坐标)为第一数据坐标
			sprintf(str1,"  Threshold 1:%dcm  ",Threshold_1);//当前行
			sprintf(str2,"  Threshold 3:%dcm  ",Threshold_3);//上一行
			break;
		
		case line_beg+1*line_step: //当前行坐标为第二数据坐标
			sprintf(str1,"  Threshold 2:%dcm  ",Threshold_2);
			sprintf(str2,"  Threshold 1:%dcm  ",Threshold_1);
			break;

		case line_beg+2*line_step: //当前行坐标为第三数据坐标
			sprintf(str1,"  Threshold 3:%dcm  ",Threshold_3);
			sprintf(str2,"  Threshold 2:%dcm  ",Threshold_2);
			break;
	}
	
	/*高亮显示*/
	LCD_SetBackColor(White);//颜色反转
	LCD_SetTextColor(Black);
	LCD_DisplayStringLine(line_now,(unsigned char*)str1);//当前行高亮
	
	/*恢复显示*/
	LCD_SetBackColor(Black);//颜色换回来
	LCD_SetTextColor(White);
	if(line_now==line_beg)//第一行的上一行为最后一行
		LCD_DisplayStringLine(line_end,(unsigned char*)str2);//上一行恢复
	else
		LCD_DisplayStringLine(line_now-line_step,(unsigned char*)str2);	
}

横向选中高亮代码(第六届)
横向选中高亮要用到LCD_DisplayChar函数(只更新一行中的某几列显示),调用该函数后就会在传递进去的坐标上显示相应的字符。注意函数第一个参数为X坐标(行号),第二个参数为Y坐标第三个参数为要显示字符的ASCII码,所以要显示数字的话就得在数字的基础上+48,即为该数字对应的ASCII码

const uint16_t Ypos_end=8*16;	//初始Y坐标 对应时间第一位数据
const uint16_t Ypos_beg=14*16;	//末尾Y坐标 对应时间最后一位数据
const uint8_t Ypos_step=16;		//每个字符间Y坐标差值		
uint16_t Ypos_now=14*16;		//当前Y坐标 初始为第一位数据

const uint8_t hour=Ypos_beg-0*Ypos_step;//小时十位对应Y坐标 数据间间隔三个单位长度 如10:20:00 数字1和数字2的Y坐标差值为16*3
const uint8_t min=Ypos_beg-3*Ypos_step;	//分钟十位对应Y坐标 注意是减
const uint8_t sec=Ypos_beg-6*Ypos_step;	//秒十位对应Y坐标

void Sel_change(uint16_t Ypos)//切换选择 参数为当前Y坐标
{
	char dex1;//当前数据在数组中的下标 小时--0  分钟--1  秒--2
	char dex2;//上一数据在数组中的下标
	switch(Ypos)//用switch判断当前Y坐标值
	{
		case hour://当前Y坐标值为小时对应的Y坐标值
			dex1=0; //当前数据下标为0 下同
			dex2=2;//上一数据下标为2
			break;
		
		case min://当前Y坐标值为分钟对应的Y坐标值
			dex1=1; 
			dex2=0;
			break;
		
		case sec://当前Y坐标值为秒对应的Y坐标值
			dex1=2; 
			dex2=1;
			break;
	}
	
	/*选中高亮*/
	LCD_SetBackColor(Blue);//颜色反转
	LCD_SetTextColor(White);
	LCD_DisplayChar(Line6,Ypos-0*Ypos_step,T[dex1]/10+48);//这里要注意函数第一个参数为X坐标(行号),第二个参数为Y坐标,第三个参数为要显示字符的ASCII码,所以要显示数字的话就得在数字的基础上+48,即为该数字对应的ASCII码
	LCD_DisplayChar(Line6,Ypos-1*Ypos_step,T[dex1]%10+48);//T[dex1]存储的是小时的数据,T[dex1]/10就是小时的十位,T[dex1]%10就是小时的个位,再将两个数字显示在相邻的列,下同。
	
	/*恢复显示*/
	LCD_SetBackColor(White);//颜色改回来
	LCD_SetTextColor(Blue);
	if(Ypos==Ypos_beg)//如果当前为小时 则上一个数据为秒
	{
		LCD_DisplayChar(Line6,Ypos-6*Ypos_step,T[dex2]/10+48);
		LCD_DisplayChar(Line6,Ypos-7*Ypos_step,T[dex2]%10+48);
	}
	else
	{
		LCD_DisplayChar(Line6,Ypos+3*Ypos_step,T[dex2]/10+48);
		LCD_DisplayChar(Line6,Ypos+2*Ypos_step,T[dex2]%10+48);
	}
}


总结

以上就是全部内容,如有错误请批评指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示) 的相关文章

  • f103 hal库中PWM的使用方法

    1 初始化复用管脚 span class token keyword void span span class token function BEEP Init span span class token punctuation span
  • Android 音频开发——Hal服务版本(五)

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp 上一篇内容到 BroadcastRadioService 调用 openTuner 开启广播时调用不通的 Hal 服务 这一篇来看一下 两个服务的代码 nbsp Broa
  • 【HAL库-STM】智能温控按键小风扇【胎教级教学】

    嗨害嗨 xff01 失踪人口回来了 xff01 吐血五天实现小成品 xff08 能力有限 呃呃呃呃呃 xff09 那么回归正题 xff0c 这次是智能温控小风扇我在这个基础上又加了一个按键控制功能 xff0c 当人在的风扇面前时可以自行控制
  • AOSP添加新硬件设备开发-HAL层

    此篇文章接上一篇hidl 我们来实现hal层 hal层官方解释系统硬件抽象层 xff0c 理解为kernel的代理层 xff0c 他的存在屏蔽了不同硬件设备的差异 xff0c 根据提供的访问标准 xff0c 就可以对不同的硬件进行操作 xf
  • STM32按键外部中断控制LED流水灯-HAL库

    续上一篇 基于HAL库的32流水灯 http t csdn cn 30QT4 一 硬件选用上 xff0c 我们增加一个四角按键 二 原理图设计 xff0c 上也增加一个开关 LED0 LED2 gt PA0 PA2引脚 KEY1 gt PA
  • Stm32下环境传感器-Stlm75-hts221-spg30(Hal)

    Stm32下环境传感器 Stlm75 hts221 spg30 xff08 Hal xff09 简介IIC驱动接口Stlm75hts221Spg30 简介 Stlm75与Hts221都是ST的传感器 xff0c 有官方例程 xff0c 我只
  • CAN通信知识梳理及在Stm32上的应用(HAL库)

    文章目录 一 CAN通信简介二 硬件连接三 CAN总线上的电平信号四 CAN帧的种类 xff08 1 xff09 遥控帧 xff08 2 xff09 数据帧 五 CAN的仲裁方法六 CAN在Stm32上的应用 xff08 1 xff09 C
  • STM32 之 HAL库

    1 STM32的三种开发方式 通常新手在入门STM32的时候 xff0c 首先都要先选择一种要用的开发方式 xff0c 不同的开发方式会导致你编程的架构是完全不一样的 一般大多数都会选用标准库和HAL库 xff0c 而极少部分人会通过直接配
  • stm32F4 hal库之CAN通信的实现

    本文的目的是为了能够实现功能 xff0c 故写的时候比较简略 参考资料 xff1a https blog csdn net u012308586 article details 81001102 正点原子开发手册 目标 xff1a 通过ca
  • STM32输出SPWM波,HAL库,cubeMX配置,滤波后输出1KHz正弦波

    SPWM波 对于功率方向 输出SPWM波是必须要掌握的 工程 stm32生成spwm代码Keil工程链接资源 引用spwm波定义 PWM波形就是指占空比可变的波形 SPWM波形是指脉冲宽度按正弦规律变化且和正弦波等效的PWM波形 两者的区别
  • stm32的HAL库i2c从机实现

    stm32的i2c默认就是slave模式 xff0c 本文基于HAL库实现中断方式的接收和发送 xff0c 首先是初始化gpio和i2c xff0c 代码如下 xff1a I2C HandleTypeDef I2cHandle void H
  • stm32 hal iwip EchoClient demo 使用

    tcp echoclient c span class token comment 64 file LwIP LwIP TCP Echo Client Src tcp echoclient c 64 author MCD Applicati
  • 使用HAL库开发STM32:系统时间基础及进阶使用

    文章目录 目的 基础使用 进阶使用 总结 目的 HAL库默认提供了系统时间 系统时间默认情况下由SysTick定时器计数产生 系统时间一方面用于HAL库自身调用 另一方面用户也可以使用 为开发带来便利 本文提到的相关使用主要应用于未使用OS
  • HAL库学习笔记-11 I2C

    目录 前言 一 I2C协议简介 I2C物理层 I2C协议层 1 基本读写过程 2 通讯的起始和停止信号 3 数据有效性 4 地址及数据方向 5 应答信号 二 STM32的I2C特性及架构 STM32 I2C架构解析 1 逻辑引脚 2 时钟控
  • Android架构分析之硬件抽象层(HAL)

    一 分析HAL module 架构 Android硬件抽象层有三个核心数据结构 分别是hw module t hw module methods t hw device t 定义在hardware libhardware include h
  • [STM32系列]一、HAL库的串口中断接收

    STM32系列 一 HAL库的串口中断任意长度接收 1 前言 2 回调函数 3 HAL库中断接收函数使用 1 前言 HAL即硬件抽象层 英语 Hardware Abstraction Layer 实现了不同硬件的统一接口操作 这就极大的简化
  • STM32 HAL库更改中断向量表的偏移地址

    以STM32F767为例 打开system stm32f7xx c文件 定位VECT TAB OFFSET 更改此宏定义的值 即可更改偏移量
  • CUBEMX+HAL库实现STM32串口(不定长度)收发

    CUBEMX HAL库实现STM32串口接收 不定长度 并发送 首先新建一个CUBEMX工程 选择你自己开发板的芯片型号 设置时钟和串口 设置时钟为72MHZ 设置串口中断 点击小齿轮生成KEIL5的工程 设置工程名称及存放位置 点击Ope
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false

随机推荐

  • C++ STL 移动一个vector的元素到另一个vector

    1 背景 有的时候 xff0c 我们需要提取某个现有的vector中的元素到另一个vector中 xff0c 或者对多维的vector进行纬度的转换 在这种场景下 xff0c 往往原始的vector中的数据可能并不需要了 xff0c 为了节
  • Qt/C++ 临时屏蔽控件信号(signal)的实用方法

    1 背景 在使用Qt的控件时 xff0c 我们大概率会使用Qt的信号与槽 xff08 signal slot xff09 的机制来实现自己的UI交互逻辑 由于Qt内置控件的信号种类是有限的 xff0c 我们常常会遇到如下窘境 xff1a 以
  • FreeRTOS学习-队列管理

    1 简介 在FreeRTOS中 xff0c 提供了多种任务间通讯的机制 xff0c 包括消息队列 信号量和互斥锁 事件组 任务通知 xff0c 他们的总体特征如下图所示 xff1a 从图中可以看出 xff0c 消息队列 信号量和互斥锁 事件
  • Qt/C++ 如何删除QListWidget的指定项

    1 简介 QListWidget是Qt中 xff0c 用于展示列表类型数据的常用控件 它提供了一个类似于QListView的列表视图 xff0c 但是具有用于添加和删除项的接口 QListWidget使用一个内部模型来管理列表中的每个QLi
  • C++ std::result_of/std::invoke_result的简明指南

    1 简介 在C 43 43 中 xff0c 有时我们需要获取函数或可调用对象的返回值类型 xff0c 以便进行后续的操作 xff0c 在泛型编程中很常用 xff0c 特别是当不同的参数集的结果类型不同时 在早期的C 43 43 版本中 xf
  • FreeRTOS学习-任务通知(Task Notification)

    1 简介 任务通知本质上就是一种进程间通信机制 之前的文章介绍的消息队列 事件组 信号量等都是一种间接的通信方式 xff0c 而任务通知则是更加直接的方式 xff0c 允许两个任务 xff08 或中断和任务 xff09 之间直接通信 2 任
  • 异常行为分析模型设计

    本文针对异常访问现状及问题进行简要描述 xff0c 在此基础上提出基于一元线性回归的最小二乘法异常访问分析模型 xff0c 通过该模型解决了异常访问中时间与访问间相关性问题 异常访问是指网络行为偏离正常范围的访问情况 异常访问包含多种场景
  • 无人机PX4学习(1)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a https docs px4 io master en Basic concepts Drone an unmanned 34 robotic 34 vehicle that ca
  • 无人机PX4学习(2)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a https docs px4 io master en getting started flight controller selection html Flight Contro
  • 无人机PX4学习(3)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a PX4 Flight Modes Overview PX4 User Guide Flight Mode Section RC或GCS上可以切换飞行模式 xff0c 但有些模式有限
  • 两篇论文入坑AIOps异常检测

    AIOps简介 以下部分内容来源于清华大学裴丹教授发表在 中国计算机学会通讯 第13卷第12期的专栏 基于机器学习的智能运维 我们都知道 xff0c 当代社会生活中的大型软硬件系统为了确保能够安全 可靠地运行 xff0c 需要有专业的运维人
  • python代码,两个4*4旋转矩阵之间的位姿变化,相对旋转矩阵

    python代码 xff0c 两个4 4旋转矩阵之间的位姿变化 xff0c 也就是求两个旋转矩阵之间的相对旋转矩阵 import numpy as np def get transform matrix rot mat1 rot mat2
  • crazyS中给firefly飞机添加两个相机

    firefly飞机中原本只有一个相机 xff0c 由于项目需要一个飞机去识别前方两架飞机 xff0c 因此需要增加一个相机 在rotors descriptioin gt urdf gt mav with vi sensor中可以看到此处
  • gitee(码云)和gitHub的区别

    1 gitee与gitHub概念 xff1f Gitee xff08 码云 xff09 是开源中国社区推出的代码托管协作开发平台 xff0c 支持Git和SVN xff0c 提供免费的私有仓库托管 Gitee专为开发者提供稳定 高效 安全的
  • 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    郭孟琦 43 原创作品转载请注明出处 43 Linux内核分析 MOOC课程http mooc study 163 com course USTC 1000029000 首先我选择的系统调用是122号系统调用 uname 简单的介绍一下un
  • 局域网共享文件夹加密(100%成功版本)

    文章目录 一 创建新用户1 右键此电脑选择管理2 点击本地用户和组3 点击用户A 右键空白区域选择创建新用户B 设置用户名和密码C 取消勾选用户下次登录时须更改密码D 勾选用户不能更改密码和密码永不过期 二 创建共享文件夹1 创建一个新文件
  • STM32PWM--基于HAL库(第十三届蓝桥杯嵌入式模拟题)

    文章目录 前言一 CubeMX配置 第十三届模拟题完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 配置模式3 LCD显示4 频率检测 TIM2输入捕获中断函数 5 PWM输出 TIM3 6 Ma
  • STM32综合-基于HAL库(第十二届蓝桥杯嵌入式省赛)

    文章目录 前言一 CubeMX配置 第十二届省赛完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 串口接收中断 定时器中断 接收 3 数据解析4 判定数据正误5 数据更新6 结算7 Main函数
  • STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)

    文章目录 前言一 CubeMX配置 RTC相关 1 使能RTC xff1a 2 进制配置 xff1a 3 初始时间配置 xff1a 4 日期配置 5 闹钟配置 二 代码1 获取时间2 设置闹钟3 闹钟中断函数 三 实验结果总结 前言 相关说
  • STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)

    文章目录 前言一 LCD上的坐标这个坐标是怎么确定的 xff1f X轴Y轴 二 高亮显示类型三 部分真题要求解析四 如何高亮显示选中数据五 代码分析总结 前言 相关说明 xff1a 开发板 xff1a CT117E M4 STM32G431