按鍵KEY

首先查看原理圖
(1)管腳連接PA0
(2)key應設置浮空輸入模式
(3)檢測按鍵是否按下時,應該有一個延時消抖操作(防止按鍵非人爲因素造成電位變化)

寄存器版

//管腳配置
void key_config(void)
{
	//GPIOA時鐘 
	RCC->APB2ENR |=(0X01<<2);
	//浮空輸入模式  0100
	GPIOA->CRL &=~(0X0f<<0);
	GPIOA->CRL |=(0X04<<0);
}
//功能函數
u8 key_ing(void)
{     
	u8 val=0;
	//if條件爲真,那麼GPIOA->IDR&(0x01<<0) 爲假,(0x01<<0)爲真,則GPIOA->IDR爲假時進入if選擇
	// 即GPIOA->IDR的第0位輸入低電平(0)  按鍵按下時進入if選擇
	if(!(GPIOA->IDR &(0x01<<0))) 
	{
		delay_nms(10);//延時10ms(消抖)  目的就是爲了消除外部因素造成單片機震動,從而導致按鍵一瞬間的接觸
		if(!(GPIOA->IDR &(0x01<<0)))//延時之後如果依然檢測到按鍵按下,那麼按鍵就是真的按下了
		{
			val=1;
		}
	}
	return val;
}

在main函數調用之前,爲了方便操作,先定義兩個關於LED的宏定義
這是利用了三目運算符
x?(GPIOB->ODR &=~(0X01<<1)):(GPIOB->ODR |=(0X01<<1))
如果x爲真(x!=0),那麼輸出“:”之前的語句:GPIOB->ODR &=~(0X01<<1) 點亮LED
如果x爲假(x=0),那麼輸出“:”之後的語句:GPIOB->ODR |=(0X01<<1) 關閉LED
pb1(x)

#define pb1(x) x?(GPIOB->ODR &=~(0X01<<1)):(GPIOB->ODR |=(0X01<<1))
#define pc5(x) x?(GPIOC->ODR &=~(0X01<<5)):(GPIOC->ODR |=(0X01<<5))
int main(void)
{
	u8 key_flag = 0;//作爲按鍵控制LEd亮滅的標誌
	led_config();
	key_config();
	if(key_ing()==1)//key_ing();的返回值 代表按鍵按下  條件滿足  進入if選擇
		{
			switch(key_ing())
			{
				case 1:key_flag=~key_flag;//點亮LED
						pb1(key_flag);
						pc5(key_flag);
						break;
				default:key_flag=0;break; 
			}
		}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章