STM32按键控制开关灯

2018/4/1

STM32

1.按键操作的原理

1.在stm32f103rc中,存在三个按键(不包括复位),分别为key0(PC5),key1(PA15),wkup(PA0),按下key0和key1时对应的io口输出低电平,按下wkup对应io口输出高电平

2.所以可以采用库函数读取io口的电平,从而用不同的情况来控制灯的开闭

GPIO_ReadInputDataBit(GPIOX,GPIO_PIN_a)读取相应接口电平

#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRES 1 //KEY0
#define KEY1_PRES 2 //KEY1
#define WKUP_PRES 3 //wkup

3.实现按键的初始化和扫描功能

		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
		GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
		//防止串口复用
	
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
		
		GPIO_Init(GPIOA,&GPIO_InitStructure);
		//³õʼ»¯PC5
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
		GPIO_Init(GPIOC,&GPIO_InitStructure);
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	}

4.实现按键扫描

    1.建立static变量,从而实现短按按钮功能

    2.短按按钮:首先扫描上一次的电平,如果为关闭状态(说明没按),然后再进行下一次操作

    3.长按按钮:重新创建一个变量,实现长按按钮功能(函数中途不存在间断)

    4.注意消抖

	u8 KEY_Scan(u8 mode)//扫描
	{
			static u8 key_up=1;
			if(mode)key_up=1;
			if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
			{
				delay_ms(10);
				key_up=0;
				if(KEY0==0)return KEY0_PRES;
				else if(KEY1==0)return KEY1_PRES;
				else if(WK_UP==1)return WKUP_PRES; 
		
			}
			else if
			(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
			return 0;
		
		
		}

5.主函数部分

//reset , wk_up(PA0),KEY0(PC5),KEY1(PA15)
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "LED.H"
void LED_init(void);
void key_init();
int main(void)
{
u8 t;
delay_init(); 
LED_Init(); 
KEY_Init(); 
GPIO_SetBits(GPIOA,GPIO_Pin_8);//¶ÔÓÚPA8Êä³ö¸ßµçƽ
GPIO_SetBits(GPIOD,GPIO_Pin_2);//¶ÔÓÚPD2Êä³ö¸ßµçƽ
	
while(1)
{
t=KEY_Scan(0); 
switch(t)
{
case KEY0_PRES:
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//low
break;
case KEY1_PRES:
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//low
break;
case WKUP_PRES:
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//low
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//low
break;
default:
delay_ms(10);
}
}
}




阅读更多

没有更多推荐了,返回首页