首先查看原理圖
(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;
}
}
}