蓝桥杯嵌入式第十届省赛 真题+代码

led.c文件

#include "led.h"

void Led(uint16_t addr,uint16_t enable)
{
	static uint16_t temp = 0x0000;
	static uint16_t temp_old = 0xffff;
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);
	if(enable)
		temp |= 0x0100 << addr;
	else
		temp &= ~(0x0100 << addr);
	if(temp != temp_old)
	{
		HAL_GPIO_WritePin(GPIOC, temp, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
		temp_old = temp;
	}
}

key.c文件

#include "key.h"

extern uint16_t flag_10ms;

uint16_t Key_Scan(void)
{
	static uint16_t cnt1 = 0;
	static uint16_t cnt2 = 0;
	static uint16_t cnt3 = 0;
	static uint16_t cnt4 = 0;
	uint16_t key_temp = 0;;
	if(flag_10ms == 1)
	{
		if(B1 == 0)	cnt1++;
		if(B1 == 1)
		{
			if(cnt1 > 2)
			{
				key_temp = 1;
			}
			cnt1 = 0;
		}
		if(B2 == 0)	cnt2++;
		if(B2 == 1)
		{
			if(cnt2 > 2)
			{
				key_temp = 2;
			}
			cnt2 = 0;
		}
		if(B3 == 0)	cnt3++;
		if(B3 == 1)
		{
			if(cnt3 > 2)
			{
				key_temp = 3;
			}
			cnt3 = 0;
		}
		if(B4 == 0)	cnt4++;
		if(B4 == 1)
		{
			if(cnt4 > 2)
			{
				key_temp = 4;
			}
			cnt4 = 0;
		}
		flag_10ms = 0;
	}
	return key_temp;
}

key.h文件

#ifndef __key_h
#define __key_h

#include "main.h"

#define B1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define B2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define B3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define B4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)

uint16_t Key_Scan(void);

#endif

interrupt.c文件

#include "interrupt.h"

uint16_t flag_10ms,flag_200ms;
uint16_t t;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim -> Instance == TIM2)
	{
		flag_10ms = 1;
		if(++t > 20)
		{
			flag_200ms = 1 - flag_200ms;
			t = 0;
		}
	}
}

dadc.c文件

#include "dadc.h"

double Get_ADC(ADC_HandleTypeDef *pin)
{
	uint16_t adc;
	HAL_ADC_Start(pin);
	adc = HAL_ADC_GetValue(pin);
	return adc * 3.3 / 4096;
}

main.c文件

注:LCD部分同资源包底层代码

头文件部分

#include "led.h"
#include "key.h"
#include "interrupt.h"
#include "dadc.h"
#include "lcd.h"
#include "stdio.h"

定义变量部分

Status:0~3分别对应Max_Volt,Min_Volt,Upper,Lower.

Mode:0—数据界面  1—参数界面        Setting_Mode同理

double Volt,Max_Volt = 2.4,Min_Volt = 1.2;
int16_t Upper = 1,Lower = 2;
uint16_t Status;
char text_volt[20],text_Max_Volt[20],text_Min_Volt[20],text_Upper[20],text_Lower[20];
uint16_t Mode;
uint16_t Setting_Mode;
extern uint16_t flag_200ms;

函数部分

按键逻辑函数

切屏的时候需要调用LCD切屏函数   LCD_Clear(Black);   这里是在切换的时候将屏幕切换为黑色。

Upper,Lower这种按键加减的变量在定义的时候必须定义为有符号的类型。

处理方法,以加法为例(减法同理):

