1. 程式人生 > >STM32F103學習筆記(一):簡單的按鍵程式

STM32F103學習筆記(一):簡單的按鍵程式

通過幾個按鍵,來控制LED燈的開關狀態。沒有涉及到中斷,只是簡單的按鍵程式

程式包括key.c,key.h;led.c,led.h;以及main函式

一、LED程式

led.h

#ifndef __LED__H
#define __LED__H

#include "stm32f10x.h"
#include "sys.h"

#define LED1 PBout(8)// PB8
#define LED2 PBout(9)// PB9

void LED_Init(void);


#endif

led.c

#include "stm32f10x.h"
#include "led.h"

void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_8);
	GPIO_SetBits(GPIOB,GPIO_Pin_9);
}

二、KEY程式

按鍵採用上拉輸入,外接上拉電阻

key.h

#ifndef __KEY__H
#define __KEY__H
#include "sys.h"
#include "stm32f10x.h"

#define S1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)//讀取按鍵1
#define S2  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)//讀取按鍵2
#define S3  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)//讀取按鍵3
#define S4  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)//讀取按鍵4

#define KEY_ON 0
#define KEY_OFF 1


void KEY_Init(void);
u8 KEY_Scan(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);

#endif

key.c

#include "key.h"
#include "delay.h"

void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

	//開啟PA口時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
	//埠速度
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	//埠模式,此為輸入上拉模式
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}

u8 KEY_Scan(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
{
	/*檢查是否有按鍵按下*/
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
	{
		/*延時消抖*/
		delay_ms(50);
		if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
		{
			/*等待按鍵釋放*/
			while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
			return KEY_ON;
		}
		else
			return KEY_OFF;
	}
	else
		return KEY_OFF;
}

主函式

#include "key.h"
#include "led.h"
#include "delay.h"
#include "sys.h"

//LED燈閃5下

int main(void)
{
	u8 i;
	LED_Init();//LED初始化
  KEY_Init();//按鍵初始化
  delay_init();//延時初始化
	
	
	
	while(1)
	{
		LED1=1;
		LED2=1;
		if(KEY_Scan(GPIOA,GPIO_Pin_3) == KEY_ON)
		{
			for(i=0;i<5;i++)
			{
				LED1=1;delay_ms(200);
				LED1=0;delay_ms(200);
			}
			
		}
		if(KEY_Scan(GPIOA,GPIO_Pin_4) == KEY_ON)
		{
			for(i=0;i<5;i++)
			{
				LED2=1;delay_ms(100);
				LED2=0;delay_ms(100);
				LED1=1;delay_ms(100);
				LED1=0;delay_ms(100);
			}
				
		}
	}
}


程式很簡單,通過掃描GPIO埠電平的狀態,來判斷按鍵是否按下