STM32——LCD

news2025/1/26 21:10:24

一、引脚配置

查看引脚

将上述引脚都设置为GPIO_Output

二、导入驱动文件

将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。

当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。

三、LCD函数

void LCD_Clear(u16 Color);
功能:清屏,设置整个屏幕颜色
void LCD_SetTextColor(vu16 Color);
功能:设置文本颜色
void LCD_SetBackColor(vu16 Color);
功能:设置文本背景色
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
功能:在指定行显示字符串
参数:Line 行号,共10行  Line0-Line9
   ptr 要显示的字符串,长度为20

案例:记录4个按键按下的次数,并在LCD显示

//main.h
/* USER CODE BEGIN EFP */
void Key_Proc(void);
void Lcd_Proc(void);
/* USER CODE END EFP */

//main.c
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */

/* USER CODE BEGIN PV */
uint8_t key_val,key_up,key_down,key_old;
uint8_t B1_count,B2_count,B3_count,B4_count;
char buf[21];
/* USER CODE END PV */

int main(){
  /* USER CODE BEGIN 2 */
  LCD_Init();
  /* USER CODE END 2 */

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Key_Proc();
    Lcd_Proc();
  }
  /* USER CODE END 3 */
}

void Key_Proc(void){
 key_val=Key_Scan();
 key_down = key_val & (key_val^key_old);
 key_up = ~key_val & (key_val^key_old);
 key_old=key_val;
 
 if(key_down==1){
  B1_count++;
 }
 if(key_down==2){
  B2_count++;
 }
 if(key_down==3){
  B3_count++;
 }
 if(key_down==4){
  B4_count++;
 }
}

void Lcd_Proc(void)
{
 sprintf(buf,"B1_Count:%d",B1_count);
 LCD_DisplayStringLine(Line1,(uint8_t*)buf);
 sprintf(buf,"B2_Count:%d",B2_count);
 LCD_DisplayStringLine(Line2,(uint8_t*)buf);
 sprintf(buf,"B3_Count:%d",B3_count);
 LCD_DisplayStringLine(Line3,(uint8_t*)buf);
 sprintf(buf,"B4_Count:%d",B4_count);
 LCD_DisplayStringLine(Line4,(uint8_t*)buf);
}

四、界面切换

可以设置一个变量 led_page 来记录当前的界面。按键按下时修改界面。

案例:做三个界面,B1来切换界面,第一个界面显示 Hello World! 第二个界面显示3个按键按下的次数, 第三个界面显示 page_3 。

在上一小节的代码进行改动:

void Key_Proc(void){
 key_val=Key_Scan();
 key_down = key_val & (key_val^key_old);
 key_up = ~key_val & (key_val^key_old);
 key_old=key_val;
 
 if(key_down==1){
  //切屏其实就是刷屏然后再写入
  LCD_Clear(Black);
  //先判断,再自加
  if(++lcd_page==3) 
    lcd_page=0;
 }
 if(key_down==2){
  B2_count++;
 }
}

void Lcd_Proc(void)
{
  if(lcd_page==0){
    LCD_DisplayStringLine(Line4,(uint8_t*)"     Hello World     ");
  }
  if(lcd_page==1){
    sprintf(buf,"B2_Count:%d",B2_count);
    LCD_DisplayStringLine(Line1,(uint8_t*)buf);
  }
  if(lcd_page==2){
    LCD_DisplayStringLine(Line4,(uint8_t*)"       page_3        ");
  }
}

上面代码有点小问题:如果在page_1的时候就点B2的话,切屏后显示的值为开始点B2的此时了。

五、高亮显示

案例1:修改上一个案例的第二个界面( lcd_page==1 ),设置三行,每行各对应一个计数值。

B2按键切换三个计数值,被选中的高亮。

B3按键修改被选中的计数值,令其加1。

void Key_Proc(void){
 key_val=Key_Scan();
 key_down = key_val & (key_val^key_old);
 key_up = ~key_val & (key_val^key_old);
 key_old=key_val;
 
 if(key_down==1){
  LCD_Clear(Black);
  if(++lcd_page==3) 
    lcd_page=0;
 }
 if(key_down==2 && lcd_page==1){    //切换需要计数的line
  if(++line_flag==3)
    line_flag=0;
 }
 if(key_down==3 && lcd_page==1){    //对指定的line进行计数
  if(line_flag==0){
    count1++;
  }
  if(line_flag==1){
    count2++;
  }
  if(line_flag==2){
    count3++;
  }
 }
}

void Lcd_Proc(void)
{
  if(lcd_page==0){
    LCD_DisplayStringLine(Line4,(uint8_t*)"     Hello World     ");
  }
  if(lcd_page==1){    //选中为绿,否则为白,并把计数显示
    if(line_flag==0)
      LCD_SetBackColor(Green);
    else
      LCD_SetBackColor(White);
      sprintf(buf,"       cout1:%03d      ",count1);
    LCD_DisplayStringLine(Line3,(uint8_t*)buf);

    if(line_flag==1)
      LCD_SetBackColor(Green);
    else
      LCD_SetBackColor(White);
        sprintf(buf,"       cout2:%03d      ",count2);
      LCD_DisplayStringLine(Line4,(uint8_t*)buf);

    if(line_flag==2)
      LCD_SetBackColor(Green);
    else
      LCD_SetBackColor(White);
        sprintf(buf,"       cout3:%03d      ",count3);
      LCD_DisplayStringLine(Line5,(uint8_t*)buf);
    }
  if(lcd_page==2){
    LCD_DisplayStringLine(Line4,(uint8_t*)"       page_3        ");
  }
}

 

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

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

相关文章

操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之内存的划分