if(Upper == Lower)	Upper++;
if(Lower == Upper)	Lower++;
void Key_Pro(void)
{
	switch(Key_Scan())
	{
		case 1:
			LCD_Clear(Black);
			Mode = 1 - Mode;
		break;
		case 2:	
			if(++Setting_Mode > 3)	Setting_Mode = 0;
		break;
		case 3:
			switch(Setting_Mode)
			{
				case 0:
					Max_Volt += 0.3;
					if(Max_Volt >= 3.3)	Max_Volt = 0;
				break;
				case 1:
					Min_Volt += 0.3;
					if(Min_Volt >= 3.3)	Min_Volt = 0;
				break;
				case 2:
					Upper++;
					if(Upper == Lower)	Upper++;
					if(Upper > 8)	Upper = 0;
				break;
				case 3:
					Lower++;
					if(Lower == Upper)	Lower++;
					if(Lower > 8)	Lower = 0;
				break;
			}
		break;
		case 4:
			switch(Setting_Mode)
			{
				case 0:
					Max_Volt -= 0.3;
					if(Max_Volt <= 0)	Max_Volt = 3.3;
				break;
				case 1:
					Min_Volt -= 0.3;
					if(Min_Volt <= 0)	Min_Volt = 3.3;
				break;
				case 2:
					Upper--;
					if(Upper == Lower)	Upper--;
					if(Upper < 1)	Upper = 8;
				break;
				case 3:
					Lower--;
					if(Lower == Upper)	Lower--;
					if(Lower < 1)	Lower = 8;
				break;
			}
		break;
	}
}

Lcd显示函数 

第一个函数为数据显示界面,第二个函数为参数设置界面。

解决方法: 根据变量Status的状态(0—Max_Volt 1—Min_Volt  2—Upper  3—Lower)进行选择。如:此时选择的参数为Min_Volt,就在显示Min_Volt这一行的前面加上LCD_SetBackColor(Green); 这一行的后面加上  LCD_SetBackColor(Black);  然后有四个状态,用一个Switch即可。

void Display_Data(void)
{
	LCD_DisplayStringLine(Line1, (u8*)"       Main     ");
	sprintf(text_volt,"  Volt:%.2f     ",Get_ADC(&hadc2 ));
	LCD_DisplayStringLine(Line4, (u8*)text_volt);
	switch(Status)
	{
		case 0:
			LCD_DisplayStringLine(Line6, (u8*)"  Status:Upper    ");
		break;
		case 1:
			LCD_DisplayStringLine(Line6, (u8*)"  Status:Lower     ");
		break;
		case 2:
			LCD_DisplayStringLine(Line6, (u8*)"  Status:Normal     ");
		break;
	}
}

void Display_Parm(void)
{
	LCD_DisplayStringLine(Line1, (u8*)"       Setting     ");
	sprintf(text_Max_Volt,"  Max Volt:%.1fV",Max_Volt);
	sprintf(text_Min_Volt,"  Min Volt:%.1fV",Min_Volt);
	sprintf(text_Upper,"  Upper:LD%d",Upper);
	sprintf(text_Lower,"  Lower:LD%d",Lower);
	switch(Setting_Mode)
	{
		case 0:
			LCD_SetBackColor(Green);//¶ÔMax_Volt¸ßÁÁÏÔʾ£¬ÏÂÃæͬÀí
			LCD_DisplayStringLine(Line2, (u8*)text_Max_Volt);
			LCD_SetBackColor(Black);
			LCD_DisplayStringLine(Line3, (u8*)text_Min_Volt);
			LCD_DisplayStringLine(Line4, (u8*)text_Upper);
			LCD_DisplayStringLine(Line5, (u8*)text_Lower);
		break;
		case 1:
			LCD_DisplayStringLine(Line2, (u8*)text_Max_Volt);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line3, (u8*)text_Min_Volt);
			LCD_SetBackColor(Black);
			LCD_DisplayStringLine(Line4, (u8*)text_Upper);
			LCD_DisplayStringLine(Line5, (u8*)text_Lower);
		break;
		case 2:
			LCD_DisplayStringLine(Line2, (u8*)text_Max_Volt);
			LCD_DisplayStringLine(Line3, (u8*)text_Min_Volt);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line4, (u8*)text_Upper);
			LCD_SetBackColor(Black);
			LCD_DisplayStringLine(Line5, (u8*)text_Lower);
		break;
		case 3:
			LCD_DisplayStringLine(Line2, (u8*)text_Max_Volt);
			LCD_DisplayStringLine(Line3, (u8*)text_Min_Volt);
			LCD_DisplayStringLine(Line4, (u8*)text_Upper);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line5, (u8*)text_Lower);
			LCD_SetBackColor(Black);
		break;
	}
}

