**
要求:当按键按下的时候,对LED的状态进行取反
装备:电脑,MDK5,STM32F103ZET6开发板,USB线
**
**
首先自己配置一个工程模板,如下所示**
第二步:电路图
第三步:写代码
主函数:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
int main(void)
{
delay_init(); //延时函数初始化
Led_Init(); //LED初始化
key_init(); //按键初始化
while(1)
{
key1();
}//判断按键是否按下,按键按下所执行的程序
}
按键函数:
#include "key.h"
#include "delay.h"
#include "led.h"
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO的结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//开启GPIOE使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//使用GPIOE.2引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置GPIOE的工作模式为带上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE寄存器
}//按键初始化函数
void key1(void)
{
if(KEY1==0)//判断按键是否按下,如果按下则满足KEY1==0,否则继续判断按键是否按下
{
delay_ms(500);//按键消抖程序和防止按键是误触的
if(KEY1==0)//再次判断按键是否按下
{
LED1=!LED1;//如果按下则执行按键取反(利用逻辑取反)
}
}
}//按键按下所执行程序
LED初始化:
#include "led.h"
#include "stm32f10x.h"
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO的结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//打开GPIOC的时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置GPIOC的端口,使用GPIOC.1
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置工作速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//普通推挽输出模式
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC寄存器
}//LED初始化函数
按键头文件:
#ifndef _key_
#define _key_
#include "sys.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//宏定义GPIOE.2
void key_init(void);
void key1(void);
#endif
LED头文件:
#ifndef _led_
#define _led_
#include "sys.h"
void Led_Init(void);
#define LED1 PCout(1)// LED1等价GPIOC.0
#endif
发现缺少一个延时函数,自己写喽。可以使定时器写,也可以是简单的一个计数器。这里就不多介绍。
第四步:结果
按键的时间得按久一些否则会有问题,主要还是消抖的问题。长按500ms就会出现取反,如果太快就会发现一些很神奇的现象,感觉会自闭的。
最后小小的总结一下:
利用库函数写一个简单的程序也许体会不到他的便捷性,但是慢慢地你就会发现他真的好用。不要放弃学习。emmmmm…大概就这样了。