STM32用標準庫編寫按鍵控制LED燈的proteus仿真

首先打開proteus仿真軟件,繪制電路圖:

或是下載我已經建立好的工程修改:

鏈接:https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?pwd=1234?
提取碼:1234

第一步復制整個工程文件夾,就不用重新配置的辛苦了,改個名字直接用:

第二步在工程文件夾中新建一個Mycode文件夾:

在Mycode文件夾中新建6個文件:以后這個文件夾就是我們自己寫的新模塊放到這里了:

這6個文件的內容都很簡單:下面一個一個的展示:

Delay.c:

#include "stm32f10x.h"/*** @brief  微秒級延時* @param  xus 延時時長,范圍:0~233015* @retval 無*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;				//設置定時器重裝值SysTick->VAL = 0x00;					//清空當前計數值SysTick->CTRL = 0x00000005;				//設置時鐘源為HCLK,啟動定時器while(!(SysTick->CTRL & 0x00010000));	//等待計數到0SysTick->CTRL = 0x00000004;				//關閉定時器
}/*** @brief  毫秒級延時* @param  xms 延時時長,范圍:0~4294967295* @retval 無*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief  秒級延時* @param  xs 延時時長,范圍:0~4294967295* @retval 無*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 

Delay.h:

#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif

LED.c:

#include "stm32f10x.h"                  // Device headervoid led_init(void)  // led燈的初始化函數
{RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;            GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIOB->ODR = 0xFFFF;
}void LED_set(uint8_t num, uint8_t EN)
{//  如果傳過來的是0  那就設置為0引腳為1或0if(num == 0 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_0);}else if(num == 0 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_0);}//  如果傳過來的是1  那就設置為1引腳為1或0else if(num == 1 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_1);}else if(num == 1 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_1);}//  如果傳過來的是2  那就設置為1引腳為1或0else if(num == 2 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_2);}else if(num == 2 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_2);}//  如果傳過來的是3  那就設置為1引腳為1或0else if(num == 3 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_3);}else if(num == 3 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_3);}//  如果傳過來的是4  那就設置為1引腳為1或0else if(num == 4 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_4);}else if(num == 4 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_4);}//  如果傳過來的是5  那就設置為1引腳為1或0else if(num == 5 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_5);}else if(num == 5 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_5);}//  如果傳過來的是6  那就設置為1引腳為1或0else if(num == 6 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_6);}else if(num == 6 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_6);}//  如果傳過來的是7  那就設置為1引腳為1或0else if(num == 7 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_7);}else if(num == 7 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_7);}//  如果傳過來的是8  那就設置為1引腳為1或0else if(num == 8 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_8);}else if(num == 8 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_8);}//  如果傳過來的是9  那就設置為1引腳為1或0else if(num == 9 && EN == 1){GPIO_SetBits(GPIOB, GPIO_Pin_9);}else if(num == 9 && EN == 0){GPIO_ResetBits(GPIOB, GPIO_Pin_9);}
}

LED.h:

#ifndef __LED_H#define __LED_Hvoid led_init(void);  // 初始化LED點亮需要的一切東西void LED_set(uint8_t num, uint8_t EN);  // 設置LED  參數1是引腳號  參數2是1或0.#endif

key.c:

#include "stm32f10x.h"                  // Device headervoid key_init(void)   // 按鍵初始化函數
{RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;    //  GPIO為上拉模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;            GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);GPIOA->ODR = 0xFFFF;
}
uint8_t key_Get(uint8_t num)
{uint8_t val=0;//如果num==0  就返回引腳0的值if(num == 0){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);}//如果num==1  就返回引腳1的值else if(num == 1){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);}//如果num==2  就返回引腳2的值else if(num == 2){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);}//如果num==3  就返回引腳3的值else if(num == 3){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);}//如果num==4  就返回引腳4的值else if(num == 4){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4);}//如果num==5  就返回引腳5的值else if(num == 5){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);}//如果num==6  就返回引腳6的值else if(num == 6){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);}//如果num==7  就返回引腳7的值else if(num == 7){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);}//如果num==8  就返回引腳8的值else if(num == 8){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);}//如果num==9  就返回引腳9的值else if(num == 9){val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9);}return val;
}

key.h:

#ifndef __KEY_H
#define __KEY_Hvoid key_init(void);          // 按鍵初始化函數uint8_t key_Get(uint8_t num);  // 按鍵值獲取函數   參數:要獲取的引腳號#endif

最后就是書寫main函數了,用來調用自己寫的這些個函數,來實現咱們按下按鍵燈亮的目的:

main.c:

#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "key.h"int main( void )
{led_init();key_init();while(1){if(key_Get(0) == 0)LED_set(0,0);if(key_Get(1) == 0)LED_set(1,0);if(key_Get(2) == 0)LED_set(2,0);if(key_Get(3) == 0)LED_set(3,0);if(key_Get(4) == 0)LED_set(4,0);if(key_Get(5) == 0)LED_set(5,0);if(key_Get(6) == 0)LED_set(6,0);if(key_Get(7) == 0)LED_set(7,0);if(key_Get(8) == 0)LED_set(8,0);if(key_Get(9) == 0)LED_set(9,0);elseGPIOB->ODR = 0XFFFF;}
}

整體在keil中的文件架構為:

現在編譯后把hex文件導入proteus中就能仿真了。

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

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

相關文章

論文閱讀:2017MobileNet V1谷歌輕量化卷積神經網絡

拓展:賈揚清:深度學習框架caffe(Convolutional Architecture for Fast Feature Embedding) 主要貢獻: 深度可分離卷積(Depthwise separable convolution)逐點卷積(Pointwise convo…

C++筆試題(選擇+編程)

個人主頁:Lei寶啊 愿所有美好如期而遇 選擇題 請找出下面程序中有哪些錯誤() int main() {int i 10;int j 1;const int *p1;//(1)int const *p2 &i; //(2)p2 &j;//(3)int *const p3 &i;//(4)*p3 20;//(5)*p2 30;//(6…

LeetCode 刷題 [C++] 第279題.完全平方數

題目描述 給你一個整數 n ,返回 和為 n 的完全平方數的最少數量 。 完全平方數是一個整數,其值等于另一個整數的平方;換句話說,其值等于一個整數自乘的積。例如,1、4、9 和 16 都是完全平方數,而 3 和 11…

#LLM入門|Prompt#2.7_檢查結果_Check_Outputs

引領你了解 如何評估系統生成的輸出。確保在向用戶展示輸出之前,對其質量、相關性和安全性進行嚴格的檢查,以保證我們提供的反饋是準確和適用的。如何運用審查(Moderation) API 來對輸出進行評估如何通過額外的 Prompt 提升模型在展示輸出之前的質量評估…

redis運維

1.備份redis配置文件 cp /etc/redis.conf /etc/redis.conf.bak 2.將redis中不要的注釋和空行刪除 sed -i /^#/d; /^$/d /etc/redis.conf 3.redis配置文件 bing 0.0.0.0 :綁定本機所有網卡 daemonize yes:設置后臺運行 requirepass redispwd…

k8s初始化錯誤

報錯詳情: you can check the kubelet logs for further clues by running: ‘journalctl -u kubelet’ Alternatively, there might be issues with your Kubernetes configuration files or maybe the necessary ports are not opened. Check the status of …

題目 1434: 藍橋杯歷屆試題-回文數字

題目描述: 觀察數字:12321,123321 都有一個共同的特征,無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做:回文數字。 本題要求你找到一些5位或6位的十進制數字。滿足如下要求: 該數字的各個數位…

rust多個mod文件引用和文件夾mod使用注意事項

如果mod文件都在同一級目錄,則直接使用就可以,因為rust文件都是一個隱藏的mod,但是如果mod文件在另外一個目錄下面,就需要在目錄下面聲明一個mod.rs文件,這樣才能將那個目錄識別為一個mod,可以在mod.rs里面…

鴻蒙App開發新思路:小程序轉App

國家與國家之間錯綜復雜,在谷歌的安卓操作系統“斷供”后,鴻蒙系統的市場化&獨立化的道路便顯而易見了。 2024年1月18日,華為宣布,不再兼容安卓的“純血鴻蒙”--HarmonyOS NEXT鴻蒙星河版最終面世,并與2024年Q4正…

如何在阿里云/騰訊云Ubuntu服務器上安裝和配置GNOME桌面環境?

在Ubuntu服務器上安裝和配置GNOME桌面環境,首先需要確保已經安裝了必要的軟件和環境。以下是詳細的安裝和配置步驟: 安裝GNOME桌面環境: 使用命令sudo apt-get install gnome-shell來安裝GNOME桌面窗口管理程序。接著安裝gnome-panel、gnome-…

Flutter Text 下劃線

IntrinsicWidth(child: Column(mainAxisAlignment:MainAxisAlignment.center,children: [Text("工單名稱",style: TextStyle(overflow: TextOverflow.fade,color: AppColors.baseColor,fontSize: 15.sp,// decorationStyle: TextDecorationStyle.dashed),),Container…

馬士超:符合國際標準的沉浸式音頻HOLOSOUND的發展與未來 | 演講嘉賓公布

一、3D音頻 3D 音頻分論壇將于3月27日同期舉辦! 3D音頻技術不僅能夠提供更加真實、沉浸的虛擬世界體驗,跨越時空的限制,探索未知的世界。同時,提供更加豐富、立體的情感表達和交流方式,讓人類能夠更加深入地理解彼此&a…

【Spring云原生】Spring Batch:海量數據高并發任務處理!數據處理縱享新絲滑!事務管理機制+并行處理+實例應用講解

🎉🎉歡迎光臨🎉🎉 🏅我是蘇澤,一位對技術充滿熱情的探索者和分享者。🚀🚀 🌟特別推薦給大家我的最新專欄《Spring 狂野之旅:從入門到入魔》 🚀 本…

不知道RAID/SAN/NAS的小可愛來看看這個吧!

RAID RAID(冗余陣列的獨立磁盤,Redundant Array of Independent Disks)是一種將多個磁盤驅動器組合成一個或多個單元的技術,目的是在提高數據可靠性和/或提升性能的同時,對操作系統隱藏底層的復雜性。簡而言之&#x…

Windows Server 2012 R2 安裝 OpenSSH

1.下載OpenSSH https://github.com/PowerShell/Win32-OpenSSH/releases 2.解壓到路徑 (一定解壓到這個路徑):C:\Program Files\OpenSSH 3.OpenSSH安裝 使用管理員身份打開命令提示符,使用cd命令到步驟2中OpenSSH文件夾的位置&am…

數據庫之間數據遷移工具datax

簡介 DataX 是阿里云 DataWorks數據集成 的開源版本,在阿里巴巴集團內被廣泛使用的離線數據同步工具/平臺。DataX 實現了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databe…

解決ODOO12 恢復數據庫提示內存不夠報錯

1. 現象 點擊 ‘restore database’ 控制臺報錯: 2. 解決措施 a. 進入啟動腳本的文件夾 cd odoo/odoo-12.0/輸入命令 ./odoo-bin --addons-pathaddons --databaseodoo --db_userodoo --db_passwordodoo --db_hostlocalhost --db_port5432 -i INITb. 刷新頁面…

達夢數據庫基礎操作(五): 索引操作

達夢數據庫基礎操作(五): 索引操作 1. 索引操作 1.1 創建索引 # 使用 CREATE INDEX 語句創建普通索引。 CREATE INDEX ind_emp_salary ON employee(salary);1.2 查看創建的索引 # 通過字典表 user_indexes 查看已創建索引的名稱、類型。SELECT table_name, index…

CentOS部署FastDFS+Nginx并實現遠程訪問本地服務器中文件

文章目錄 前言1. 本地搭建FastDFS文件系統1.1 環境安裝1.2 安裝libfastcommon1.3 安裝FastDFS1.4 配置Tracker1.5 配置Storage1.6 測試上傳下載1.7 與Nginx整合1.8 安裝Nginx1.9 配置Nginx 2. 局域網測試訪問FastDFS3. 安裝cpolar內網穿透4. 配置公網訪問地址5. 固定公網地址5.…

CHI協議學習

原始文檔:https://developer.arm.com/documentation/102407/0100/?langen CHI 總線拓撲結構 CHI總線拓撲是實現自定義的,可以是RING/MESH/CROSSBAR的類型; RING 一般適用于中等規模芯片MESH 一般適用于大規模芯片CROSSBAR 一般適用于小規模…