藍橋杯嵌入式備賽(三)—— LED +按鍵 + LCD

目錄

  • 一、LED
    • 1、原理圖介紹
    • 2、程序代碼
  • 二、按鍵
    • 1、原理圖介紹
    • 2、程序代碼
  • 三、LCD
    • 1、原理圖介紹
    • 2、程序代碼

一、LED

1、原理圖介紹

??如果所示,STM32G431RBT6中有八個LED,由八個GPIO控制,分別為PC8-15,當輸出為低電平時點亮。其中,74HC573(U1)表示為鎖存器,當鎖存器打開的時候,右側GPIO的輸出(即鎖存器的輸入D)可以通過鎖存器到達左側(即鎖存器的輸出Q)。加鎖存器的目的是由于PC8-15引腳有復用功能,當作為其他功能使用時,防止影響LED。
在這里插入圖片描述
??74HC573芯片內部結構圖如下圖所示,LE引腳高電平有效,OE則低電平有效。在上面圖中,OE已經接地,所以PD2控制的LE輸入為高電平時鎖存器打開,低電平時鎖存器關閉
在這里插入圖片描述

2、程序代碼

// led.h
#ifndef __LED_H__
#define __LED_H__extern void LED_Init(void);						
extern void LED_Disp(unsigned char uch);
extern void LED_Tog(unsigned char uch);#endif
// led.c
#include "led.h"
#include "main.h"void LED_Init(void)
{//此處省略 CUBEMX自動生成代碼
}
void LED_Disp(unsigned char uch)
{// 先將八個LED置為高電平,熄滅,然后鎖存器打開關閉HAL_GPIO_WritePin(GPIOC, 0xff << 8, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);// 將uch8中為1的bit位點亮,然后鎖存器打開關閉HAL_GPIO_WritePin(GPIOC, uch << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}void LED_Tog(unsigned char uch)
{// 將uch8中為1的bit位反轉HAL_GPIO_TogglePin(GPIOC, uch << 8);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
// main.c
#include "main.h"
#include "led.h"void SystemClock_Config(void);// 示例代碼
int main(void)
{HAL_Init();SystemClock_Config();LED_Init();while (1){LED_Disp(0xaa);HAL_Delay(2000);LED_Tog(0x03);HAL_Delay(2000);LED_Tog(0xff);HAL_Delay(2000);}
}

二、按鍵

1、原理圖介紹

??如果所示,STM32G431RBT6中有4個按鍵,由4個GPIO控制,分別為PB0、PB1、PB2和PA0當按鍵按下時GPOIO為低電平
在這里插入圖片描述

2、程序代碼

編寫程序有三步:

  1. 在key.c中編寫key_scan函數,返回哪個按鍵被按下;
  2. 定義變量:嘀嗒定時器開始值,四個key變量(unsigned char);
  3. 在main.c中編寫key_proc函數,經典四行:
   key_val = KEY_Scan();key_down = key_val & (key_val ^ key_old);key_up = ~key_val & (key_val ^ key_old);key_old = key_val;

以下是完整程序代碼:

// key.h
#ifndef __KEY_H__
#define __KEY_H__extern void KEY_Init(void);
extern unsigned char KEY_Scan(void);#endif
// key.c
#include "key.h"
#include "main.h"void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin : PA0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pins : PB0 PB1 PB2 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}unsigned char KEY_Scan()
{unsigned char key_num = 0;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){key_num = 1;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET){key_num = 2;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET){key_num = 3;}else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){key_num = 4;}else{key_num = 0;}return key_num;
}
// main.c
#include "main.h"
#include "led.h"
#include "key.h"//定義變量
__IO uint32_t uwTick_start;		
unsigned char key_val, key_down, key_up, key_old;//定義函數
void SystemClock_Config(void);
void key_proc(void);int main(void)
{HAL_Init();SystemClock_Config();LED_Init();KEY_Init();while (1){key_proc();}
}void key_proc(void)
{//按鍵消抖if(uwTick - uwTick_start < 100) return;uwTick_start = uwTick;//四行key_val = KEY_Scan();key_down = key_val & (key_val ^ key_old);key_up = ~key_val & (key_val ^ key_old);key_old = key_val;//正式程序if(key_down == 4){LED_Tog(0xff);}if(key_down == 1)LED_Disp(0x00);}

三、LCD

1、原理圖介紹

在這里插入圖片描述

2、程序代碼

?? 只需要將原有程序進行遷移即可。下面sprintf作用是:將key_num的值寫入lcd-disp,然后將lcd_disp強轉為(u8 *)進行顯示。

char lcd_disp[21];sprintf(lcd_disp, "     i num: %03d      ", key_num);
LCD_DisplayStringLine(Line4, (u8 *)lcd_disp);

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

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

相關文章

深入剖析 HTML5 新特性:語義化標簽和表單控件完全指南

系列文章目錄 01-從零開始學 HTML&#xff1a;構建網頁的基本框架與技巧 02-HTML常見文本標簽解析&#xff1a;從基礎到進階的全面指南 03-HTML從入門到精通&#xff1a;鏈接與圖像標簽全解析 04-HTML 列表標簽全解析&#xff1a;無序與有序列表的深度應用 05-HTML表格標簽全面…

[Java基礎]函數式編程

Lambda函數 JDK8新增的語法形式, 使用Lambda函數替代某些匿名內部類對象&#xff0c;從而讓程序代碼更簡潔&#xff0c;可讀性更好。 基本使用 lambda表達式只能簡化函數式接口的匿名內部類寫法 // 1.定義抽象類 abstract class Animal {public abstract void crt(); }publi…

Vue通過觸發與監聽事件進行數據傳遞: 子組件調用 $emit 方法來將數據傳遞給父組件。

文章目錄 引言I 組件事件事件參數defineEmits 宏聲明需要拋出的事件事件校驗例子:子組件告訴父組件放大所有博客文章的文字II 【詳細說明】 子組件通過觸發一個事件,將數據傳遞給父組件調用內建的 `$emit `方法傳入事件名稱來觸發一個事件子組件通過`this.$emit`來觸發一個事…

Vim 多窗口編輯及文件對比

水平分割 :split 默認使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 帶文件的分割 :split 文件名 :sp 文件名 在光標所在的窗口&#xff0c;輸入分割窗口命令就會對那個窗口進行分割。 切換窗口 Ctrlw 切換正在編輯的窗口 快速分割窗口 Ctrlwn 快速分割當前…

“衛星-無人機-地面”遙感數據快速使用及地物含量計算的實現方法

在與上千學員交流過程中&#xff0c;發現科研、生產和應用多源遙感數據時&#xff0c;能快速上手&#xff0c;發揮數據的時效性&#xff0c;盡快出創新性成果&#xff0c;是目前的學員最迫切的需求。特別是按照“遙感數據獲取-處理-分析-計算-制圖”全流程的答疑解惑&#xff0…

二級C語言題解:十進制轉其他進制、非素數求和、重復數統計

目錄 一、程序填空&#x1f4dd; --- 十進制轉其他進制 題目&#x1f4c3; 分析&#x1f9d0; 二、程序修改&#x1f6e0;? --- 非素數求和 題目&#x1f4c3; 分析&#x1f9d0; 三、程序設計&#x1f4bb; --- 重復數統計 題目&#x1f4c3; 分析&#x1f9d0; 前言…

使用服務器部署DeepSeek-R1模型【詳細版】

文章目錄 引言deepseek-r1IDE或者終端工具算力平臺體驗deepseek-r1模型總結 引言 在現代的機器學習和深度學習應用中&#xff0c;模型部署和服務化是每個開發者面臨的重要任務。無論是用于智能推薦、自然語言處理還是圖像識別&#xff0c;如何高效、穩定地將深度學習模型部署到…

讓相機自己決定拍哪兒!——NeRF 三維重建的主動探索之路

我在 NeRF 中折騰自動探索式三維重建的心得 寫在前面&#xff1a; 最近我在研究三維重建方向&#xff0c;深切感受到 NeRF (Neural Radiance Fields) 在學術界和工業界都備受矚目。以往三維重建通常要依賴繁瑣的多視圖幾何管線&#xff08;比如特征匹配、深度估計、網格融合等&…

央行發布《貿易金融分布式賬本技術要求》,參考架構包括5部分

《銀行科技研究社》(作者 木子劍):2024年12月11日,中國人民銀行發布金融行業標準《貿易金融分布式賬本技術要求》(JR/T 0308-2024)(以下簡稱“《要求》”),當日實施。據悉,該文件的起草單位包括6大行和多家股份制銀行等。 《要求》規定了分布式賬本技術在貿易金融領域…

管理etcd的存儲空間配額

如何管理etcd的存儲空間配額 - 防止集群存儲耗盡指南 本文基于etcd v3.4官方文檔編寫 為什么需要空間配額&#xff1f; 在分布式系統中&#xff0c;etcd作為可靠的鍵值存儲&#xff0c;很容易成為系統瓶頸。當遇到以下情況時&#xff1a; 應用程序頻繁寫入大量數據未及時清理…

調用騰訊云批量文本翻譯API翻譯srt字幕

上一篇文章介紹了調用百度翻譯API翻譯日文srt字幕的方法。百度翻譯API是get方式調用&#xff0c;參數都放在ur中&#xff0c;每次調用翻譯文本長度除了接口限制外&#xff0c;還有url長度限制&#xff0c;而日文字符通過ur轉碼后會占9個字符長度&#xff0c;其實從這個角度來講…

Python aiortc API

本研究的主要目的是基于Python aiortc api實現抓取本地設備媒體流&#xff08;攝像機、麥克風&#xff09;并與Web端實現P2P通話。本文章僅僅描述實現思路&#xff0c;索要源碼請私信我。 1 demo-server解耦 1.1 原始代碼解析 1.1.1 http服務器端 import argparse import …

記錄 | WPF基礎學習Style局部和全局調用

目錄 前言一、Style1.1 例子1.2 為樣式起名字1.3 BasedOn 繼承上一個樣式 二、外部StyleStep1 創建資源字典BaseButtonStyle.xamlStep2 在資源字典中寫入StyleStep3 App.xaml中寫引用路徑【全局】Step4 調用三、代碼提供四、x:Key和x:Name區別 更新時間 前言 參考文章&#xff…

如果$nextTick內部拋出錯誤,如何處理?

如果 $nextTick 內部拋出錯誤,可以通過在回調函數中使用 try…catch 語句來捕獲和處理這些錯誤。由于 $nextTick 是異步執行的,因此錯誤不會直接影響到 Vue 的運行,但捕獲錯誤可以幫助你進行更好的錯誤處理和調試。 一、使用 try…catch 以下是如何在 $nextTick 中捕獲錯誤…

吳恩達深度學習——卷積神經網絡實例分析

內容來自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;僅為本人學習所用。 文章目錄 LeNet-5AlexNetVGG-16ResNets殘差塊 1*1卷積 LeNet-5 輸入層&#xff1a;輸入為一張尺寸是 32 32 1 32321 32321的圖像&#xff0c;其中 32 32 3232 3232是圖像的長和寬&…

Spring Boot 自動裝配原理與優化實踐

在 Java 開發領域&#xff0c;Spring Boot 以其 “約定優于配置” 的理念&#xff0c;極大地簡化了 Spring 應用的開發和部署過程&#xff0c;成為了眾多開發者的首選框架。它通過自動裝配機制&#xff0c;讓開發者能夠快速搭建一個功能完備的應用&#xff0c;而無需進行繁瑣的…

【Uniapp-Vue3】z-paging插件組件實現觸底和下拉加載數據

一、下載z-paing插件 注意下載下載量最多的這個 進入Hbuilder以后點擊“確定” 插件的官方文檔地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文檔中向下滑動&#xff0c;會有使用方法。 使用z-paging標簽將所有的內容包起來 配置標簽中的屬性 在s…

【B站保姆級視頻教程:Jetson配置YOLOv11環境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11環境&#xff08;7&#xff09;Ultralytics YOLOv11環境配置 文章目錄 1. 下載YOLOv11 github項目2. 安裝ultralytics包3. 驗證ultralytics安裝3.1 下載yolo11n.pt權重文件3.2 推理 1. 下載YOLOv11 github項目 創建一個目錄&#xff0c;用于存放YOLOv11的項目…

第二天:系統從BIOS/UEFI到GRUB/bootloader的啟動過程

目錄 **一、BIOS/UEFI初始化階段****二、引導加載程序&#xff08;GRUB&#xff09;的啟動過程****1. BIOS模式下的GRUB分階段加載****2. UEFI模式下的GRUB加載** **三、操作系統內核加載與初始化****四、關鍵組件與配置文件****五、故障排查與恢復****總結**常見問題如何在UEF…

es官方go客戶端創建ik索引并進行查詢操作

es-go client引入gomod go get github.com/elastic/go-elasticsearch/v8latest連接es服務器&#xff08;不經過安全校驗) cfg : elasticsearch.Config{Addresses: []string{"http://localhost:9200",}, } es, err : elasticsearch.NewClient(cfg) if err ! nil {pa…