1、按键点灯
KEY0连接PC5,KEY1连接PA15,wake_up连接PA0.
根据这个电路图可知。KEY0和KEY1,按键按下变低电平,要保证不按下是高电平。所以要采用上拉输入,在悬空时默认高电平。WK_UP连接高电平,按键按下高电平,不按下要保持低电平,用下拉输入。
在你的对应的文件目录下面新建一个hardware文件夹
点击
把这个文件夹添加进来
然后点击小槌头
把文件路径添加进来
在Hardware文件夹下新建按键和灯的.c和.h文件
然后开始敲代码
LED.c
#include "stm32f10x.h" // Device header
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 配置时钟,使能IO口时钟,使能PA,PD端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
//初始化IO参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化IO参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
void LED1_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
LED.h
//防止头文件重复包含
#ifndef __LED_H
#define __LED_H
#define LED0 PAout(8) //PA8
#define LED1 PDout(2) //PA8
//外部声明,可被外部调用
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
#endif
Key.c
#include "stm32f10x.h" // Device header
#include "delay.h"
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 配置时钟,使能IO口时钟,使能PA,PD端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
//初始化IO参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化IO参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
uint8_t Key1_Scan(void)
{
uint8_t keynum = 0;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0)
{
delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0);
delay_ms(20);
keynum = 1;
}
return keynum;
}
uint8_t Key0_Scan(void)
{
uint8_t keynum = 0;
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) == 0)
{
delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) == 0);
delay_ms(20);
keynum = 1;
}
return keynum;
}
Key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key1_Scan(void);
uint8_t Key0_Scan(void);
#endif
有四个函数需要注意。
\STM32F10x_FWLib\inc\stm32f10x_gpio.h 文件中可以找到
这两个是获得输入的位/字节的值
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
这两个是获取输出的位/字节的值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
2、一些有的没的的笔记
1)关于关键字
2)关于一些c语言问题
#define宏定义
用一串字符代替一串字符,便于理解
注意这个不用写;
/*用LED0代替PA_8,用LED1代替PD_2
**/
#define LED0 PAout(8) //PA8
#define LED1 PDout(2) //PD2
#define ABC 12345
用ABC代替12345
typedef 给变量类型换名字
typedef unsigned char uint8_t;
struct结构体
一个数据类型,用于数据打包不同类型变量的集合
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
typedef struct
{
char name;
int age;
}student;
student.name = 2;
enum枚举类型
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \
((SPEED) == GPIO_Speed_50MHz))
3)关于按键
按键抖动需要延时,20us是个合适的时间
4)关于光敏/热敏/红外传感器