一、按键控制LED
程序逻辑就是使用输入寄存器读取函数GPIO_ReadInputDataBit来读取寄存器端口对应位的电平,按键按下后翻转电平。
接线图
led.c
#include "stm32f10x.h" // Device header
void LED_Init(void) //初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); //高电平,默认熄灭
}
void LED1_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED1_Turn(void) //电平翻转
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0){
GPIO_SetBits(GPIOA,GPIO_Pin_1); //置1
}else {
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //置0
}
}
void LED2_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}else {
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
}
key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t GetKeyNum(void) //获取键值
{
uint8_t KeyNum;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0) //读取输入寄存器端口的值(1-HIGH,0,LOW)
{
Delay_ms(20); //延时消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0); //按键松手检测
Delay_ms(20); //松手延时消抖
KeyNum=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0);
Delay_ms(20);
KeyNum=2;
}
return KeyNum;
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t KeyNum;
int main(void)
{
LED_Init();
Key_Init();
while(1)
{
KeyNum=GetKeyNum();
if(KeyNum==1) //按键按下电平翻转
{
LED1_Turn();
}
if(KeyNum==2)
{
LED2_Turn();
}
}
}
二、光敏传感器控制蜂鸣器
这个程序也很简单,光敏传感器被遮住时灯灭,输出高电平,有光时灯亮,为低电平。只需要用寄存器读取函数来判断高低电平,然后控制蜂鸣器响或不响就行了。
接线图
光敏传感器部分驱动:
#include "stm32f10x.h" // Device header
void Light_Seror_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t Light_Seror_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);
}
蜂鸣器驱动:
#include "stm32f10x.h" // Device header
void Buzzer_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
void Buzzer_ON(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
void Buzzer_OFF(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "Key.h"
#include "Light_Seror.h"
uint8_t KeyNum;
int main(void)
{
Buzzer_Init();
Light_Seror_Init();
while(1)
{
if(Light_Seror_Get()==1){
Buzzer_ON();
}else{
Buzzer_OFF();
}
}
}
stm32的GPIO输入的基本用法就是用读取寄存器函数来获取寄存器对应位的电平,根据电平的变化来实现相应的控制。主要还是四个读取函数的用法。