藍橋杯嵌入式備賽教程(1、led,2、lcd,3、key)

一、工程模版創建流程


第一步?創建新項目

第二步?選擇型號和管腳封裝

?第三步 RCC使能? ?外部時鐘,高速外部時鐘

第四步晶振時鐘配置?

由數據手冊7.1可知外部晶振頻率為24MHz? 最后一項設置為80

按下回車他會自動配置時鐘

?第五步,如果不勾選可能程序只會下載一次到時候不好找問題

第6步 名字和路徑不能有中文

?第七步bsp為創建的程序存放的文件

八創建一個新組

注意程序只能寫在USER CODE BEGIN include 和user code end include

9Debug設置?點擊確定板載調試器?

?

?二、點亮一顆LED燈


原理圖

PD2鎖存器控制端口

第一步、打開PC8~15的接口配置為output模式

且選中管腳output設置為HIGHPD2低電平時候為開,防止別的引腳沖突?

點擊生成即可

第二步 創建兩個文件led.c和led.h

定義縮寫? 在main.h函數內typedef unsigned char? uchar

頭文件位置要在BEGIN和END之間

?第三步、引用頭文件配置,這步是點擊魔術棒

?

案例程序----點亮led

main

/----------------------------------main.h-------------------------------/

/* USER CODE BEGIN Includes */
typedef unsigned char uchar;
typedef unsigned int  uint;/* USER CODE END Includes */

/----------------------------------main.h-------------------------------/

頭文件

/* USER CODE BEGIN Includes */
#include "led.h"
/* USER CODE END Includes */

?主函數

LED_Disp(0x00);//LED初始化/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_Disp(0x02);HAL_Delay(500);LED_Disp(0x00);HAL_Delay(1000);				}/* USER CODE END 3 */

led

/-----------------------------------led.h---------------------------------/

#ifndef __LED_H__
#define __LED_H__#include "main.h"
void LED_Disp(uchar dsLED);#endif

/-----------------------------------led.c---------------------------------/


#include "led.h"void LED_Disp(uchar dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//先將所有引腳設為高電平由原理圖設計HAL_GPIO_WritePin(GPIOC,dsLED << 8,GPIO_PIN_RESET);//推向高8位HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//鎖存器低電平觸發HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);}

三、lcd相關配置及代碼案例

LCD原理圖

?參考和移植官方的案例程序

第一步、引腳配置

全部配置為output

配置完引腳后點擊GENERATE CODE即可無需其他操作

第二步、將這兩個頭文件復制到

在給的案例路徑下將lcd.c、fonts、lcd.h也復制到bsp路徑下面

?第三步、添加頭文件

官方案例程序?

使用這種格式的顏色背景方便機器閱卷?背景色要求

? ? ? ??

案例程序----lcd顯示

添加lcd

/--------------------------------main.c----------------------------/

頭文件

/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */

?主函數

sprintf函數打印到字符串中

(要注意字符串的長度要足夠容納打印的內容,否則會出現內存溢出),而printf函數打印輸出到屏幕上。sprintf函數在我們完成其他數據類型轉換成字符串類型的操作中應用廣泛
3、sprintf函數的格式
int sprintf( char *buffer, const char *format [, argument,…] );? ? ? ?

/* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_Disp(0x02);HAL_Delay(500);LED_Disp(0x00);HAL_Delay(1000);char text[30];uint i = 5;sprintf(text,"  CNBR:%d      ",i);LCD_DisplayStringLine(Line9, (uint8_t *)text);}/* USER CODE END 3 */

三、按鍵配置


按鍵原理圖

第一步、引腳配置

引腳設置為input

第二步 模式設置上下拉模式選擇上拉

第三步定時器配置?

隨便選擇一個定時器?

時鐘選擇外部時鐘80Mhz---為了達到非阻塞式延時消抖

分屏系數和自動重裝載值設置?

100HZ=10ms中斷一次??從0開始0~79是80個數

?計算延時時間實例

?中斷使能

點擊生成代碼即可

程序及環境配置

新建兩個文件-另存interrupt.c,interrupt.h保存地址為該文件路徑下的bsp中

?/----------------------------------------------interrupt.h------------------------------------/

interrupt


#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__#include "main.h"
#include "stdbool.h"
struct keys
{uchar judge_sta;//按鍵判斷bool key_sta;bool single_flag;//確認被按下他為1
};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);#endif

