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

这篇具有很好参考价值的文章主要介绍了STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

相关说明:

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


说明:

一、LCD上的坐标

如何看这块LCD的坐标?将单片机顺时针旋转90°即可,如下图所示,右下角为原点,Y轴正方向为上,X轴正方向为左
STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)

这个坐标是怎么确定的?

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

X轴

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

Y轴

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

二、高亮显示类型

(下文中的纵向横向均为LCD面向自己的情况)
STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)
高亮显示的类型主要有两种
1.横向选择高亮(数据在同一行,如时间)
2.纵向选择高亮(数据在不同行)

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

三、部分真题要求解析

其中第六届和第九届考的是横向选择高亮
STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)
第七届和第十届考的是纵向选择高亮

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

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

从上面几张图可以看出,数据切换选中都是由按键控制的,所以首先会有一个按键扫描的函数检测按键按下,检测到按键按下修改当前坐标值(纵向:更改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);
	}
}


总结

以上就是全部内容,如有错误请批评指正。文章来源地址https://www.toymoban.com/news/detail-404724.html

到了这里,关于STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32(HAL库)驱动(1.44寸)TFT-LCD彩屏

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成  3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改  3.2.3 lcd.c修改  3.2.4 lcd_inut.c修改  3.3 主函数代码 3.3.1 添加头文件 3.3.2 LCD进行初始化

    2024年02月03日
    浏览(32)
  • stm32 hal库硬件spi(软件spi)驱动1.8寸tft—lcd屏幕

    屏幕是嵌入式开发中的一个重要的部分,cdsn上有许多解释原理的,还有很多是采用正点原子的屏幕来驱动的,对于刚刚入门不久的我们可能没有资金去购买较为昂贵的屏幕。而对于底层原理我们暂时也不必了解的那么深入,能点亮屏幕就是我们最大的快乐。 除了中景园的资

    2024年02月03日
    浏览(41)
  • 蓝桥杯嵌入式基础模块——LCD显示器的基本使用(新板)STM32G431(HAL库开发)

            在蓝桥杯嵌入式官方给我们提供好了,LCD显示的底层源码,我们只需要,记住里面的API函数,会用这些函数就行。         在官方给的资料中找到这个文件名字DK117_G4 Data Packet-开发板驱动文件里面就是所有的底层文件有两种类型,一种是基于HAL库的一种是标准库

    2024年02月09日
    浏览(47)
  • 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

    说明:此篇为学习记录。可能存在错误或者不足。如有问题请指出。 主控芯片:STM32F411CEU6 主控开发板:WeAct STM32F411CEU6最小系统板 TFT-LCD屏幕:合宙1.8寸TFT-LCD,驱动为ST7735s MDK版本:5,32 HAL库版本:1.27.1 STM32CubeMX版本:6.7.0 ST7735s支持8080并口,3线和4线串行接口,模块的驱动方

    2024年02月03日
    浏览(49)
  • 【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示

       不知道大家在开发过程中有没有碰到: LCD与LED同时(宏观上的同时)点亮时产生的LED状态紊乱问题 。 LCD与LED显示冲突现象图   为了解决上述问题,小编给出了以下三种解决方案: 方案一:    每次LCD显示完成数据后,关闭所有LED一次。   但是 使用该方法比较麻烦,

    2023年04月12日
    浏览(41)
  • 基于stm32物联网开发板(2)--LCD屏幕

    LCD应用展示: LCD屏幕应用 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW; 超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕); 宽电压供电(3V~5V),兼容3.3V和5V电平逻辑,无需电平转换芯片; 采用7线制SPI接口; 工作温度范围为工业级(-20℃~60℃); 军工

    2024年02月04日
    浏览(31)
  • 基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)

    在学习STM32的过程中,刚好学到了LCD屏,我使用的是STM32F103ZET6,屏幕是正点原子的。但是在我自己新建工程点亮显示LCD屏时遇到了很多问题。解决之后分享在此,希望能帮助到遇到此困惑的朋友。 想要快速驱动LCD屏请直接跳转到CubeMX配置 FSMC全名叫可变静态存储控制器(Fle

    2024年02月15日
    浏览(47)
  • stm32 ADC 精讲(基于HAL库)

    首先ADC是将模拟量信号转化为数字信号,简单来说就是把一些连续信号转化为 010101。 典型的ADC叫做逐次逼近型ADC,接下来我们来分模块讲解上述电路图 上图所示,是一个 电压比较器,将待测电压Vin输入到比较器的正端上去,当正端电压大于负端电压时,在输出端输出1,反之

    2024年02月14日
    浏览(49)
  • 正点原子STM32(基于HAL库)1

    正点原子B站视频地址:https://www.bilibili.com/video/BV1bv4y1R7dp?p=1vd_source=cc0e43b449de7e8663ca1f89dd5fea7d STM32芯片分类 ST中文社区网:https://www.stmcu.org.cn/ ST官网:https://www.st.com/content/st_com/en.html 了解了STM32 的系列和命名以后,我们再进行STM32 选型就会比较容易了,这里我们只要遵循:由高

    2023年04月23日
    浏览(61)
  • 正点原子STM32(基于HAL库)5

    STM32F103ZET6 自带了64K 字节的RAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,比如做华丽效果的GUI,处理大量数据的应用等,STM32 自带的这些内存就可能不太够用了。好在嵌入式方案提供了扩展芯片RAM 的方法,本章将介绍我们开发板上使用的RAM 拓展方案

    2024年02月08日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包