|
按鍵輸入函數(shù)步驟(PA0)
1.初始化
根據(jù)電路設(shè)計決定浮空,上拉,下拉
輸出
//PA0--浮空輸入
GPIOA->MODER &=~(0x03<<0);
GPIOA->PUPDR &=~(0x03<<0);
2.讀取IO口電平值
GPIOA->IDR&(0x01<<0)
3.去抖
3.1延時去抖(效果不好)
3.2優(yōu)化:多次操作:
讀取函數(shù)內(nèi)部設(shè)定條件,當(dāng)設(shè)定條件滿足多次才確定按下
//第一次進(jìn)來 key_c!=key_b key_b==key_a==0xaa times==1
//第二次進(jìn)來 key_c!=key_b key_b==key_a==KEY2_OK times==2
//第三次進(jìn)來 key_c== key_b==key_a==KEY2_OK times==3
key_c=key_b;
key_b=key_a;
按鍵按下就給key_a賦值。
if(KEY1)//KEY1
{
key_a=KEY1_OK;
}
if(key_a==key_b&&key_b==key_c)//三次檢測到高電平說明按鍵真的被按下了
{
key_sta=0;
key_ret=key_a;
4.按鍵松開
4.1用while(1)等待松開(效果不好)
4.2優(yōu)化:設(shè)立狀態(tài)機(jī)
1)讀按鍵函數(shù)設(shè)定狀態(tài)為 static u8 key_sta=1;
當(dāng)滿足(key_sta=1&&按鍵電平符合按下)
進(jìn)入判斷函數(shù)內(nèi)部,返回值,置狀態(tài)機(jī)key_sta=0;
2)當(dāng)結(jié)束一次按鍵按下判斷后,第一層判斷函數(shù)設(shè)狀態(tài)機(jī)key_sta=1;
u8 Key_Scanf(void)
{
static u8 key_sta=1; //當(dāng)key_sta為1時允許做按鍵識別 ,為0不許做按鍵識別
if( (!(GPIOE->IDR&(0x01<<2))) && (key_sta==1))//允許做按鍵識別并且有按鍵被按下
{
Key_delay( );// 延時消抖(3~5ms) ---死等
if( !(GPIOE->IDR&(0x01<<2)) )//重新再讀取IDR寄存器,如果仍然讀到高電平,
{
//說明按鍵是真的被按下去
key_sta=0;
return 2;//按鍵被按下
}
}
else if( (GPIOE->IDR&(0x01<<2)) )//沒有按鍵被按下
{
key_sta=1;
}
return 0;//沒有按鍵被按下
}
優(yōu)化設(shè)計解放CPU,不會卡死在某一個點(diǎn)上。
晚點(diǎn)上傳完整代碼
|
評分
-
查看全部評分
|