柚子快報激活碼778899分享:第十四屆單片機嵌入式藍橋杯
一、CubeMx配置
(1)LED配置
(1)LED燈里面用到了SN74HC573ADWR鎖存器,這個鎖存器有一個LE引腳,這個是我們芯片的鎖存引腳(使能引腳),由PD2這個端口來控制的
(2)LD1~LD8這八個LED燈由PC8~PC15這八個端口控制,且因為LD左端通過300歐的電阻連到了VDD(電源的正引腳) ,若想要點亮LED燈的話,則需要給PC8~PC15低電平,這樣燈才會亮,電流會從VDD順著LED流到PC8
(2)定時器配置
? ? ? ? ?根據(jù)題目需要配置PA1和PA7的定時器端口
? ? ? ? ?因為通過PA1引腳輸出頻率、占空比可調(diào)節(jié)的脈沖信號,所以預(yù)分頻器可以不用寫,就直接不分頻
?
? ? ? ? ?通過PA7引腳完成脈沖捕獲功能
(3)按鍵配置
(4)設(shè)置一個用于中斷任務(wù)的定時器(1ms的定時器)并且使能其更新中斷
?(5)使能中斷
(6)ADC配置
? ? ? ? ?因為題目是通過R37來調(diào)節(jié)占空比的 ,但是R37是CubeMx中的PB15,所以需要用它來配置ADC
?二、keil5配置
(1)添加lcd文件
? ? ? ? 可以看前面的csdn看看怎么要添加文件
(2)添加頭文件
#include "lcd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h" //字符串
#include "math.h" //數(shù)據(jù)庫
?(3)不要忘了開下載的魔術(shù)棒
三、做題代碼
3.1
(1)按鍵按下切換界面的代碼【一般的】
//*********************這些都是寫在int main 函數(shù)外面的代碼********************************
//按鍵有關(guān)的定義
uint8_t key_state=0; //按鍵的模式:0,1,2,3
int keypresstime[4]={0};//一共有四個按鍵
//按鍵的函數(shù)(底層)
char Key_scan(void) //這里的函數(shù)要用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(也相當(dāng)于是按下的消抖)。那么按鍵的時間清零且此時回到按鍵按下前的狀態(tài)
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;} //如果什么都沒發(fā)生
return 0;
}
//**********************************切記:一定要打開定時器********************************
HAL_TIM_Base_Start_IT(&htim6);
//***********************************這些是放在while循環(huán)里面的函數(shù)************************
if(Flag_lcd==0)LCD_data();
else if (Flag_lcd==1)LCD_para();
else if (Flag_lcd==2)LCD_recd();
LCD_show();//如果不添加這個的話,就沒辦法顯示界面的內(nèi)容
//上面的是顯示界面
if(key_state==1)
{
Flag_lcd++;
Flag_lcd=Flag_lcd>2?0:Flag_lcd;
//如果>2的話,那么就把Flag_lcd變成0
//當(dāng)然這一句也可以變成一個if循環(huán)來表達
}
//這個是按鍵按下切換界面的代碼
(2)按鍵按下切換界面的代碼【最好的】
? ? ? ? ?其實不太理解這個底層函數(shù)的邏輯
//*********************這些都是寫在int main 函數(shù)外面的代碼
//按鍵有關(guān)的定義
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}; //有四個按鍵
//按鍵的底層函數(shù)(放在中斷回調(diào)函數(shù)里面)
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循環(huán)里面的函數(shù)
if(Flag_lcd==0)LCD_data();
else if (Flag_lcd==1)LCD_para();
else if (Flag_lcd==2)LCD_recd();
LCD_show();//如果不添加這個的話,就沒辦法顯示界面的內(nèi)容
if(Flag_lcd==0)LCD_data();
else if (Flag_lcd==1)LCD_para();
else if (Flag_lcd==2)LCD_recd();
LCD_show();//如果不添加這個的話,就沒辦法顯示界面的內(nèi)容
3.2
四、不理解的代碼
(1)
五、出現(xiàn)問題的步驟
(1)LCD不顯示界面?
? ? ? ? ?這個問題是因為這個頻率最開始設(shè)置的是8,應(yīng)該設(shè)置的頻率是24
?(2)按鍵無法執(zhí)行切換頁面的任務(wù)
? ? ? ? ?按鍵無法執(zhí)行相應(yīng)的任務(wù)是因為這幾個配置我最開始配置成了GPIO_Output
柚子快報激活碼778899分享:第十四屆單片機嵌入式藍橋杯
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。