微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32F103实现LED灯、按键、定时器编程

STM32F103实现LED灯、按键、定时器编程

时间:11-18 来源:互联网 点击:
#include "delay.h"

#include "sys.h"

#include "LED.h"

#include "key.h"

#include "timer2.h"

/*

程序功能:KEY0按下时,LED0 每秒闪烁一下;同时LED1熄灭(LED0慢闪)。

KEY1按下时,LED1 每秒闪烁二下;同时LED0熄灭(LED0快闪)。

WAKE_UP按下,LED0、LED1都熄灭。

硬件:LED0----GPIOA.8

LED1----GPIOD.2

KEY0----GPIOC.5

KEY1----GPIOA.15

KEY_WAKEUP----GPIOA.0

TIMER2定时器功能。

软件:KEIL5

按键采用状态机实现按键扫描。在定时器中对按键进行处理。

时间:2016.8.9

*/

//全局变量 按键状态机 LED0灯闪烁频率 LED1灯闪烁频率

unsigned char flag_20ms=0x0,flag_500ms=0,flag_250ms=0;

// 按键KEY0按下标志 按键KEY1按下标志

unsigned char flag_key0=0,flag_key1=0;

int main(void)

{

Led_Init();//LED灯初始化

key_init();//KEY按键初始化

Timer2_config(71,2000); //定时两毫秒

while(1)

{

Led_Control(); //LED控制

}

}

#include "sys.h"

#include "delay.h"

#include "key.h"

extern unsigned char flag_20ms;

extern unsigned char flag_key0,flag_key1;

void key_init(void)

{

GPIO_InitTypeDef KEY_InitTypeDef;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);

KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_0;

KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPD;

KEY_InitTypeDef.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&KEY_InitTypeDef);

KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_5;

KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPU;

GPIO_Init(GPIOC,&KEY_InitTypeDef);

KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_15;

KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPU;

GPIO_Init(GPIOA,&KEY_InitTypeDef);

KEY0=1;

KEY1=1;

WK_UP=0;

}

/*

函数功能:按键扫描函数

输入参数:无

输出参数:返回键码。无按键时返回0;

外部变量:

算法:采用软件延时实现按键扫描。

*/

unsigned char KeyScan(void)

{

unsigned char keynum=0;

if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))

{

delay_ms(10);

if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))

{

if(KEY0!=1)

{

while(KEY0!=1);

keynum=1;return keynum;}

else if(KEY1!=1)

{while(KEY1!=1);

keynum=2;return keynum;}

else if(WK_UP!=0)

{while(WK_UP!=0);

keynum=3;return keynum;}

else

return 0;

}

else

return keynum;

}

else

return keynum;

}

/*

函数功能:按键扫描函数

输入参数:无

输出参数:返回键码。无按键时返回0;

外部变量:flag_20ms

算法:采用状态机实现按键扫描。

*/

unsigned char KeyScan2(void)

{

static unsigned char keynum=0,step1=0;

if(flag_20ms==0x01)

{

flag_20ms=0;

switch(step1)

{

case 0:{//状态1:检测是否有按键按下

if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))

step1=1;

else

step1=0;

return 0;

break;

}

case 1:{//状态2:检测是否真的有按键按下

if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))

{

if(KEY0!=1)

{step1=2; keynum=1;}

else if(KEY1!=1)

{step1=2; keynum=2;}

else if(WK_UP!=0)

{step1=2; keynum=3;}

else

{step1=0; }

}

return 0;

break;

}

case 2:{//状态3:检测按键是否弹起

if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))

{step1=2; return 0;}

else

{ step1=0;return keynum;}

break;

}

default :return 0;

}

}

return 0;

}

/*

函数功能:按键功能解析函数

输入参数:无

输入函数:KeyScan2();

输出参数:无

外部变量:flag_key0,flag_key1

*/

void keyfunction(void)

{

unsigned char temp;

temp=KeyScan2();

if(temp>0)

{

switch(temp)

{

case 1:{

flag_key0=1;

break;

}

case 2:{

flag_key1=1;

break;

}

case 3:{

flag_key0=0; flag_key1=0;

break;

}

}

}

}

#include "LED.h"

//位带操作 要用到SYS.H

//#define LED0 PAout(8)

//#define LED1 PDout(2)

//不知道为什么,把 Led_InitTypeDef定义成指

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top