1、按键电灯
KEY0连接PC5,KEY1连接PA15,wake_up连接PA0. 根据这个电路图可知。KEY0和KEY1,按键按下变低电平,要保证不按下是高电平。所以要采用上拉输入,在悬空时默认高电平。WK_UP连接高电平,按键按下高电平,不按下要保持低电平,用下拉输入。 在你的对应的文件目录下面新建一个hardware文件夹
点击 把这个文件夹添加进来 然后点击小槌头 把文件路径添加进来 在Hardware文件夹下新建按键和灯的.c和.h文件 然后开始敲代码
LED.c
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_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)
#define LED1 PDout(2)
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
#endif
Key.c
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
**/
用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;
((SPEED) == GPIO_Speed_50MHz))
3)关于按键
按键抖动需要延时,20us是个合适的时间
4)关于光敏/热敏/红外传感器
|