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