蓝桥杯第十六届嵌入式模拟编程题解析

由硬件框图可以知道我们要配置LED 和按键

LED

先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题

按键

按键配置,由原理图按键所对引脚要GPIO_Input

生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lcd.c、lcd.h、fonts.h添加到code中,然后去写按键控制灯亮灭的程序,看是否有问题

按键控制led没有问题后写lcd显示代码,显示没问题后,解决lcd与led引脚冲突问题,方法在我的其他文章中

  HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_RESET ); //为解决引脚冲突初始化lcd时    LCD_Init ();                                                                                                  要将锁存器锁存器来;
  LCD_Clear (Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);

LCD显示函数

void lcd_show(void)
{
    sprintf(text,"      hello world");
    LCD_DisplayStringLine (Line0 ,(uint8_t *)text);
}

eeprom

用到eeprom就要用到IIC通信协议就要去资源包中将IIC_hal.c   IIC_hal.h添加进来

然后再main中方初始化IIC

然后写eeprom读和写的函数,用lcd显示测试功能是否好用,没有问题就开始写ADC的功能函数代码。

ADC

由原理图知道ADC测量是由PB15与PB12测量,去配置两引脚为ADCx_INx,去相应ADCx中勾选相对应的INx为single-ended,后编写电压获取函数,其中用到ADC测量量与电压转化公式。

上面把需要用的功能都测试了一次没有问题,就开始按要求写写代码

下面是分别界面显示的代码

void Lock_show(void)
{
  sprintf(text,"        Lock        " );
    LCD_DisplayStringLine (Line2 ,(uint8_t *)text);
    
  sprintf(text,"      Pass Word     "  );
    LCD_DisplayStringLine (Line4 ,(uint8_t *)text);
    
  sprintf(text,"        * * *       "  );
    LCD_DisplayStringLine (Line5 ,(uint8_t *)text);
    
}
void Set_show(void)
{
  sprintf(text,"        Set         " );
    LCD_DisplayStringLine (Line2 ,(uint8_t *)text);
    
  sprintf(text,"       Change       "  );
    LCD_DisplayStringLine (Line4 ,(uint8_t *)text);
    
  sprintf(text,"       * * *        "  );
    LCD_DisplayStringLine (Line5 ,(uint8_t *)text);
    
}

ADC电压值转换成数值密码,将i输出到屏幕就行

void Lock_show(void)
{
    if(get_vo1(&hadc2)<1.5)
    {
        i=0;
    }
    else if(1.5<get_vo1(&hadc2)&&get_vo1(&hadc2)<2.5)
    {
        i=1;
    }
    else
    {
        i=2;
    }

*按键与电压共同输入密码

限定电压的大小可以控制输入的数字为0 1 2,密码一共有三位,这就需要输入第一位后记住并且切换到下一位,切换就需要用到按键,按键按一下且为下一位,再按一下又切换到下一位,再按又回到第一位输入。写代码时参数跨文件使用的就要在.h中外部申明,外部声明的数组在.c中初始化就不可以在.h又初始化

案件代码

uint8_t count;
uint8_t Password[3]={0,1,2};
uint8_t word[3];用于记住输入的密码//这三个都需要外部声明void key_scan(void)
{B1_state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);if(B1_state==0&&B1_last_state==1)  //如果按下就用word[]记住当前数值{if(get_vo1(&hadc2)<1.5){word[count]=0;}else if(1.5<get_vo1(&hadc2)&&get_vo1(&hadc2)<2.5){word[count]=1;}else{word[count]=2;}count++;count %=3;}B1_last_state=B1_state;
}

输入密码显示