Led逻辑函数

在定时器回调函数里定时200ms,当电压满足条件时,对应的Led进行闪烁,再遍历除这个闪烁灯外的其他Led,对这些Led熄灭

void Led_Pro(void)
{
	Volt = Get_ADC(&hadc2 );
	if(Volt > Max_Volt)	
	{	
		Status = 0;
		if(flag_200ms)
		{
			Led(Upper - 1,1);
		}
		else
		{
			Led(Upper - 1,0);
		}
		for(uint16_t i = 0; i < 8;i++ )
		{
			if(i != Upper - 1)
				Led(i,0);
		}
	}
	else if(Volt < Min_Volt)
	{
		Status = 1;
		if(flag_200ms)
		{
			Led(Lower - 1,1);
		}
		else
		{
			Led(Lower - 1,0);
		}
		for(uint16_t i = 0; i < 8;i++ )
		{
			if(i != Lower - 1)
				Led(i,0);
		}
	}
	else	
	{
		Status = 2;
		for(uint16_t i = 0; i < 8;i++ )
		{
			Led(i,0);
		}
	}
}

主函数部分

初始化

	HAL_TIM_Base_Start_IT(&htim2);
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetTextColor(White );
	LCD_SetBackColor(Black);

死循环

		Key_Pro();
		if(!Mode)	Display_Data();
		else	Display_Parm();
		Led_Pro();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在sql server 2016 always on集群里新增一个数据库节点

本篇博客有对应的word版本&#xff0c;有需要的可以点击这里下载。 一 环境介绍 二 操作步骤 2.1 在新节点上安装sql server软件 略 2.2 在新节点上开启‘故障转移群集功能’ 打开‘服务管理器’&#xff1a; 点击‘添加角色和功能’&#xff1a; 勾选’DNS服务器’&#…

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战&#xff0c;以及一些直接用键盘方向键操控玩家的游戏&#xff0c;是根本用不到寻路的&#xff0c;因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式&#xff0c;就绝对绕不开寻路了。 导航、碰撞与…

企业培训考试系统数字化解决方案优势有哪些?

企业员工内部培训考试系统&#xff0c;用数字技术和互联网平台&#xff0c;为企业提供高效、便捷、个性化的员工培训服务的解决方案。 企业员工培训考试数字化解决方案不仅能够提供更加高效、灵活和互动的学习体验&#xff0c;还能够帮助企业实现长期的人才发展战略&#xff0…

好委屈,东方甄选为何总是被供应商骗?

东方甄选最近很委屈。 315晚会过后&#xff0c;知名打假人王海爆料&#xff0c;称315晚会曝光的槽头肉扣肉在东方甄选和小杨哥的直播间里销售过。 东方甄选赶忙去问了问供应商情况。 供应商的回答让他感到暖心&#xff0c;表示虽然315晚会曝光了我们公司违规使用糟头肉&…

如何在三个简单步骤中为对象检测标注图像

初始通过彻底清洗和处理原始图像数据来奠定有效对象检测注释的基础。选择适合的工具、方法和清晰的注释过程指南来建立注释工作空间。通过在图像中划定对象并附上类别标签来执行注释&#xff0c;随后进行细致的核验&#xff0c;以确保数据集的精确性和完整性。 图像注释是计算…

极大似然估计和最大参数后验估计

概率是已知模型和参数&#xff0c;推数据&#xff1b;统计&#xff08;似然&#xff09;是已知数据&#xff0c;推模型和参数。对于函数 x表示某一个具体的数据&#xff1b;θ表示模型的参数。 如果θ是已知确定的&#xff0c;x 是变量&#xff0c;这个函数叫做概率函数(prob…

MYSQL概念和编译安装

