一、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