3-4 ~ 3-5 GPIO輸入
視頻選集(8/50)[3-4] 按鍵控制LED&光敏傳感器控制蜂鳴器
0. GPIO讀取-庫(kù)函數(shù)
/**
* @brief 讀取指定 輸入GPIO 的數(shù)據(jù)值
* @param GPIOx: 指定GPIO
* @retval GPIO輸入數(shù)據(jù)值
*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
/**
* @brief 讀取指定 輸出GPIO 的數(shù)據(jù)值
* @param GPIOx: 指定GPIO
* @retval GPIO輸出數(shù)據(jù)值
*/
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
/**
* @brief 讀取指定的輸入端口
* @param GPIOx: 選擇GPIO
* @param GPIO_Pin: 指定端口
* @retval 指定端口的輸入電平
*/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/**
* @brief 讀取指定的輸出端口
* @param GPIOx: 選擇GPIO
* @param GPIO_Pin: 指定端口
* @retval 指定端口的輸出電平
*/
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
1. 按鍵控制LED
1.1器件
- STM32最小系統(tǒng)板
- ST-LINK V2下載器
- LED*2
- 按鍵*2
1.2 實(shí)現(xiàn)目標(biāo)
- 在LED1熄滅的情況下,按下key1,LED1亮起;在LED1點(diǎn)亮的情況下,按下key1,LED1熄滅;
- 在LED2熄滅的情況下,按下key2,LED2亮起;在LED2點(diǎn)亮的情況下,按下key2,LED2熄滅;
1.3 配置工程文件
注.模塊化編程更加便于管理和移植
- 創(chuàng)建
Hardware文件夾,用來(lái)存放硬件驅(qū)動(dòng),將LED.h、LED.c、Key.h、Key.c放在該文件夾下
1.4 接線圖
注.我沒有按照?qǐng)D中的IO口來(lái)接LED和按鍵,具體看程序代碼

1.5 程序
main.c文件如下:
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "Key.h"
/*------------------------------主函數(shù)------------------------------*/
int main(void)
{
/*-----變量聲明和初始化-----*/
uint8_t key_flag = 0;
/*-----硬件初始化-----*/
LED_Init();
Key_Init();
/*-----輸出控制-----*/
while(1){
key_flag = Key_Read();
LED_Turn(key_flag);
key_flag = 0; // 清除標(biāo)志位
}
}
LED.c文件如下:
#include "stm32f10x.h" // Device header
/*------------------------------LED初始化函數(shù)(低電平有效)------------------------------
@LED1 A1
@LED2 A6
*/
void LED_Init(void)
{
/*-----變量聲明-----*/
GPIO_InitTypeDef GPIO_InitStruct; // 定義包含配置參數(shù)的結(jié)構(gòu)體變量
/*-----時(shí)鐘使能-----*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 開啟GPIOA的時(shí)鐘
/*-----端口配置-----*/
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 通用推挽輸出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的所有端口
/*-----初始化熄滅-----*/
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_6); // A1, A6端口輸出高電平
}
/*------------------------------LED翻轉(zhuǎn)函數(shù)------------------------------
@brief 使指定LED控制引腳的輸出電平翻轉(zhuǎn),從而控制LED的亮滅
@param LED_no: 選擇LED。該參數(shù)可以是以下值
@arg 1: LED1
@arg 2: LED2
*/
void LED_Turn(uint8_t LED_no)
{
/*-----變量聲明和初始化-----*/
uint8_t temp_state = 0; // 存儲(chǔ)讀取到的電平值
uint16_t temp_pin = 0; // 存儲(chǔ)引腳地址
/*-----輸出控制-----*/
if(LED_no == 1){
temp_pin = GPIO_Pin_1;
}
if(LED_no == 2){
temp_pin = GPIO_Pin_6;
}
temp_state = GPIO_ReadOutputDataBit(GPIOA, temp_pin); // 讀取
if(temp_state){
GPIO_ResetBits(GPIOA, temp_pin); // 高電平置反
}else{
GPIO_SetBits(GPIOA, temp_pin); // 低電平置反
}
}
LED.h文件如下:
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED_Turn(uint8_t LED_no);
#endif
Key.c文件如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
/*------------------------------按鍵初始化函數(shù)(低電平有效)------------------------------
@key1 B0
@key2 B1
*/
void Key_Init(void)
{
/*-----變量聲明-----*/
GPIO_InitTypeDef GPIO_InitStruct; // 定義包含配置參數(shù)的結(jié)構(gòu)體變量
/*-----時(shí)鐘使能-----*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 開啟GPIOB的時(shí)鐘
/*-----端口配置-----*/
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入:懸空時(shí)默認(rèn)高電平
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*------------------------------按鍵讀取函數(shù)------------------------------
@brief 通過參數(shù)傳遞按鍵狀態(tài)數(shù)組
*/
uint8_t Key_Read(void)
{
if(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))){ // 【key1被按下】
Delay_ms(20); // 按下按鍵消抖
while(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))); // 未松開時(shí)阻塞
Delay_ms(20); // 松開按鍵消抖
return 1;
}
if(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1))){ // 【key2被按下】
Delay_ms(20); // 按下按鍵消抖
while(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1))); // 未松開時(shí)阻塞
Delay_ms(20); // 松開按鍵消抖
return 2;
}
return 0;
}
Key.h文件如下:
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_Read(void);
#endif
2. 光敏控制蜂鳴器報(bào)警
2.1 器件
- STM32最小系統(tǒng)板
- ST-LINK V2下載器
- 蜂鳴器
- 光敏傳感器
2.2 實(shí)現(xiàn)目標(biāo)
- 光線正常,蜂鳴器不報(bào)警
- 光線被遮擋,蜂鳴器報(bào)警
2.3 接線圖
注.我沒有按照?qǐng)D中的IO口來(lái)接線,具體看程序代碼

