一个按键扫描算法
1. int i=0,port,trigger,continues=0,cnt=0;
2. int trigger_long=0;
3. uint32_t last_keys=0,this_keys=0;
4.
5. while(1){
6. for(port=0xFF,i=0;i<ARRAY_SIZE(g_keys);i++){
7. if(GPIO_ReadInputDataBit(g_keys[i].port, g_keys[i].gpio)==1){
8. port &= ~g_keys[i].val;
9. }
10. }
11. this_keys = port;
12. if(last_keys == this_keys){
13. port = port ^ 0xFF;
14. trigger = port & (port^continues);
15. /* 只要按键没有松开,这个值永远是0x01 */
16.
17. if(trigger){
18. //trace_debug(MID_KEY,"press 0x%X\r\n",trigger);
19. trigger_long |= trigger;
20. }
21.
22. if(continues){
23.
24. if(++cnt == 200){
25. "long press 0x%X\r\n",continues);
26. trigger_long = 0;
27. }
28. else{
29. cnt = 0;
30. if(trigger_long){
31. "press 0x%X\r\n",trigger_long);
32. trigger_long = 0;
33. }
34. }
35. }
36. last_keys = this_keys;
37. }