2024.04.19每日收穫之連結串列與邏輯操作

小智001發表於2024-04-19

今日處理工作時遇到了一個問題,操作非連發按鍵時也會喚醒機器,但不會有連發動作,檢視程式碼瞭解到也是歷史遺留問題。
它採用掩碼形式,將多個按鍵鍵值或運算到一起,最後在與收到的按鍵值與運算來檢視該按鍵是否可以連發,這樣有一個弊端,即多個按鍵的按鍵值佔用多個位,會導致非連發按鍵的鍵值也被包裹進或運算後的掩碼裡,導致一直接收按鍵喚醒。如
#define K1 0X01
#define K2 0X02
#define K3 0X0C
#define K4 0X04
#define code=(K1|K2|K3)
判斷函式
if((code&reception)==reception) //reception為實際接收到的按鍵碼值
{//一些處理}
這時會出現K4不在code裡,但是也會進入到判斷函式里,code=00001111,K4=00000100,因為code把K4的鍵值給包含了,導致誤進入判斷函式(如果每個鍵值只佔一bit位,不會發生該現象)。
解決方法如下,不使用掩碼,依次判斷,如下
if((K1==reception)||(K2==reception)||(K3==reception))
{//一些處理}
或者更好的方法,採用連結串列資料,尋表查詢鍵值,如下
#define K1 0X01
#define K2 0X02
#define K3 0X0C
#define K4 0X04
#define num (3)
#define const code[num]={K1,K2,K3}
for(i=0;i<num;i++)
{if(code[i]==reception)
{//一些處理}
}
此時不會再出現誤進入的現象。

相關文章