初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2019-5-26
- 在线时间
- 15 小时
|
1金钱
个人认为支不支持连按,应该是使用按键的应用应该关系的问题,而不是按键本身,使用延时滤波不太好,下列程序是软件滤波的程序,可根据不同硬件进行滤波,初学STM32不当之处请修改,望正点原子采纳
u8 KEY_Scan_Opt()
{
static u8 key0PreState = 0; //保存上一次工作状态,0表示上一次没有按下
static u8 key1PreState = 0;
static u8 key2PreState = 0;
static u8 wkupPreState = 0;
static u32 key0FilterNum = 0;
static u32 key1FilterNum = 0;
static u32 key2FilterNum = 0;
static u32 wkupFilterNum = 0;
u8 keyStateCom = 0; //按键状态的组合,BIT0:KEY0 BIT1:KEY1 BIT2:KEY2 BIT3:WK_UP 相应的位为1表示按下,位为0表示没有按下
if((key0PreState == 0) && (KEY0 == 0))
{
key0FilterNum++;
}
else
{
key0FilterNum = 0;
}
if(key0FilterNum > 1000)
{
key0PreState = 1;
keyStateCom |= 0x01;
}
else if(key0PreState == 1)
{
if(KEY0 == 0)
{
key0PreState = 1;
keyStateCom |= 0x01;
}
else
{
key0PreState = 0;
keyStateCom &= ~0x01;
}
}
if((key1PreState == 0) && (KEY1 == 0))
{
key1FilterNum++;
}
else
{
key1FilterNum = 0;
}
if(key1FilterNum > 1000)
{
key1PreState = 1;
keyStateCom |= 0x02;
}
else if(key1PreState == 1)
{
if(KEY1 == 0)
{
key1PreState = 1;
keyStateCom |= 0x02;
}
else
{
key1PreState = 0;
keyStateCom &= ~0x02;
}
}
if((key2PreState == 0) && (KEY2 == 0))
{
key2FilterNum++;
}
else
{
key2FilterNum = 0;
}
if(key2FilterNum > 1000)
{
wkupPreState = 1;
keyStateCom |= 0x04;
}
else if(key2PreState == 1)
{
if(KEY2 == 0)
{
key2PreState = 1;
keyStateCom |= 0x04;
}
else
{
key2PreState = 0;
keyStateCom &= ~0x04;
}
}
if((wkupPreState == 0) && (WK_UP == 1))
{
wkupFilterNum++;
}
else
{
wkupFilterNum = 0;
}
if(wkupFilterNum > 1000)
{
wkupPreState = 1;
keyStateCom |= 0x08;
}
else if(wkupPreState == 1)
{
if(WK_UP == 1)
{
wkupPreState = 1;
keyStateCom |= 0x08;
}
else
{
wkupPreState = 0;
keyStateCom &= ~0x08;
}
}
return keyStateCom;
}
void keyProcCtrlLed(u8 key)
{
static u8 led0sta = 1, led1sta = 1; //LED0,LED1的当前状态
static u8 keyPreSta = 0; //上一次按键的状态
if(((keyPreSta & 0x01) == 0x00) && (key & 0x01))
{
led0sta = !led0sta;
led1sta = !led1sta;
}
if(((keyPreSta & 0x02) == 0x00) && (key & 0x02))
{
led1sta = !led1sta;
}
if(((keyPreSta & 0x04) == 0x00) && (key & 0x04))
{
led0sta = !led0sta;
}
if(((keyPreSta & 0x08) == 0x00) && (key & 0x08))
{
led1sta = !led1sta;
led0sta = !led1sta;
}
keyPreSta = key;
LED0(led0sta); //控制LED0状态
LED1(led1sta); //控制LED1状态
}
int main(void)
{
u8 key = 0;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432, 25, 2, 9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
while(1)
{
key = KEY_Scan_Opt();
keyProcCtrlLed(key);
}
}
|
|