当前位置: 首页 > article >正文

第十四届单片机嵌入式蓝桥杯

一、CubeMx配置

(1)LED配置

(1)LED灯里面用到了SN74HC573ADWR锁存器,这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚(使能引脚),由PD2这个端口来控制的

(2)LD1~LD8这八个LED灯由PC8~PC15这八个端口控制,且因为LD左端通过300欧的电阻连到了VDD(电源的正引脚) ,若想要点亮LED灯的话,则需要给PC8~PC15低电平,这样灯才会亮,电流会从VDD顺着LED流到PC8

(2)定时器配置

         根据题目需要配置PA1和PA7的定时器端口

         因为通过PA1引脚输出频率、占空比可调节的脉冲信号,所以预分频器可以不用写,就直接不分频

 

         通过PA7引脚完成脉冲捕获功能

(3)按键配置

(4)设置一个用于中断任务的定时器(1ms的定时器)并且使能其更新中断

 (5)使能中断

(6)ADC配置

         因为题目是通过R37来调节占空比的 ,但是R37是CubeMx中的PB15,所以需要用它来配置ADC

 二、keil5配置

(1)添加lcd文件

        可以看前面的csdn看看怎么要添加文件

(2)添加头文件
#include "lcd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h" //字符串
#include "math.h"   //数据库

 (3)不要忘了开下载的魔术棒

三、做题代码

3.1

(1)按键按下切换界面的代码【一般的】
//*********************这些都是写在int main 函数外面的代码********************************

//按键有关的定义

uint8_t key_state=0;    //按键的模式:0,1,2,3
int keypresstime[4]={0};//一共有四个按键

//按键的函数(底层)

char Key_scan(void) //这里的函数要用char 不能用void 因为有返回值
{
	     if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0))keypresstime[0]++;
//如果按键按下,就开始计时(前面有一个!是代表非0)

	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)&&keypresstime[0]>20){keypresstime[0]=0;return 1;}
//如果按键松开,而且此时的按键时长>20ms(也相当于是按下的消抖)。那么按键的时间清零且此时回到按键按下前的状态
	
	else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))keypresstime[1]++;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)&&keypresstime[1]>20){keypresstime[1]=0;return 2;}
	
	else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2))keypresstime[2]++;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)&&keypresstime[2]>20){keypresstime[2]=0;return 3;}
	
	else if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))keypresstime[3]++;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)&&keypresstime[3]>20){keypresstime[3]=0;return 4;}
	
	else {keypresstime[0]=0;keypresstime[1]=0;keypresstime[2]=0;keypresstime[3]=0;} //如果什么都没发生
	return 0;
}


//**********************************切记:一定要打开定时器********************************
HAL_TIM_Base_Start_IT(&htim6);


//***********************************这些是放在while循环里面的函数************************
	 
     if(Flag_lcd==0)LCD_data();
	  else if (Flag_lcd==1)LCD_para();
	  else if (Flag_lcd==2)LCD_recd();
	  LCD_show();//如果不添加这个的话,就没办法显示界面的内容
     //上面的是显示界面

	  if(key_state==1)
	  {
					Flag_lcd++;
			Flag_lcd=Flag_lcd>2?0:Flag_lcd;
            //如果>2的话,那么就把Flag_lcd变成0
            //当然这一句也可以变成一个if循环来表达
	  }
     //这个是按键按下切换界面的代码
(2)按键按下切换界面的代码【最好的】

         其实不太理解这个底层函数的逻辑

//*********************这些都是写在int main 函数外面的代码

//按键有关的定义

struct keys
{
	unsigned char judge_sta;
	bool key_sta;
	bool single_flag;
	bool long_flag;
	unsigned int key_time;
};//定义几个标志位

struct keys key[4]={0,0,0};    //有四个按键


//按键的底层函数(放在中断回调函数里面)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		
	if(htim->Instance==TIM6)//开的中断的定时器
	{
		//按键部分
		key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);

		for(int i=0;i<4;i++)
		{
			switch (key[i].judge_sta)
			{
				case 0:  //消抖
				{
					if(key[i].key_sta==0)
					{
						key[i].judge_sta=1;
						key[i].key_time=0;
					}
				}
				break;

				case 1:
				{
					if(key[i].key_sta==0)  ///确定按下
					{
						key[i].judge_sta=2;
					}
					else key[i].judge_sta=0;
				}
				break;

				case 2:
				{
					if(key[i].key_sta==1)
					{
						key[i].judge_sta=0;					
						if(key[i].key_time<70)
						{
							key[i].single_flag=1;  //单机
						}
					}

					else 
					{
						key[i].key_time++;
						if(key[i].key_time>70)  key[i].long_flag=1;  //长按
					}
				}
				break;

			}
		}
	}
	
}

//**********************************切记:一定要打开定时器
HAL_TIM_Base_Start_IT(&htim6);
	

//***********************************这些是放在while循环里面的函数

	  if(Flag_lcd==0)LCD_data();
	  else if (Flag_lcd==1)LCD_para();
	  else if (Flag_lcd==2)LCD_recd();
	  LCD_show();//如果不添加这个的话,就没办法显示界面的内容

	  if(Flag_lcd==0)LCD_data();
	  else if (Flag_lcd==1)LCD_para();
	  else if (Flag_lcd==2)LCD_recd();
	  LCD_show();//如果不添加这个的话,就没办法显示界面的内容

3.2

四、不理解的代码

(1)

五、出现问题的步骤

(1)LCD不显示界面 

         这个问题是因为这个频率最开始设置的是8,应该设置的频率是24

 (2)按键无法执行切换页面的任务

         按键无法执行相应的任务是因为这几个配置我最开始配置成了GPIO_Output


http://www.kler.cn/news/353899.html

相关文章:

  • 单一执行和循环执行的例行性工作
  • 【C++11】可变模板参数详解
  • Python RabbitMQ 入门 pika
  • Java之集合介绍
  • 在移动设备上扫描登机牌条形码,有哪些挑战 ?
  • 2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序
  • 【C语言】自定义类型:联合和枚举
  • 【算法】约瑟夫环问题
  • vue使用js-xlsx导入本地excle表格数据,回显在页面上
  • 本地群晖NAS安装phpMyAdmin管理MySQ数据库实战指南
  • 深度解析LMS(Least Mean Squares)算法
  • 单链表的定义
  • 多进程思维导图
  • 在ArcGISPro中使用 SAR 数据和深度学习绘制洪水地图
  • Android GPIO方式解码红外数据
  • LeetCode讲解篇之2320. 统计放置房子的方式数
  • 学习Redisson实现分布式锁
  • 【Linux系统编程】环境基础开发工具使用
  • ⭐ Unity Pico PXR_SDK转场淡入淡出
  • kimi帮我解决ubuntu下软链接文件夹权限不够的问题