?/----------------------------------------------interrupt.c------------------------------------/

在一個具有多個按鍵的嵌入式設備按鍵檢測程序中,通過循環遍歷?key?數組(改變?i?的值從 0 到數組元素個數減 1),就可以依次獲取每個按鍵的?judge_sta?狀態,判斷是否滿足某些條件來進一步確認按鍵是否有效按下或者是否進入了特定的操作判斷階段等。

  1. case 0?分支

    • 邏輯描述:當?key[i].judge_sta?的值為?0?時進入該分支。在這個分支里,有一個條件判斷語句?if(key[i].key_sta == 0),也就是當?key[i].key_sta(表示按鍵當前基本狀態,0?在這里可能意味著未按下或者非激活狀態等)也為?0?時,會將?key[i].judge_sta?的值更新為?1。這可能意味著當按鍵初始處于某個默認的未激活且符合某種前置條件時(由?judge_sta?為?0?和?key_sta?為?0?共同界定),將其狀態推進到下一個階段或者設置為另一種待確認的中間狀態(用?judge_sta?變為?1?來表示)。
    • 可能的應用場景示例:比如在一個設備啟動后,按鍵初始都處于默認未操作狀態,當檢測到按鍵沒有被按下(key_sta?為?0)且其整體判斷狀態處于初始的?0?階段時,就將其推進到一個準備檢測后續是否有按下動作的狀態階段,對應?judge_sta?更新為?1
  2. case 1?分支

    • 邏輯描述:當?key[i].judge_sta?等于?1?時執行此分支邏輯。這里的條件判斷是?if(key[i].key_sta == 0),如果?key[i].key_sta?為?0(即按鍵此時處于未按下狀態),會執行兩個操作:一是將?key[i].judge_sta?重置回?0,可能表示此次針對該按鍵的操作周期結束或者恢復到初始的一種狀態等待下次操作;二是將?key[i].single_flag?設置為?1,根據之前結構體定義中對?single_flag?的注釋理解(確認被按下它為?1),這里雖然當前按鍵是未按下狀態,但可能是在滿足了之前從?judge_sta?為?1?階段的一些檢測邏輯后,確認了一次完整的按鍵操作過程(比如之前從初始狀態進入到?1?階段后,又檢測到按鍵松開了,就認為這是一次完整操作),所以設置?single_flag?為?1?來標記這次操作已完成,可以供程序后續部分依據這個標志做相應處理。
    • 可能的應用場景示例:在一個游戲控制按鍵的處理中,當按下某個按鍵后?judge_sta?變為?1?表示正在檢測按下動作,然后松開按鍵(key_sta?變為?0),此時就可以認為完成了一次有效的按鍵操作,將?judge_sta?回置到?0?等待下次操作,同時設置?single_flag?為?1?通知程序去執行比如游戲角色對應動作等相關功能代碼。
  3. case 2?分支

    • 邏輯描述:當?key[i].judge_sta?的值為?2?進入該分支。這里的條件判斷是?if(key[i].key_sta == 1),即如果此時按鍵處于按下狀態(key_sta?為?1),會將?key[i].judge_sta?的值設置為?0。這或許意味著當按鍵處于該?2?所代表的狀態階段時,如果又檢測到它被按下了,那就將其狀態重置回初始或者某個默認狀態(用?judge_sta?變為?0?表示),可能是出現了不符合預期的重復按下或者需要重新開始檢測該按鍵的情況等原因。
    • 可能的應用場景示例:在一個具有按鍵組合功能的設備中,如果某個按鍵單獨按下去后進入了?judge_sta?為?2?的特定組合檢測狀態,但隨后又檢測到它再次被按下不符合當前功能的按鍵操作邏輯,就將其狀態復位到?0?以便重新正確地檢測后續操作。
#include "interrupt.h"struct keys key[4] = {0,0,0};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){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;}break;case 1:{if(key[i].key_sta ==0){key[i].judge_sta=0;key[i].single_flag=1;}}break;case 2:{if(key[i].key_sta==1){key[i].judge_sta=0;}}break;case 3:{				}break;}}}
}

/---------------------------main.c--------------------------------------------/

main?

* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"/* USER CODE BEGIN PTD */
extern struct keys key[];
/* USER CODE END PTD */

/-----------------------------main.c------------------------------------------/

