默认已经建好工程模板
所用开发板:OneNET NB-IoT 开发板 V2.1
1、延时函数
- Delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "stdint.h"
#include "stm32f10x.h"
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
- Delay.c
#include "Delay.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
2、按键控制
- 点位图
- key.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void);
uint8_t key_scan(void);
#endif
- key.c
#include "key.h"
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体
//PC0 - 3
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
/*识别按键*/
uint8_t key_scan(void)
{
uint8_t keynum = 0;
//按键1
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0) //用于检测输入端口电平变化的函数
{
Delay_ms(10);//消抖
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0);//松手检测
Delay_ms(10);
keynum = 1;
}
//按键2
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0) //用于检测输入端口电平的函数
{
Delay_ms(10);//消抖
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0);//松手检测
Delay_ms(10);
keynum = 2;
}
//按键3
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) == 0) //用于检测输入端口电平的函数
{
Delay_ms(10);//消抖
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) == 0);//松手检测
Delay_ms(10);
keynum = 3;
}
//按键4
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) == 0) //用于检测输入端口电平的函数
{
Delay_ms(10);//消抖
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) == 0);//松手检测
Delay_ms(10);
keynum = 4;
}
return keynum ;
}
参考:按键控制led灯灭
3、点灯
- led.h
#ifndef _LED_H_
#define _LED_H_
#include "Delay.h"
#include "stm32f10x.h"
#include "key.h"
void led_init(void);
void led_run(uint32_t s);//跑马灯
void led_key(uint8_t key_value);//按键控制led灯
#endif
- led.c
#include "led.h"
void led_init(void){
GPIO_InitTypeDef GPIO_InitStructure;
//PA4 -- 7
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*跑马灯*/
void led_run(uint32_t s){
GPIO_SetBits(GPIOA,GPIO_Pin_4);
Delay_s(s);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
Delay_s(s);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
Delay_s(s);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
Delay_s(s);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
/*按键控制led灯亮灭*/
void led_key(uint8_t key_value){
if(key_value == 1)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4) == 0) //用于检测输出端口电平的函数
{
GPIO_SetBits(GPIOA,GPIO_Pin_4); //置为高电平
}
else
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//置为低电平
}
if(key_value == 2)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5) == 0) //用于检测输出端口电平的函数
{
GPIO_SetBits(GPIOA,GPIO_Pin_5); //置为高电平
}
else
GPIO_ResetBits(GPIOA,GPIO_Pin_5);//置为低电平
}
if(key_value == 3)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_6) == 0) //用于检测输出端口电平的函数
{
GPIO_SetBits(GPIOA,GPIO_Pin_6); //置为高电平
}
else
GPIO_ResetBits(GPIOA,GPIO_Pin_6);//置为低电平
}
if(key_value == 4)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_7) == 0) //用于检测输出端口电平的函数
{
GPIO_SetBits(GPIOA,GPIO_Pin_7); //置为高电平
}
else
GPIO_ResetBits(GPIOA,GPIO_Pin_7);//置为低电平
}
}
4、主函数
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "Delay.h"
#include "led.h"
#include "key.h"
uint8_t key_value;//判断按键
int main(void)
{
led_init();
Key_Init();
while (1) {
key_value=key_scan();//按键判断
led_key(key_value);//点亮对应的led
}
}