2.4 程序
main.c文件如下:
#include "stm32f10x.h" // Device header
#include "Sensor_Light.h"
#include "Buzzer.h"
/*------------------------------主函數(shù)------------------------------*/
int main(void)
{
/*-----變量聲明-----*/
uint8_t sensor_light_state;
/*-----硬件初始化-----*/
Sensor_Light_Init();
Buzzer_Init();
/*-----輸出控制-----*/
while(1){
sensor_light_state = Sensor_Light_Read();
if(!sensor_light_state){ // 光線正常,輸出低電平:蜂鳴器不發(fā)聲,DO-LED亮
Buzzer_Control(OFF);
}
if(sensor_light_state){ // 光線被遮擋,輸出高電平:蜂鳴器響,DO-LED滅
Buzzer_Control(ON);
}
}
}
Sensor_Light.c文件如下:
#include "stm32f10x.h" // Device header
/*------------------------------光敏傳感器初始化函數(shù)------------------------------
@DO A1
*/
void Sensor_Light_Init(void)
{
/*-----變量聲明-----*/
GPIO_InitTypeDef GPIO_InitStruct; // 定義包含配置參數(shù)的結(jié)構(gòu)體變量
/*-----時(shí)鐘使能-----*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 開啟GPIOA的時(shí)鐘
/*-----端口配置-----*/
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入:懸空時(shí)默認(rèn)高電平
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化A1端口
}
/*------------------------------讀取光敏傳感器當(dāng)前輸出電平函數(shù)------------------------------
@return 0/1
*/
uint8_t Sensor_Light_Read(void)
{
return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); // 返回讀取值
}
Sensor_Light.h文件如下:
#ifndef __SENSOR_LIGHT_H
#define __SENSOR_LIGHT_H
void Sensor_Light_Init(void);
uint8_t Sensor_Light_Read(void);
#endif
Buzzer.c文件如下:
#include "stm32f10x.h" // Device header
#include "Buzzer.h"
/*------------------------------蜂鳴器初始化函數(shù)(低電平有效)------------------------------
@I/O:B0
*/
void Buzzer_Init(void)
{
/*-----變量聲明-----*/
GPIO_InitTypeDef GPIO_InitStruct; // 定義包含配置參數(shù)的結(jié)構(gòu)體變量
/*-----時(shí)鐘使能-----*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 開啟GPIOB的時(shí)鐘
/*-----端口配置-----*/
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出,默認(rèn)低電平
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化B0端口
/*-----初始化-----*/
GPIO_SetBits(GPIOB, GPIO_Pin_0); // 輸出高電平
}
/*------------------------------蜂鳴器控制函數(shù)------------------------------
@brief 控制蜂鳴器的開/關(guān)
@param buzzer_state: 選擇狀態(tài)。該參數(shù)可以是以下值
@arg 1: ON
@arg 2: OFF
*/
void Buzzer_Control(BuzzerState_TypeDef buzzer_state)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)buzzer_state);
}
Buzzer.h文件如下:
#ifndef __BUZZER_H
#define __BUZZER_H
typedef enum
{
ON = 0,
OFF = 1
}BuzzerState_TypeDef;
void Buzzer_Init(void);
void Buzzer_Control(BuzzerState_TypeDef buzzer_state);
#endif
本文來(lái)自博客園,作者:LI,Yi-han,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/LiYi-han/p/19026826

浙公網(wǎng)安備 33010602011771號(hào)