由硬件框圖可以知道我們要配置LED 和按鍵
一.LED
先配置LED的八個引腳為GPIO_OutPut,鎖存器PD2也是,然后都設置為起始高電平,生成代碼時還要去解決引腳沖突問題
二.按鍵
按鍵配置,由原理圖按鍵所對引腳要GPIO_Input
生成代碼,在文件夾中添加code文件夾,code中添加fun.c、fun.h、headfile.h文件,去資源包中把lcd.c、lcd.h、fonts.h添加到code中,然后去寫按鍵控制燈亮滅的程序,看是否有問題
按鍵控制led沒有問題后寫lcd顯示代碼,顯示沒問題后,解決lcd與led引腳沖突問題,方法在我的其他文章中CSDN
? HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_RESET ); //為解決引腳沖突初始化lcd時? ??LCD_Init (); ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 要將鎖存器鎖存器來;
? LCD_Clear (Black);
? LCD_SetBackColor(Black);
? LCD_SetTextColor(White);
三.LCD顯示函數
void lcd_show(void)
{
?? ?sprintf(text," ? ? ?hello world");
?? ?LCD_DisplayStringLine (Line0 ,(uint8_t *)text);
}
四.界面顯示
購買界面
按照要求把其顯示的東西先顯示出來
價格界面
界面轉換
寫好三個界面的顯示函數后需要寫一個界面轉換的函數,按要求B1按鍵負責界面轉換,用一個標志位來解決界面轉換。
五.按鍵功能實現
B2按鍵
B1按鍵的功能我們在界面轉換哪里已經完成,現在完成B2按鍵
在C語言中,1.0f表示一個單精度浮點數(float類型)的字面值。
具體來說:???1.0f的含義?
1.0f中的f后綴明確表示這是一個單精度浮點數(float類型)。如果不加f,默認情況下1.0會被視為雙精度浮點數(double類型)。
?與1.0的區別?
1.0是雙精度浮點數(double類型),占用64位內存,精度更高。
1.0f是單精度浮點數(float類型),占用32位內存,精度較低,但計算速度可能更快。
庫存界面
B3按鍵
B4按鍵
六.EEPROM存儲功能(不熟)
去資源包中把IIC_hal.c與.h添加到code文件中,添加頭文件,main中初始化
寫好之后測試一下是否正確
七.串口輸出接收功能(不熟)
需要把PA9設置為TX? ?PA10為RX,開啟中斷后生成代碼
添加頭文件,在usart.h中找到
輸出
HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout),串口發送函數
定義一個數組存放要發送的數據char send[20];
接收
細節不會請看CSDN
?在頭文件中找到串口接收回調函數HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)寫接收函數;
在函數中先if判斷串口,定義的uint8_t rec_data;在headfile.h中加一個外部聲明extern,便于數據跨文件使用
找到串口接收函數HAL_UART_Receive_IT();
第一個參數為串口句柄
第二個參數為接收的數據
第三個參數接收數據的字節數
寫好的接收函數要在main中聲明,相當于使能,代碼執行到此時發生串口中斷,把數據存到rec-data中然后跳到串口中斷函數中
在函數中將剛才儲存的數據發送出去后又接收新的數據,這也就是為什么接收函數中發送數據的代碼要在接收代碼上面
八.燈
題目要求燈的亮滅有時間要求,這就需要去配置一個0.1s的定時器,定時器記得使能中斷后生成代碼
九.PWM輸出功能(不熟)
輸出PWM
PA1配置為PWM輸出,計算f'為2000hz,不需要開啟中斷
生成代碼,開啟PWM,設置占空比
輸入捕獲
還需要一個引腳來捕獲頻率,這個題目沒有要求。但是我們需要用來查看自己的PWM和占空比是否正確,輸入捕獲是需要用中斷的
生成代碼,開啟
找到回調函數寫輸入捕獲函數
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
占空比計算的時候,如果輸出用%d,CCR/ARR是的小數的,這個輸出是會出錯的,CCR*100再除