main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "key.h"
uint8_t keynumber;
int main(void)
{
//初始化外设
LED_Init();
key_init();
while(1)//死循环
{
keynumber=key_getnumber();//读取按键输入
if(keynumber==1)//按键1→led0
{
LED0_Negation();//取反led0当前输出
}
if(keynumber==2)//按键2→led1
{
LED1_Negation();//取反led1当前输出
}
}
}
led.c
#include "stm32f10x.h" // Device header
void LED_Init(void)//初始化LED外设
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启gpio_a时钟
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体 配置端口模式中一参数
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 高低电平均能驱动
//GPIO_Mode_Out_OD 开漏输出 高电平无驱动能力
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;//使用gpio_a0和gpio_a1
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化gpio
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);//默认高电平熄灭
}
void LED_On(uint16_t GPIO_Pin)
{
GPIO_ResetBits(GPIOA,GPIO_Pin);
}
void LED_Off(uint16_t GPIO_Pin)
{
GPIO_SetBits(GPIOA,GPIO_Pin);
}
void LED0_Negation(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==0)//读取当前gpio_a0输出
{
GPIO_SetBits(GPIOA,GPIO_Pin_0);//取反当前输出
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
}
void LED1_Negation(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)//读取当前gpio_a1输出
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);//取反当前输出
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED_On(uint16_t GPIO_Pin);
void LED_Off(uint16_t GPIO_Pin);
void LED0_Negation(void);
void LED1_Negation(void);
#endif
key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void key_init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启gpio_b时钟
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体 配置端口模式中一参数
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_10;//使用gpio_b0和gpio_b10
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化gpio
}
uint8_t key_getnumber(void)
{
uint8_t keynumber=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)//判断读取输入值
{
Delay_ms(20);//消除机械抖动
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)//若未按动按键,则陷入循环
Delay_ms(20);
keynumber=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0)//判断读取输入值
{
Delay_ms(20);//消除机械抖动
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0)//若未按动按键,则陷入循环
Delay_ms(20);
keynumber=2;
}
return keynumber;
}
key.h
#ifndef __key_h
#define __key_h
void key_init();
uint8_t key_getnumber(void);
#endif
Delay模块前有介绍
运行效果
按键控制led