void Lock_show(void)
{sprintf(text,"        Lock        " );LCD_DisplayStringLine (Line2 ,(uint8_t *)text);sprintf(text,"      Pass Word     "  );LCD_DisplayStringLine (Line4 ,(uint8_t *)text);if(get_vo1(&hadc2)<1.5){if(count==0){sprintf(text,"        %d * *       ",0  );}else if(count==1){sprintf(text,"        %d %d *       ",word[0],0);}else if(count==2){sprintf(text,"        %d %d %d       ",word[0],word[1],0  );}LCD_DisplayStringLine (Line5 ,(uint8_t *)text);}else if(1.5<get_vo1(&hadc2)&&get_vo1(&hadc2)<2.5){if(count==0){sprintf(text,"        %d * *       ",1  );}else if(count==1){sprintf(text,"        %d %d *       ",word[0],1);}else if(count==2){sprintf(text,"        %d %d %d       ",word[0],word[1],1 );}LCD_DisplayStringLine (Line5 ,(uint8_t *)text);}else{if(count==0){sprintf(text,"        %d * *       ",2 );}else if(count==1){sprintf(text,"        %d %d *       ",word[0],2);}else if(count==2){sprintf(text,"        %d %d %d       ",word[0],word[1],2);}LCD_DisplayStringLine (Line5 ,(uint8_t *)text);}
}

用一个标志位来修改页面,当密码正确时标志位改变

uint8_t show_flag;// 标志位,0位输出页面,1位修改页面

if(word[0]==Password[0]&&word[1]==Password[1]&&word[2]==Password[2])
                {
                    show_flag=1;
                }

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

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

相关文章

二叉树的遍历知识点及习题

一、知识点 1二叉树的遍历理解为按照预先定好的搜索路径访问树里的每个节点&#xff0c;且每个节点仅访问一次 2假设根节点为N&#xff0c;左子树为L&#xff0c;右子树为R&#xff0c;常见的三种遍历方法分别是先&#xff08;前&#xff09;序遍历NLR 根左右&#xff0c;中序…

“conda”不是内部或外部命令,也不是可运行的程序或批处理文件

有的时候&#xff0c;我们发现在cmd黑框中输入conda时&#xff0c;cmd会显示“conda”不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件&#xff0c;那这时候该怎么解决呢&#xff1f; Step01&#xff1a;我们找到Anconda的安装目录。然后找到里面的bin文件夹&am…

特辣的海藻!3

基础知识点 判断一个数是否是2的幂次 方法一&#xff1a;位运算 所有2的幂次数的二进制表示中有且仅有一个1&#xff0c;进行位运算 n&(n-1) 后结果为0 检查正数&#xff1a;n > 0&#xff08;负数和0不是2的幂次&#xff09;位运算&#xff1a; n & ( n -1) 会…

苍穹外卖中的模块总结

本文总结苍穹外卖项目中可复用的通用设计 sky-common constant存放常量类&#xff0c;包括消息常量&#xff0c;状态常量 context是上下文对象&#xff0c;封装了threadlocal package com.sky.context;public class BaseContext {public static ThreadLocal<Long> thre…

Threejs教程一【三要素】

场景 场景是一个容器&#xff0c;用于容纳所有的物体、光源、相机等元素。 // 创建场景 const scene new THREE.Scene(); //修改背景颜色&#xff0c;颜色支持十六进制、rgb、hsl、贴图等 scene.background new THREE.Color(0x000000);相机 相机决定了渲染的结果&#xff…

Deepseek和Grok 3对比:写一段冒泡排序

1、这是访问Grok 3得到的结果 2、grok3输出的完整代码&#xff1a; def bubble_sort(arr):n len(arr) # 获取数组长度# 外层循环控制排序轮数for i in range(n):# 内层循环比较相邻元素&#xff0c;j的范围逐渐减少for j in range(0, n - i - 1):# 如果当前元素大于下一个元…

TCP/UDP调试工具推荐:Socket通信图解教程

TCP/UDP调试工具推荐&#xff1a;Socket通信图解教程 一、引言二、串口调试流程三、下载链接 SocketTool 调试助手是一款旨在协助程序员和网络管理员进行TCP和UDP协议调试的网络通信工具。TCP作为一种面向连接、可靠的协议&#xff0c;具有诸如连接管理、数据分片与重组、流量和…

