在我的STM32F103ZET6核心板上有四個按鍵,其中一個是復位按鍵,其余三個原理圖如下圖所示。
其中KEY0和KEY1分別接在PE3和PE4上,然后低有效。WK_UP接在PA0上,高電平有效。而且根據原理圖,在外部電路中是沒有上下拉電阻的,所以我們需要在STM32中設置上下拉電阻。
一樣,因為設置按鍵也是配置IO口工作方式。
main.c
/*******************************************************************************
* 文件名:main.c
* 描 述:
1.按下KEY0,LED0狀態切換
2.按下KEY1,LED1狀態切換
3.按下WK_UP,LED0和LED1狀態切換
* 作 者:小默haa
* 版本號:v1.0
* 日 期: 2019年1月28日
* 備 注:獨立按鍵控制LED點亮
*
*******************************************************************************/
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "sys.h"
int main(void)
{
static u8 flag = 0;
LED_Init();
KEY_Init();
delay_init();
while(1)
{
flag = KEY_Scan(0);
switch(flag)
{
case 1:LED0 = !LED0; break;
case 2:LED1 = !LED1; break;
case 3:LED0 = !LED0; LED1 = !LED1; break;
default:break;
}
}
}
LED.c
#include "led.h"
/*******************************************************************************
* 函數名 :LED_Init
* 輸入值 :無
* 返回值 :無
* 作者 :小默haa
* 時間 :2019年1月26日
* 功能描述:LED初始化
* 備注 :
*******************************************************************************/
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);//設能PB和PE口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0->PB5 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據參數設定參數配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1->PE5 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_Init(GPIOE, &GPIO_InitStructure); //根據參數設定參數配置GPIO
}
LED.h
#ifndef __LED_H__
#define __LED_H__
#include "sys.h"
#define LED0 PBout(5)
#define LED1 PEout(5)
void LED_Init(void);
#endif
key.c
#include "key.h"
/*******************************************************************************
* 函數名 :KEY_Init
* 輸入值 :無
* 返回值 :無
* 作者 :小默haa
* 時間 :2019年1月28日
* 功能描述:按鍵初始化
* 備注 :
*******************************************************************************/
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE);//設能PA和PE口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; //GPIOE3,GPIOE4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置為上拉輸入模式
GPIO_Init(GPIOE, &GPIO_InitStructure); //根據參數設定參數配置GPIOE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //設置為下拉輸入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據參數設定參數配置GPIOA
}
/*******************************************************************************
* 函數名 :KEY_Scan
* 輸入值 :u8 mode
* 返回值 :按鍵值
* 作者 :小默haa
* 時間 :2019年1月28日
* 功能描述:按鍵掃描
* 備注 :mode = 0 -> 不支持按鍵長按
mode = 1 -> 支持按鍵長按
*******************************************************************************/
int KEY_Scan(u8 mode)
{
static u8 key_up = 1; //按鍵彈起標志
if(mode)
key_up = 1; //支持按鍵長按核心代碼
if(key_up && (!KEY0 || !KEY1 || WK_UP)) //檢測到按鍵按下
{
delay_ms(10); //延時10ms消抖
key_up = 0;
if(!KEY0)
return KEY0_PRESS;
else if(!KEY1)
return KEY1_PRESS;
else if(WK_UP)
return WK_UP_PRESS;
}
else if(KEY0 && KEY1 && !WK_UP)
key_up = 1;
return 0;
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "sys.h"
#include "delay.h"
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRESS 1 //KEY0按下
#define KEY1_PRESS 2 //KEY1按下
#define WK_UP_PRESS 3 //WK_UP按下
void KEY_Init(void);
int KEY_Scan(u8 mode);
#endif
上一篇:stm32端口“重映射” &&串口學習
下一篇:STM32F103(庫函數)——點亮LED并且使用軟件延時實現led閃爍
推薦閱讀
史海拾趣
ETERNA公司起源于1856年,由格斯塔夫·羅斯切爾德和約翰·烏爾里希在瑞士的圣伊米爾創立。自成立之初,ETERNA便以精湛的制表工藝和不懈的創新精神聞名于世。公司不斷推出具有劃時代意義的腕表產品,其中最具代表性的是其“五點星座”設計,這一設計成為了品牌的象征,并引領了制表業的新潮流。ETERNA通過不斷的技術創新和設計突破,逐漸在電子行業中嶄露頭角。
隨著全球對環保問題的日益關注,Elcoma公司也積極響應,將環保理念融入到企業的發展戰略中。他們采用環保材料和工藝,減少生產過程中的污染排放,同時推出了一系列環保型電子產品,滿足消費者對環保產品的需求。這種對環保的重視不僅提升了Elcoma的品牌形象,也為企業帶來了可持續發展的動力。
在市場拓展方面,Excelsys公司采取了多元化的戰略。除了深耕國內市場外,公司還積極開拓國際市場,與全球多家知名企業建立了長期穩定的合作關系。這些合作伙伴不僅為Excelsys提供了廣闊的市場空間,還帶來了先進的技術和管理經驗,推動了公司的快速發展。
在市場拓展方面,Excelsys公司采取了多元化的戰略。除了深耕國內市場外,公司還積極開拓國際市場,與全球多家知名企業建立了長期穩定的合作關系。這些合作伙伴不僅為Excelsys提供了廣闊的市場空間,還帶來了先進的技術和管理經驗,推動了公司的快速發展。
ERGOBAHCO公司成立于20世紀90年代初,當時正值電子行業快速發展的黃金時期。公司創始人李明(化名)看準了市場對于高質量電子配件的需求,決定從電子連接器這一細分領域入手。然而,初創時期公司面臨著資金短缺、技術落后等諸多挑戰。李明憑借對市場敏銳的洞察力,成功爭取到了幾筆關鍵的投資,并帶領團隊攻克了一系列技術難關。通過不懈努力,ERGOBAHCO公司逐漸在電子連接器領域站穩了腳跟。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fenpin is port(clk:in std_logic;--輸入時鐘 cmd:in std_logic_vector(7 downto 0);--分頻指令cmd clkout:out std_logic);--輸出時鐘 end fenpin; ...… 查看全部問答∨ |
各位大蝦: 最近要做一個手持設備,需要使用stm32F103的STOP模式,但同時我又開了獨立看門狗,每當我一進入STOP模式看門狗馬上就給我復位了,我怎樣才能在進入STOP模式的時候讓看門狗不起作用啊?… 查看全部問答∨ |
單片機的C語言的卻是個好東西,自學有點難,偶爾在網上看到有個視頻講座.很好.可惜.當時沒有把網給記下來.現在找,可就是找不到了.那位仁兄如果知道有這方面的視頻講座,請告訴我約.在下謝謝你了!… 查看全部問答∨ |
|
在TI或者RFSTORM電池板BB運行上Light_switch程序 以前的帖子,重新整理到這個版面。 在TI或者RFSTORM電池板BB運行上TI CC2530CC2530-Software Examples中light_switch程序的方法。ZBDC51BB(SMARTRF05BB)板和ZBDC51MB(SMARTRF05EB)最主要的區別就是有沒有LCD顯示。TI的Light_Switch默 ...… 查看全部問答∨ |
|
8051系統中 mov a,#83h mov ip ,a 問:執行以上程序后,中斷優先級高的是————————;中斷優先級低的是————————————————;… 查看全部問答∨ |