前言 MMU:内存管理单元(Memory Management Unit)完成的工作就是虚拟地址到物理地址的转换,可以让系统中的多个程序跑在自己独立的虚拟地址空间中,相互不会影响。程序可以对底层的物理内存一无所知,物理地址可以是不连续的&#x…

.NET MAUI进行UDP通信(二)

上篇文章有写过一个简单的demo&#xff0c;本次对项目进行进一步的扩展&#xff0c;添加tabbar功能。 1.修改AppShell.xaml文件&#xff0c;如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <Shellx:Class"mauiDemo.AppShel…

社区养老服务平台的设计与实现(代码+数据库+LW)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

生信软件管家——conda vs pip

pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…

项目文章 | PNAS 斑马鱼转录因子ChIP-seq助力解析GATA6突变相关的肝脏疾病机制

近日&#xff0c;西南大学阮华/黄红辉团队联合重庆大学邱菊辉/王贵学团队在PNAS发表了题为“An animal model recapitulates human hepatic diseases associated with GATA6 mutations”的研究论文。该研究构建了一个gata6敲除斑马鱼模型&#xff0c;它重现了gata6突变患者的大…

iOS 权限管理:同时请求相机和麦克风权限的最佳实践

引言 在开发视频类应用时&#xff0c;我们常常会遇到需要同时请求相机和麦克风权限的场景。比如&#xff0c;在用户发布视频动态时&#xff0c;相机用于捕捉画面&#xff0c;麦克风用于录制声音&#xff1b;又或者在直播功能中&#xff0c;只有获得这两项权限&#xff0c;用户…

【深入理解FFMPEG】命令行阅读笔记

这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…

数据结构:二叉树—面试题(二)

1、二叉树的最近公共祖先 习题链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点…

【C++高并发服务器WebServer】-6:信号

本文目录 信号的概念1.1 core文件1.2 kill命令1.3 alarm函数1.4 setitimer调用1.5 signal捕捉信号1.6 信号集1.7 内核实现信号捕捉的过程1.8 sigaction1.9 sigchld 信号的概念 信号是 Linux 进程间通信的最古老的方式之一&#xff0c;是事件发生时对进程的通知机制&#xff0c…

【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

【PyTorch】3.张量类型转换

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…

不解释快上车

聊一聊 最近有小伙伴问我有小红书图片和短视频下载的软件吗&#xff0c;我心想&#xff0c;下载那上面的图片和视频做什么&#xff1f;也许是自己没有这方面的需求&#xff0c;不了解。 不过话又说回来&#xff0c;有些很多下载器可能作者没有持续的维护&#xff0c;所以可能…

C++红黑树详解

文章目录 红黑树概念规则为什么最长路径不超过最短路径的二倍&#xff1f;红黑树的时间复杂度红黑树的结构插入叔叔节点情况的讨论只变色(叔叔存在且为红)抽象的情况变色单旋&#xff08;叔叔不存在或叔叔存在且为黑&#xff09;变色双旋&#xff08;叔叔不存在或叔叔存在且为黑…

csapp2.4节——浮点数

目录 二进制小数 十进制小数转二进制小数 IEEE浮点表示 规格化表示 非规格化表示 特殊值 舍入 浮点运算 二进制小数 类比十进制中的小数&#xff0c;可定义出二进制小数 例如1010.0101 小数点后的权重从-1开始递减。 十进制小数转二进制小数 整数部分使用辗转相除…

神经网络|(一)加权平均法,感知机和神经元

【1】引言 从这篇文章开始&#xff0c;将记述对神经网络知识的探索。相关文章都是学习过程中的感悟和理解&#xff0c;如有雷同或者南辕北辙的表述&#xff0c;请大家多多包涵。 【2】加权平均法 在数学课本和数理统计课本中&#xff0c;我们总会遇到求一组数据平均值的做法…

Spring 框架:配置缓存管理器、注解参数与过期时间

在 Spring 框架中&#xff0c;可通过多种方式配置缓存具体行为&#xff0c;常见配置方法如下。 1. 缓存管理器&#xff08;CacheManager&#xff09;配置 基于内存的缓存管理器配置&#xff08;以SimpleCacheManager为例&#xff09; SimpleCacheManager 是 Spring 提供的简单…

FPGA实现任意角度视频旋转(完结)视频任意角度旋转实现

本文主要介绍如何基于FPGA实现视频的任意角度旋转&#xff0c;关于视频180度实时旋转、90/270度视频无裁剪旋转&#xff0c;请见本专栏前面的文章&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转…

openlayer getLayerById 根据id获取layer图层

背景&#xff1a; 在项目中使用getLayerById获取图层&#xff0c;这个getLayerById()方法不是openlayer官方文档自带的&#xff0c;而是自己封装的一个方法&#xff0c;这个封装的方法的思路是&#xff1a;遍历所有的layer&#xff0c;根据唯一标识【可能是id&#xff0c;也可能…

设计模式-建造者模式、原型模式

目录 建造者模式 定义 类图 优缺点 角色 建造者模式和工厂模式比较 使用案例 原型模式 定义 类图 优缺点 应用场景 应用类型 浅克隆 深克隆 建造者模式 定义 将一个复杂的对象的构造与它的表示分离&#xff0c;使同样的构建过程可以创建不同的表示&#xff0c;…

PTMD2.0-疾病相关的翻译后修饰数据库

翻译后修饰&#xff08;PTMs&#xff0c;post-translational modifications&#xff09;通过调节蛋白质功能参与了几乎所有的生物学过程&#xff0c;而 PTMs 的异常状态常常与人类疾病相关。在此&#xff0c;PTMD 2.0展示与疾病相关的 PTMs 综合数据库&#xff0c;其中包含 93 …