Open WebUI 是什么

Open WebUI 是什么 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 https://github.com/open-webui/open-webui 🚀 …

登录-05.JWT令牌-介绍

一.JWT令牌 JWT令牌是一种简洁的、自包含的格式&#xff0c;用于在通讯双方之间以json数据格式安全的传输数据。说白了&#xff0c;JWT令牌就是将json格式的数据进行封装&#xff0c;从而实现安全传输。 所谓简洁&#xff0c;就是指JWT令牌就是一个简单的字符串。 所谓自包含…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…

【够用就好006】-PC桌面管理ECS服务器的实操步骤

背景介绍解决思路拓展知识 背景介绍 #够用就好#知其然知其所以然#aigc创意人左边 我计划搭建个人网站&#xff0c;计划格式化我的ECS服务器&#xff0c;但是里面有我之前的实践项目&#xff0c;我舍不得删除&#xff0c;我想要保存到本地。 通常我都是在vscode中用remotes ssh…

Ubuntu非conda环境python3.8下安装labelme

很久没用过labelme了&#xff0c;造实验数据需要在一个没有conda的Ubuntu20.04安装了python3.8.10的环境下安装labelme&#xff0c;先是直接执行 pip install labelme 执行了多次每次都是卡死&#xff0c;后来先执行pip install pyqt发现也是卡死在同样的地方&#xff0c;发现…

hi3516cv610修改i2c0引脚位置

hi3516cv610修改i2c引脚位置 我们i2c0位置改为 也就没用海思默认的Pin44 Pin43 Pin26、Pin65分别对应寄存器地址为 0x11130034_Pin26 0x17940004_Pin65 这里我们只需改 pin_mux.c文件 文件路径 ./smp/a7_linux/source/interdrv/sysconfig 改为这样ok pin_mux.c#include &quo…

基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

LeetCode 114.二叉树展开为链表

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

自然语言处理NLP 04案例——苏宁易购优质评论与差评分析

上一篇文章&#xff0c;我们爬取了苏宁易购平台某产品的优质评价和差评&#xff0c;今天我们对优质评价与差评进行分析 selenium爬取苏宁易购平台某产品的评论-CSDN博客 目录 1. 数据加载 2. 中文分词 3. 停用词处理 4. 数据标注与合并 5. 数据集划分 6. 文本特征提取 …

20250223下载并制作RTX2080Ti显卡的显存的测试工具mats

20250223下载并制作RTX2080Ti显卡的显存的测试工具mats 2025/2/23 23:23 缘起&#xff1a;我使用X99的主板&#xff0c;使用二手的RTX2080Ti显卡【显存22GB版本&#xff0c;准备学习AI的】 但是半年后发现看大码率的视频容易花屏&#xff0c;最初以为是WIN10经常更换显卡/来回更…

【JavaEE进阶】Spring Boot配置文件

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 SpringBoot配置⽂件 举例: 通过配置文件修改端口号 配置⽂件的格式 properties基本语法 读取配置⽂件 properties配置文件的缺点 yml配置⽂件 yml基本语法 yml和proper…

Docker内存芭蕾:优雅调整容器内存的极限艺术

title: “&#x1f4be; Docker内存芭蕾&#xff1a;优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “&#x1fa70;&#x1f4a5;&#x1f4ca;” 当你的容器变成内存吸血鬼时… &#x1f680; 完美内存编排示范 &#x1f4dc; 智能内存管家脚本…

【Godot4.3】题目与答案解析合并器

免责申明 本文和工具截图中涉及题库和题目&#xff0c;均为本人自学使用&#xff0c;并未有商业和传播企图。如有侵害&#xff0c;联系删改。 概述 笔者本人医学专业从业人员&#xff0c;编程只是业余爱好。在自己的专业应考学习过程当中&#xff1a; 有时候不太喜欢纸质题库…