cortex_m3_stm32嵌入式學習筆記(二):獨立按鍵實驗(IO輸入)

ARM 430瀏覽

上一個也就是第一個實驗做的是關于LED的,屬于IO口的輸出使用,這一節實驗是獨立按鍵的使用,即IO 口的輸入使用

ministm32 開發板上一共有3個獨立按鍵,分別為 KEY0 ?KEY1 WK_UP 原理圖如下:

? ? ? ? ? ?

注意: KEY0 KEY1 是低電平有效(即它們為低電平時代表按鍵按下)而 WK_UP 是高電平有效,為什么呢。。很明顯,這個問題要分析上面的原理圖才能知道的,好吧本渣沒學過數模電電路也就勉強70多分(半本書。。還沒學完),就硬著頭皮來分析一下吧(對錯可不保證啊。。QAQ):很明顯上圖有兩個不認識的符號,GND 和VCC 度娘了一下

GND是接地的意思 就是GND那端的電平為0,而VCC 大概是電壓源(3.3V),意味著VCC端電平為1 首先KEY0,KEY1 都是跟GND接在一塊的,所以它們想要起作用電平肯定是一致的,那么為什么是低電平有效?首先對于開關,想象一下一根導線被一個開關截斷,然后這根導線就斷開了,怎么讓它接起來呢?如果在開關處使得兩點電平一致。。那么這根導線不就連起來了么(。。好像有點牽強ORZ)

ok實在不行就先記住,接下就要配置按鍵了。。新建兩個文件key.c ?key.h導入工程

#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_ist;
	//使能PORTA,PORTC時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); 
	//關閉JTAG 使能SWD
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 
	//PC5-->KEY0
	GPIO_ist.GPIO_Pin=GPIO_Pin_5;
	GPIO_ist.GPIO_Mode=GPIO_Mode_IPU;//上拉輸入
	GPIO_Init(GPIOC, &GPIO_ist);
	//PA15-->KEY1
	GPIO_ist.GPIO_Pin=GPIO_Pin_15;
	GPIO_ist.GPIO_Mode=GPIO_Mode_IPU;//上拉輸入
	GPIO_Init(GPIOA, &GPIO_ist);
	//PA0-->WK-UP
	GPIO_ist.GPIO_Pin=GPIO_Pin_0;
	GPIO_ist.GPIO_Mode=GPIO_Mode_IPD;//下拉輸入
	GPIO_Init(GPIOA, &GPIO_ist);
}
//參數mode:0 代表不支持連續按鍵 非0代表支持連續按鍵
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 WK_UP_PRES;
	}
	else if(KEY0==1&&KEY1==1&&WK_UP==0) key_up=1;
	return 0;
}

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 這個語句。。首先看到KEY1 對應的PA15那個口后面還多了一堆JTDI PS 什么東西的,手冊上說PA15占用了JTAG的一個IO,這條語句是禁止JTAG,開啟SWD 讓PA15用作普通IO輸出(說實話 沒懂)

再看下面那個按鍵掃描函數,由參數決定是否支持連續按鍵,好吧,分析一下不支持連續按鍵的情況吧,假如參數傳入的是0,按下鍵后沒松手,第一次掃描之后,key_up變為0了,注意第二次掃描的時候,由于用靜態關鍵字static key_up并不會重新賦值1(這個可以度娘一下static用法),依舊是0,那么就會返回0,。。之后啥也不會執行了。。

直到松手

接下來寫key.h 主要是一些關鍵字的宏定義

#ifndef _KEY_H
#define _KEY_H
#include "sys.h"
#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
#define KEY1_PRES  2
#define WK_UP_PRES 3
void KEY_Init(void);
u8 KEY_Scan(u8 mode);
#endif

主函數(很簡單的控制。。一眼就能看懂拉)

#include "led.h"
#include "sys.h"
#include "delay.h"
#include "key.h"
int main(void)
{
	u8 t;
	delay_init();
	LED_Init();
	KEY_Init();LED0=0;
	while(1)
	{
		t=KEY_Scan(0);
		switch(t)
		{
			case KEY0_PRES:LED0=!LED0;break;
			case KEY1_PRES:LED1=!LED1;break;
			case WK_UP_PRES:LED0=!LED0;LED1=!LED1;break;
			//default :delay_ms(10);
		}
	}
}

忘記了既然用按鍵控制led當然也要配置led 可以把上次做led實驗寫的led.c led.h 添加的工程里面去

再貼一下吧

led.c

#include "led.h"
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_ist;
	//LED0
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); 
	GPIO_ist.GPIO_Pin=GPIO_Pin_8;//LED0-->PA.8 
	GPIO_ist.GPIO_Mode=GPIO_Mode_Out_PP; 
	GPIO_ist.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_ist);
	GPIO_SetBits(GPIOA,GPIO_Pin_8);
	
	//LED1
	GPIO_ist.GPIO_Pin=GPIO_Pin_2; 
	GPIO_Init(GPIOD,&GPIO_ist);
	GPIO_SetBits(GPIOD,GPIO_Pin_2); 
}

led.h

#ifndef _LED_H
#define _LED_H
#include "sys.h"
#define LED0 PAout(8) //PA 8
#define LED1 PDout(2) //PD 2
void LED_Init(void);
#endif

七星彩走势图2元网官网