void key_Service(void)
{
// 采用轮询方法每100ms扫描一次开关状态,如果不变计数器清零进入下一次轮询,
if(glTime.Scan_Count >= 100)
{
CurrentFlag = Key_Scan();
if( CurrentFlag != PreiousFlag ) // 检查当前的 CurrentFlag 是否与上一次相同
{
switch(CurrentFlag)
{
case 1:
GPIO_Write(1,INA1); /* INA1高电平保持100ms */
GPIO_Write(1,INB2); /* INB2高电平保持100ms */
delay_Tim_ms(150); /* 延时100ms */
GPIO_Write(0,INA1); /* INA1低电平保持 */
GPIO_Write(0,INB2); /* INB2低电平保持 */
break;
case 0:
GPIO_Write(1,INB1); /* INB1高电平保持100ms */
GPIO_Write(1,INA2); /* INA2高电平保持100ms */
delay_Tim_ms(150); /* 延时100ms */
GPIO_Write(0,INB1); /* INB1低电平保持 */
GPIO_Write(0,INA2); /* INA2低电平保持 */
break;
}
PreiousFlag = CurrentFlag;
}
glTime.Scan_Count = 0;
}
}
/*
函 数 名 称 :Key_Scan()
函 数 功 能 :按键扫描函数,返回值0或1 代表开关的大小电流两种状态
返 回 值 :0 或 1
*/
int Key_Scan(void)
{
int state = 0;
if(PinRead_Key() == key_left) // 读IO口状态
{
delay_Tim_ms(30); // 延时消抖
if(PinRead_Key() == key_left) // 再读一次IO状态
{
state = key_left;
}
}
else if(PinRead_Key() == key_right)
{
delay_Tim_ms(30);
if(PinRead_Key() == key_right)
{
state = key_right;
}
}
return state;
}
这是部分控制程序
|