目录 一、数据库概述 1.1数据 1.2表 1.3数据库 总结&#xff1a; 2.数据库管理系统&#xff08;DBMS&#xff09; 3.DBMS工作模式 4.数据库系统原理 二、数据库发展史 三、主流数据库 四、关系型数据库和非关系型数据库 1.关系型数据库 2.非关系数据库 MYSQL数据…

蓝桥杯--全球气温变暖

import java.util.Scanner;public class top7 {//全球边暖//思路&#xff0c;就是找出上下左右都是#的地方&#xff0c;如果这个地方是的&#xff0c;那么此时countstatic int count0;public static void main(String[] args) {Scanner scanner new Scanner(System.in);int ns…

Day14 代码随想录(1刷) 42接雨水+二叉树遍历

42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

【C++】用红黑树模拟实现set、map

目录 前言及准备&#xff1a;一、红黑树接口1.1 begin1.2 end1.3 查找1.4 插入1.5 左单旋和右单旋 二、树形迭代器&#xff08;正向&#xff09;2.1 前置 三、模拟实现set四、模拟实现map 前言及准备&#xff1a; set、map的底层结构是红黑树&#xff0c;它们的函数通过调用红…

【CSS练习】万年历 html+css+js

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>bod…

车辆运动学和动力学模型

参考&#xff1a;路径规划与轨迹跟踪系列算法学习_第9讲_车辆运动学和动力学模型 1 车辆运动学模型和动力学模型概述 要控制车辆的运动&#xff0c;首先要对车辆的运动建立数字化模型&#xff0c;模型建立的越准确&#xff0c;对车辆运动的描述越准确&#xff0c;对车辆的跟踪…

Django分页器

Django分页器 分页器前瞻之url urls.py不需要做修改 urlpatterns [path(test/, views.test,nametest), ]假设此时在原有的路径http://127.0.0.1:8000/app01/test后面添加/?page2 然后再后端获取到page def test(request):page request.GET.get(page)print(page) # 2retu…

Linux--如何在Linux上运行一个helloworld

一.安装vim和gcc sudo --是进入管理员模式 apt --是 Advanced Package Tool&#xff08;高级软件包工具&#xff09;的缩写&#xff0c;这是用于管理软件包的一种工具。 install --是安装的意思 后面跟软件的名称 完整的意思&#xff1a;在管理员的模式下安装 某个软件 …

使用jQuery的autocomplete实现数据查询一次,联想自动补全

书接上回&#xff0c;上次说到在jsp页面中&#xff0c;通过监听输入框的数值变化&#xff0c;实时查询数据库&#xff0c;得到返回值使用autocomplete属性自动补全&#xff0c;实现一个联想补全辅助操作&#xff0c;链接&#xff1a;使用jquery的autocomplete属性实现联想补全操…

C++--STL标准库

一.模板 模板是C中泛型编程的基础。一个模板就是一个创建类或函数的蓝图。 生活中常见的模板有: 编写一个比较两个值大小的函数&#xff0c;如果第一个值大于第二个值返回大于0的数字,两个值相等返回0,第一个值小于第二个值返回小于0的数字。 我们可以根据值类型定义多个函数&…

2024年阿里云服务器搭建幻兽帕鲁游戏_保姆级教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

SecureCRT出现乱码的解决方法

SecureCRT是一个商业终端连接工具&#xff0c;它支持多种自定义设置。默认设置下&#xff0c;通过SecureCRT连接SSH服务器可能出现中文乱码的情况。这是由于SecureCRT字符编码与服务器的字符编码不一致造成的。 当然解决这个问题也很简单&#xff0c;将SecureCRT字符编码设置成…

深入探讨Python中的文件操作与文件IO操作【第141篇—Python实现】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 深入探讨Python中的文件操作与文件IO操作 在Python编程中&#xff0c;文件操作和文件IO操作…

计算机缺失msvcp110.dll如何修复,多种修复方法教给你

当电脑系统中msvcp110.dll文件丢失时&#xff0c;可能会对计算机的正常运行产生一系列显著的影响。msvcp110.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;这个动态链接库文件对于许多基于Windows的应用程序至关重要&#xff0c;尤其是一些使用C编译器…