還不知道檢測輸入電平信號用什么輸入模式?
就簡單的記住:
檢測埠輸入低電平0要用上拉 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
檢測埠輸入高電平1要用下拉 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
你不知道你外接按鍵的原理圖,不知道檢測什么電平?
最簡單的方法:
用電壓表黑接地,紅接輸入端,一測便知,
沒有外部按鍵模塊?
騷操作:‘’所有的IO口都是外部按鍵‘’!
你甚至可以直接用杜邦線接VCC或地來模擬輸入高低電平,起到按鍵效果,
看過第一篇你應該知道怎么初始化GPIO了
所以只講一些新技巧,也就是上面三點,
下面是每一點的解釋,
檢測輸入電平信號用什么輸入模式?

PE2/PE3/PE4 按下后接地,輸入為0,所以用上拉
PA0 按下后通3.3V電壓,輸入為1,所以用下拉
你不知道你外接按鍵的原理圖,不知道檢測什么電平?
你可以在模塊上分清 VCC(中間) 和GND(—),那剩下的 Signal(S) 就是輸入到STM32引腳來檢測電平的,
用電壓表檢測
GND和Signal兩端電壓電壓3.3V
按下后為0
這不跟上面內置的3個按鍵一樣嗎?
所以用上拉輸入
水銀傾斜檢測模塊
用電壓表檢測
GND和Signal兩段電壓電壓3.3V

水銀將內部連通之后 指示燈點亮
GND和Signal兩端電壓電壓0
跟以上按鍵類比 是一樣的道理

沒有外部按鍵模塊?
按鍵的檢測不就是檢測一個引腳的高低電平嗎?
你可以直接:
上拉一個引腳
用杜邦線接地就是一次按鍵
下拉一個引腳
用杜邦線接VCC也是一次按鍵
如果你不想外部按鍵在PA6 想改成PE9 怎么辦?
只需把初始化與PA6相關的做修改
以下為相關代碼
只需改這3處 也必須要同時全部改掉這3處
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*-----------------------
檔案名稱:main.c
檔案描述:按鍵控制LED閃爍,按下按鍵
S1取反LED2,
S2取反LED3,
S4同時取反LED2,LED3
The_Key(外部按鍵)使LED2,LED3閃爍5次
---------------------------*/
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
int main(void)
{
uint8_t j; //定義變數 用于后面for回圈
LED_Init();//LED初始化
KEY_Init();//內置按鍵初始化
The_Key_Init();//外部按鍵初始化
Daley_Init();//延時初始化
while (1)
{
if(!S1)
{
Delay_ms(10);
//延遲消抖 51單片機教程按鍵中已講過
if(!S1)
{
while(!S1);//等待按鍵釋放
LED2_REV;
}
}
if(!S2)
{
Delay_ms(10);
if(!S2)
{
while(!S2);
LED3_REV;
}
}
//按鍵3類比1、2 此處省略
if(S4)
{
Delay_ms(10);
if(!The_Key)
{
while(!The_Key);
LED2_REV;
LED3_REV;
}
}
//外接按鍵PA6
//你也可以直接用杜邦線接VCC或地來模擬輸入高低電平 起到按鍵效果
if(!The_Key)
{
Delay_ms(10);
if(S4)
{
while(S4);
for(j=0;j<10;j++)
{
LED2_REV;
LED3_REV;
Delay_ms(100);
}
}
}
}
}
/*------------------------------
檔案名稱:key.c
檔案描述:配置按鍵初始化引數
--------------------------------*/
#include "key.h"
void KEY_Init(void)//內部按鍵 PE2/PE3/PE4/PA0
{
GPIO_InitTypeDef GPIO_InitStructure;
//打開PE口時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
//PE2,PE3,PE4引腳設定
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
//埠速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//埠模式,此為輸入上拉模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//初始化對應的埠
GPIO_Init(GPIOE, &GPIO_InitStructure);
//PA0、PA6引腳設定
//打開PA口時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//埠速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//埠模式,此為輸入下拉模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
//初始化對應的埠
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void The_KEY_Init(void)//外部按鍵 我用PA6去讀取
{
GPIO_InitTypeDef GPIO_InitStructure;
//打開PA口時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//PA0引腳設定
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
//埠速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
// 埠輸入低電平0要上拉 輸入高電平1要下拉
//埠模式,此為輸入上拉模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//初始化對應的埠
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*------------------------------
檔案名稱:key.h
--------------------------------*/
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
#define S1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define S2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define S3 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define S4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define The_Key GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
void KEY_Init(void);
void The_KEY_Init(void);
#endif
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293255.html
標籤:其他
下一篇:MQTT協議與EMQ