int main(void)
{
/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_Base_Start_IT(&htim3);  //定時器中斷/* USER CODE END 2 */while (1){
char text[30];uint i = 5;sprintf(text,"  CNBR:%d      ",i);LCD_DisplayStringLine(Line9, (uint8_t *)text);//實現按鍵的功能//第一個按鍵if(key[0].single_flag==1){sprintf(text,"       key0down      ");LCD_DisplayStringLine(Line8,(uint8_t *)text);key[0].single_flag=0;}if(key[1].single_flag==1){sprintf(text,"       key1down      ");LCD_DisplayStringLine(Line8,(uint8_t *)text);key[1].single_flag=0;}}/* USER CODE END 3 */
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63858.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳細解讀sedex驗廠

SEDEX驗廠&#xff0c;即供貨商商業道德信息交流認證&#xff08;Supplier Ethical Data Exchange&#xff09;&#xff0c;是一種表明企業遵守商業道德的認證。以下是對SEDEX驗廠的詳細解讀&#xff1a; 一、SEDEX驗廠概述 SEDEX是一家總部位于英國倫敦的非營利組織&#xf…

2.4 設備管理

文章目錄 設備管理概述設備管理技術磁盤調度 設備管理概述 設備管理是操作系統中最繁雜、與硬件關系緊密的部分。 設備可以按照數據組織、資源分配、數據傳輸率分類。 數據組織&#xff1a;分為塊設備&#xff08;ex. 磁盤&#xff09;、字符設備(ex. 打印機)。資源分配&#…

網絡安全滲透有什么常見的漏洞嗎?

弱口令與密碼安全問題 THINKMO 01 暴力破解登錄&#xff08;Weak Password Attack&#xff09; 在某次滲透測試中&#xff0c;測試人員發現一個網站的后臺管理系統使用了非常簡單的密碼 admin123&#xff0c;而且用戶名也是常見的 admin。那么攻擊者就可以通過暴力破解工具&…

PSDK的編譯與ROS包封裝

本文檔講述在NIVIDIA開發板上使用大疆提供的Payload SDK獲取無人機實時GPS信息的方法&#xff0c;以及基于Payload SDK發布ROS GPS話題信息的方法。 文章目錄 0 實現目標1 Payload SDK1.1 PSDK 源碼的編譯1.2 PSDK 的使用 2 遙測數據的讀取2.1 示例代碼結構2.2 讀取機載GPS信息…

模型 課題分離

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思維模型目錄。明確自我與他人責任。 1 課題分離的應用 1.1課題分離在心理治療中的應用案例&#xff1a;李曉的故事 李曉&#xff0c;一位28歲的軟件工程師&#xff0c;在北京打拼。他面臨著工作、家庭和感情的多重…

1222面經

1&#xff0c;Kafka 如何保障順序消費? Kafka 保障順序消費主要通過以下幾個關鍵機制和配置來實現&#xff1a; 分區策略 Kafka 將主題劃分為多個分區&#xff0c;每個分區內的消息是天然有序的&#xff0c;其按照消息發送到分區的先后順序進行存儲和追加。生產者在發送消息…

sed命令中單引號的處理

sed中’‘之間的單引號&#xff08;即單引號之間的單引號字符&#xff09;&#xff0c;特殊處理需要’“”’ &#xff08;兩個單引號中兩個雙引號再最里面是目標一個單引號&#xff09; 比如&#xff1a; sed -i s#<a id""img_logo"" href"http…

語音增強的損失函數選擇

一、最優尺度不變信噪比&#xff08;OSISNR&#xff09;損失函數 參考&#xff1a;論文解讀 --Optimal scale-invariant signal-to-noise ratio and curriculum learning for monaural multi-spea ??最優尺度不變信噪比&#xff08;OSI-SNR&#xff09;是一種用于評估信號質量…

【置信區間】之Python實現

置信區間是統計學中的一個核心概念,用于估計總體參數(如均值、比例等)的取值范圍。以下是對置信區間的詳細解釋: 一、定義與基本概念 定義:置信區間是指由樣本統計量所構造的總體參數的估計區間。它給出了參數真實值有一定概率落在該區間內的范圍,反映了測量值的可信程度…

大恒相機開發(3)—大恒相機工業檢測的實際案例

大恒相機工業檢測的實際案例 工業檢測的實際案例圖像采集性能優化技巧工業環境下的穩定性 工業檢測的實際案例 以下是一些使用大恒相機進行工業檢測的實際案例&#xff1a; 多特征光學成像系統&#xff1a; 在這個案例中&#xff0c;使用大恒相機構建了一個全方位、多特征的圖…

Java基礎面試題20:Java語言sendRedirect()和forward()方法有什么區別?

Java基礎面試題&#xff1a;Java語言sendRedirect()和forward()方法有什么區別&#xff1f; 在 Java Web 開發中&#xff0c;sendRedirect() 和 forward() 是兩個非常常用的方法&#xff0c;但它們有一些核心區別。我們來用最簡單的方式給你解釋清楚。 一、sendRedirect() 和 …

go官方日志庫帶色彩格式化

go默認的 log 輸出的日志樣式比較難看&#xff0c;所以通過以下方式進行了美化和格式化&#xff0c;而且加入了 unicode 的ascii碼&#xff0c;進行色彩渲染。 package mainimport ("fmt""log""os""runtime""strings""…

Linux shell腳本用于常見圖片png、jpg、jpeg、webp、tiff格式批量轉PDF文件

Linux Debian12基于ImageMagick圖像處理工具編寫shell腳本用于常見圖片png、jpg、jpeg、webp、tiff格式批量轉PDF文件&#xff0c;”多個圖片分開生成多個PDF文件“或者“多個圖片合并生成一個PDF文件” 在Linux系統中&#xff0c;使用ImageMagick可以圖片格式轉換&#xff0c…

【C++語言】多態

一、多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是多種形態&#xff0c;具體點就是去完成某種行為&#xff0c;當不同的對象去完成時會產生出不同的狀態。 我們可以舉一個例子&#xff1a; 比如買票這種行為&#xff0c;當普通人買票時&#xff0c;是全價買票&am…

Centos7配置webrtc-streamer環境

Centos7配置webrtc-streamer環境 安裝webrtc-streamer0.7版本 升級gdb 1、yum安裝2、查看gdb版本3.下載待升級的gdb版本4.QA 1、預編譯的時候報錯no acceptable C compiler found in $PATH2、make的時候報錯[all-bfd] Error3、make的時候報錯 升級GCC 1.源碼編譯升級gcc9.3.0…

Vue.js 響應接口

Vue.js 響應接口 引言 Vue.js,作為當前前端開發領域中的佼佼者,以其簡潔、高效和靈活的特點,贏得了廣大開發者的喜愛。其核心功能之一便是響應式系統,它使得數據與視圖之間的同步變得異常簡單。本文將深入探討Vue.js的響應接口,解析其工作原理,并展示如何在實際項目中有…

深入了解藍牙Profile類型與設備的對應關系

在現代技術中,藍牙作為一種無線通信技術,廣泛應用于各種設備之間的短距離通信。不同的設備在連接時使用不同的藍牙Profile(配置文件),每種Profile都為特定的設備功能提供支持,例如音頻流傳輸、語音通話、文件傳輸等。在本文中,我們將詳細介紹藍牙Profile的常見類型及其對…

LLMs之PDF:MinerU(將PDF文件轉換成Markdown和JSON格式)的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之PDF&#xff1a;MinerU(將PDF文件轉換成Markdown和JSON格式)的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 MinerU的簡介 0、日志 1、MinerU 的主要特點 2、已知問題 MinerU 安裝和使用方法 1、MinerU的三種體驗方式 T1、在線演示 T2、快速CPU演示 T3、GPU …

【AIGC】ChatGPT 結構化 Prompt 的高級應用

博客主頁&#xff1a; [小????????] 本文專欄: AIGC | ChatGPT 文章目錄 &#x1f4af;前言&#x1f4af;標識符的使用&#xff08;Use of Identifiers&#xff09;1. #2. <>3. - 或 4. [] &#x1f4af;屬性詞的重要性和應用應用場景 &#x1f4af;具體模塊…

Python繪制圖表

Python提供了多種可視化庫&#xff0c;常用的有matplotlib、seaborn和plotly等。這些庫可以用于繪制各種類型的圖表&#xff0c;如折線圖、散點圖、柱狀圖、餅圖等。 下面是一個使用matplotlib繪制折線圖的示例&#xff1a; python import matplotlib.pyplot as plt # 準備數…