一个按键扫描算法


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. }