乙個按鍵程式的思考

2021-08-04 08:52:24 字數 3013 閱讀 4759

2017.07.26 程式筆記

今天思考乙個關於按鍵的程式:結構體如下

if(pc_get_key(&key)==ture)

}

思考了一下,這個可以作為電堆按鍵檢測的乙個大體的框架,結合基本的按鍵處理程式,就可以實現功能
if(0 == io_keyenter)     //如果有鍵按下了 

else 

while(0 == io_keyenter) ; //等待按鍵釋放 

}

下面是基本的c51處理按鍵的一部分
因為51微控制器i/o口內部結構的限制,在讀取外部引腳狀態的時候,

需要向埠寫1,在51微控制器復位後,不需要進行此操作也可以進行讀

取外部引腳的操作。因此,在按鍵的埠沒有復用的情況下,可以省略此

步驟。而對於其它一些真正雙向i/o口的微控制器來說,將引腳設定成輸入

狀態,是必不可少的乙個步驟。

//初始化引腳為輸入 

void keyinit(void) 

//根據按鍵硬體連線定義按鍵鍵值 

#define key_value_1   0x0e 

#define key_value_2   0x0d 

#define key_value_3   0x0b 

#define key_value_4   0x07 

#define key_null      0x0f

下面我們來編寫按鍵的硬體驅動程式。

根據第一章所描述的按鍵檢測原理,我們可以很容易的得出如下的**:

static uint8 keyscan(void) 

其中io_key_1等是我們按鍵埠的定義,如下所示:
sbit io_key_1 = p3 ^ 0 ; 

sbit io_key_2 = p3 ^ 1 ; 

sbit io_key_3 = p3 ^ 2 ; 

sbit io_key_4 = p3 ^ 3 ;

keyscan()作為底層按鍵的驅動程式,為上層按鍵掃瞄提供乙個介面,這樣我們編寫的上層按鍵掃瞄函

數可以幾乎不用修改就可以拿到我們的其它程式中去使用,使得程式復用性大大提高。同時,通過有意識

的將與底層硬體連線緊密的程式和與硬體無關的**分開寫,使得程式結構層次清晰,可移植性也更好。

對於微控制器類的程式而言,能夠做到函式級別的**重用已經足夠了。

在編寫我們的上層按鍵掃瞄函式之前,需要先完成一些巨集定義。

//定義長按鍵的tick數,以及連發間隔的tick數 

#define key_long_period     100 

#define key_continue_period 25 

//定義按鍵返回值狀態(按下,長按,連發,釋放) 

#define key_down        0x80 

#define key_long        0x40 

#define key_continue    0x20 

#define key_up          0x10 

//定義按鍵狀態 

#define key_state_init          0 

#define key_state_wobble        1 

#define key_state_press         2 

#define key_state_long          3 

#define key_state_continue      4 

#define key_state_release       5 

接著我們開始編寫完整的上層按鍵掃瞄函式,按鍵的短按,長按,連按,釋放等等狀態的判斷均是在

此函式中完成。對照狀態流程轉移圖,然後再看下面的函式**,可以更容易的去理解函式的執行流程。

完整的函式**如下:

void getkey(uint8 *pkeyvalue) 

} break; 

case key_state_wobble:   //消抖 

break; 

case key_state_press: 

else 

} break; 

case key_state_long: 

} else 

} break; 

case key_state_continue:

} else 

} break; 

case key_state_release: 

break; 

default: 

break; 

} *pkeyvalue = keytemp; //返回鍵值 

} 關於這個函式內部的細節我並不打算花過多筆墨去講解。對照著按鍵狀態流程轉移圖,然後去看程式

**,你會發現其實思路非常清晰。最能讓人理解透徹的,莫非就是將整個程式自己看懂,然後想象為什

麼這個地方要這樣寫,抱著思考的態度去閱讀程式,你會發現自己的程式水平會慢慢的提高。所以我更希

望的是你能夠認認真真的看完,然後思考。也許你會收穫更多。

不管怎麼樣,這樣的乙個程式已經完成了本章開始時候要求的功能:按下,長按,連按,釋放。事實

上,如果掌握了這種基於狀態轉移的思想,你會發現要求實現其它按鍵功能,譬如,多鍵按下,功能鍵等

等,亦相當簡單,在下一章,我們就去實現它。

乙個小程式引發的思考

既然是乙個小程式引發的思考,那麼我們就先看看這個小程式,看看他有何神奇之處 i s.val,i mymethod s,i console.writeline s.val i s.val,i console.read static void mymethod myclass f1,int f2 cla...

乙個程式設計師的思考

讀書筆記系列鏈結位址 最近被一件事情虐的不行,晚上想著跑個步散散心,跑著跑著腦子裡就有了那麼一點小想法,遂將其記錄下來。乙個正常人的一生或者做一件事情就像乙個ln函式,ln函式是乙個凸函式,雖然一次導數是大於0的,但是二次導數卻是小於0,意味著一次導數一直在減小,帶來的結果就是值增加的越來越緩慢。以...

乙個程式設計師的哲學思考

關於程式設計 1.和世界格局一樣,軟體開發裡也是多維力量 商業 公司政治 技術等 在衝突,單純地鬥爭和避讓其實都不太行。2.很多時候人們爭論是因為都不清楚問題自身。比如 軟體工廠可能麼?軟體和工廠都是巨大且模糊的概念,a或b的理解中又為之注入了各自色彩,所以即使討論激烈,卻可能說的根本不是乙個東西。...