STM32F103學習筆記(一):簡單的按鍵程式
阿新 • • 發佈:2019-01-27
通過幾個按鍵,來控制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埠電平的狀態,來判斷按鍵是否按下