按键控制LED
把两个按键分别接在PB11、PB1上面,两个LED接在PA1和PA2上面
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t keynum;
//全局变量,用来存键码的返回值,与局部变量作用域不同
//局部变量只能在本函数使用,全局变量每个函数都可使用
//在函数里优先使用自己的局部变量,如果没有才会使用外部的全局变量
int main(void)
{
LED_Init(); //完成led的初始化,默认低电平
Key_Init(); //初始化按键
while(1)
{
keynum = key_Getnum(); //不断读取键码值,放在keynum变量里
if(keynum == 1) //按键1按下
{
LED1_Turn(); //电平翻转,led状态取反,需用到GPIO_readoutput函数
}
if(keynum == 2) //按键2按下
{
LED2_Turn();
}
}
}
Led.c
#include "stm32f10x.h" // Device header
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开时钟
GPIO_InitTypeDef GPIO_InitStructure; //结构体变量名GPIO_InitStructA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //GPIO-MODE_OUT_OD 开漏输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; //用按位或选择多个引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //使用的是地址传递,将指定的GPIO外设初始化好
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); //初始化led是高电平,熄灭状态
}
void LED1_ON(void) //点亮LED1
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1); //低电平点亮
}
void LED1_OFF(void) //熄灭LED1
{
GPIO_SetBits(GPIOA, GPIO_Pin_1); //高电平熄灭
}
void LED1_Turn(void) //LED1状态取反,电平翻转
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
//GPIO_ReadOutputDataBit,来读取端口输出的是什么
{
GPIO_SetBits(GPIOA, GPIO_Pin_1); //状态取反,0变1
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1); //状态取反,1变0
}
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
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);
}
}
Led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_Turn(void);
void LED2_Turn(void);
#endif
Key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void) //按键初始化函数
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //打开时钟
GPIO_InitTypeDef GPIO_InitStructure; //结构体变量名GPIO_InitStructB
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO_Mode_IPU上拉输入,按键未按时默认高电平
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
uint8_t key_Getnum(void) //读取按键值的函数
{
uint8_t keynum = 0; //按键键码,没有按下,就返回0,局部变量
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)
//读取GPIO端口,返回值就是输入数据寄存器的某一位值,等于0代表按键按下
{
Delay_ms(20); //按键按下消抖20ms
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0); //松开按键
Delay_ms(20); //消抖
keynum = 1; //键码为1
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0) //按键按下
{
Delay_ms(20); //消抖
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);
Delay_ms(20);
keynum = 2;
}
return keynum;
}
Key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t key_Getnum(void);
#endif
光敏传感器控制蜂鸣器
Main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
int main(void)
{
Buzzer_Init(); //初始化蜂鸣器
LightSensor_Init(); //初始化光敏传感器
while(1)
{
if(LightSensor_Get() == 1) //光线暗,指示灯不亮
{
Buzzer_ON(); //蜂鸣器响
}
else
{
Buzzer_OFF(); //蜂鸣器不响
}
}
}
Buzzer.c
#include "stm32f10x.h" // Device header
void Buzzer_Init(void) //初始化蜂鸣器函数
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开启时钟
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
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);
}
void Buzzer_Turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
else
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
}
Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_H
void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);
#endif
LightSensor.c
#include "stm32f10x.h" // Device header
void LightSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
uint8_t LightSensor_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
LightSensor.h
#ifndef __LIGHTSENSOR_H
#define __LIGHTSENSOR_H
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif