金牌会员
 
- 积分
- 2655
- 金钱
- 2655
- 注册时间
- 2016-4-4
- 在线时间
- 226 小时
|

楼主 |
发表于 2020-2-24 20:40:57
|
显示全部楼层
采用你的思想,1.一次性采集3个按键(1不按、0按下)状态,延时。共采集4轮。
2.keystate第5排设置为上一次状态:0不按/1短按/2长按
3.根据每列(每个按键的5个值)的switch码表更新状态值
4.按键0状态值*100+按键1状态值*10+按键2状态值*1输出结果
5.主函数根据结果的switch码表执行不同任务
基本实现多个按键短按长按功能,就是长按的开始容易输出短按信号,怎么改进好难
,另外由于初始变量都是数字变量所以输出结果也是数值只能输出100,10等不能输出010,020前面都是0的否则switch识别不了
无法实现双击功能,加入双击整个判断都混乱了
代码在探索板上已验证,需要联系我
u8 KEYnew_Scan()//按键扫描函数
{
static int keystate[5][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
for (int i = 0; i < 4; i++)
{
keystate[0]=KEY0;
keystate[1]=KEY1;
keystate[2]=KEY2;
delay_ms(200);
}
for (int p = 0; p < 3; p++)
{
switch(keystate[4][p]*10000+keystate[0][p]*1000+keystate[1][p]*100+keystate[2][p]*10+keystate[3][p]*1)
{//每个键值状态:0不按1短按/2长按
case 0:keystate[4][p]=2;break;
case 1000:keystate[4][p]=2;break;
case 100:keystate[4][p]=1;break;
case 10:keystate[4][p]=1;break;
case 1:keystate[4][p]=2;break;
case 1100:keystate[4][p]=1;break;
case 11:keystate[4][p]=1;break;
case 110:keystate[4][p]=1;break;
case 1001:keystate[4][p]=1;break;
case 1010:keystate[4][p]=1;break;
case 101:keystate[4][p]=1;break;
case 1111:keystate[4][p]=0;break;
case 111:keystate[4][p]=1;break;
case 1011:keystate[4][p]=1;break;
case 1101:keystate[4][p]=1;break;
case 1110:keystate[4][p]=1;break;
case 10000:keystate[4][p]=2;break;
case 11000:keystate[4][p]=2;break;
case 10100:keystate[4][p]=1;break;
case 10010:keystate[4][p]=1;break;
case 10001:keystate[4][p]=2;break;
case 11100:keystate[4][p]=1;break;
case 10011:keystate[4][p]=1;break;
case 10110:keystate[4][p]=1;break;
case 11001:keystate[4][p]=1;break;
case 11010:keystate[4][p]=1;break;
case 10101:keystate[4][p]=1;break;
case 11111:keystate[4][p]=0;break;
case 10111:keystate[4][p]=1;break;
case 11011:keystate[4][p]=1;break;
case 11101:keystate[4][p]=1;break;
case 11110:keystate[4][p]=1;break;
case 20000:keystate[4][p]=2;break;
case 21000:keystate[4][p]=2;break;
case 20100:keystate[4][p]=1;break;
case 20010:keystate[4][p]=1;break;
case 20001:keystate[4][p]=2;break;
case 21100:keystate[4][p]=1;break;
case 20011:keystate[4][p]=2;break;
case 20110:keystate[4][p]=1;break;
case 21001:keystate[4][p]=1;break;
case 21010:keystate[4][p]=1;break;
case 20101:keystate[4][p]=1;break;
case 21111:keystate[4][p]=0;break;
case 20111:keystate[4][p]=2;break;
case 21011:keystate[4][p]=1;break;
case 21101:keystate[4][p]=1;break;
case 21110:keystate[4][p]=1;break;
default :{keystate[4][p]=0;break;}
}
}
return keystate[4][0]*100+keystate[4][1]*10+keystate[4][2]*1;
}
main()//主函数
{
solve=KEYnew_Scan();
if(solve!=0)
{
switch(solve)
{//每个键值状态:0不按1短按/2长按
case 100:{printf("100");printf("\r\n\r\n");USART_RX_STA=0;break;}
case 10:{printf("010");printf("\r\n\r\n");USART_RX_STA=0;break;}
case 1:{printf("001");printf("\r\n\r\n");USART_RX_STA=0;break;}
case 11:{printf("011");printf("\r\n\r\n");USART_RX_STA=0;break;}
case 111:{printf("111");printf("\r\n\r\n");USART_RX_STA=0;break;}
case 200:{printf("200");printf("\r\n\r\n");mp3_play(4);printf("\r\n\r\n");USART_RX_STA=0;break;}
case 210:{printf("210");printf("\r\n\r\n");USART_RX_STA=0;break;}
case 220:{printf("220");printf("\r\n\r\n");USART_RX_STA=0;break;}
default :{}
}
}
delay_ms(200);
}
|
|