本發(fā)明涉及低壓電器領(lǐng)域,特別涉及一種按鍵掃描方法和低壓電器的控制器。
背景技術(shù):
現(xiàn)有智能型的低壓電器,包括斷路器、變頻器、接觸器、繼電器等的控制器,在矩陣鍵盤的掃描方式上,常見的掃描方式分為中斷掃描和定時(shí)掃描方式,中斷掃描以按鍵中斷信號(hào)為掃描入口,定時(shí)掃描以定時(shí)服務(wù)為掃描入口。在現(xiàn)有的按鍵掃描中,按鍵消抖都是采用時(shí)間耗盡的方式進(jìn)行消抖;按鍵值掃描時(shí)只進(jìn)行單一的逐行掃描;在按鍵增加和刪除時(shí),都需要對(duì)軟件進(jìn)行修改,移植性差。
另外,低壓電器的矩陣式鍵盤由于空間限制,通常無法設(shè)置過多的按鍵,而且在使用時(shí)每個(gè)按鍵只能實(shí)現(xiàn)單一的功能,導(dǎo)致無法滿足應(yīng)用的需要,或者需要用戶進(jìn)行多次操作選擇,導(dǎo)致用戶操作過于復(fù)雜。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的缺陷,提供一種按鍵掃描方法,通過對(duì)按鍵進(jìn)行再一次的確認(rèn)過程,實(shí)現(xiàn)按鍵消抖功能,還提供了一種低壓電器的控制器。
為實(shí)現(xiàn)上述目的,本發(fā)明采用了如下技術(shù)方案:
一種按鍵掃描方法,包括以下步驟:
a,判斷消抖時(shí)間是否耗盡,如果耗盡,進(jìn)入步驟b,否則重復(fù)步驟a;
b,獲取具體按鍵值;
c,判斷獲取的按鍵值是否有效;如果掃描到按鍵值為有效按鍵值時(shí),則 進(jìn)行步驟d,如果掃描到的按鍵值為無效按鍵值,則表示沒有獲取到按鍵值,掃描結(jié)束;
d,對(duì)掃描到的按鍵次數(shù)進(jìn)行判斷:掃描到的按鍵次數(shù)不是第一次時(shí),對(duì)掃描到的按鍵次數(shù)和消抖時(shí)間進(jìn)行復(fù)位操作,進(jìn)入步驟e,掃描到的按鍵次數(shù)是第一次時(shí),則保存當(dāng)前獲取的按鍵值,標(biāo)識(shí)按鍵次數(shù)并設(shè)置消抖時(shí)間,進(jìn)入步驟a;
e,對(duì)當(dāng)前獲取的按鍵值進(jìn)行判斷:當(dāng)獲取的按鍵值與上一次獲取的按鍵值相同時(shí),得到掃描的按鍵值,如果獲取的按鍵值與上一次獲取的按鍵值不同,則表示獲取按鍵值無效。
一種低壓電器的控制器,包括按鍵電路和與按鍵電路連接的控制單元,所述控制單元根據(jù)預(yù)設(shè)的掃描時(shí)間定時(shí)采用上述的按鍵掃描方法對(duì)按鍵電路進(jìn)行掃描獲得按鍵值。
進(jìn)一步,所述按鍵電路在按鍵被按下時(shí)向控制單元發(fā)送中斷信號(hào),控制單元在收到中斷信號(hào)后采用權(quán)利要求1所述的按鍵掃描方法對(duì)按鍵電路進(jìn)行掃描獲得按鍵值。
進(jìn)一步,所述按鍵電路包括中斷信號(hào)電路和鍵盤電路,所述鍵盤電路包括按n行n列排列的n*n個(gè)按鍵的矩陣鍵盤,中斷信號(hào)電路用于按鍵值的輸出,所述n*n個(gè)按鍵的矩陣鍵盤的每行按鍵分別通過一根行掃描線連接,每列按鍵分別通過一根列掃描線連接,所述中斷信號(hào)電路包括n個(gè)二極管組成的第一組開關(guān)二極管和另外n個(gè)二極管組成的第二組開關(guān)二極管;所述第二組開關(guān)二極管的正極分別和n列掃描線連接,第二組開關(guān)二極管的負(fù)極分別與電阻r302的一端連接,電阻r302的另一端與三極管q301的基極連接,三極管q301的集電極連接至第n+1個(gè)i/o端口key_int,按鍵電路在按鍵被按下時(shí)通過第n+1個(gè)i/o端口key_int向控制單元發(fā)送中斷信號(hào),三極管q301的發(fā)射極接地;n列掃描線的一端與第一組開關(guān)二極管的n個(gè)二極管的正極連接,第一組開關(guān)二極管的n個(gè)二極管的負(fù)極與n行掃描線連接,n行掃描線與n個(gè)i/o端口(key_p1,……,key_pn)連接。
進(jìn)一步,所述中斷信號(hào)電路的每一根列掃描線通過n個(gè)電阻接地,所述第 n+1個(gè)i/o端口key_int通過第n+1個(gè)電阻接地。
進(jìn)一步,所述中斷信號(hào)電路還包括電阻r301,電阻r301的一端與三極管q301的集電極連接,另一端與3.3v電源正極連接。
進(jìn)一步,掃描到的按鍵值為無效按鍵值后,重新配置引腳功能,將i/o端口key_int以外的i/o端口(key_p1,……,key_pn)都配置為高電平輸出狀態(tài)。
進(jìn)一步,按鍵值掃描時(shí),可以對(duì)任意一行進(jìn)行掃描,或者對(duì)其中幾行進(jìn)行掃描,也可以對(duì)所有行進(jìn)行掃描。
進(jìn)一步,獲取按鍵值時(shí),先將需要掃描的相應(yīng)行的i/o端口設(shè)為輸出,并配置為高電平,再將其余的i/o端口設(shè)為輸入,然后檢測每個(gè)i/o端口的值,再將該數(shù)值加上該行的序號(hào)值,即為相應(yīng)行的值;依次獲取n行的按鍵值,再將獲取到的n行按鍵值組合成一個(gè)值,即為最終獲取到的按鍵值。
本發(fā)明按鍵掃描方法,通過對(duì)按鍵進(jìn)行連續(xù)兩次掃描,并進(jìn)行確認(rèn),只有連續(xù)兩次掃描按鍵值一致時(shí),才認(rèn)為按鍵有效,兩次的掃描間隔時(shí)間大于按鍵抖動(dòng)時(shí)間,從而實(shí)現(xiàn)按鍵消抖功能。
附圖說明
圖1是本發(fā)明中斷掃描方式的流程框圖;
圖2是本發(fā)明定時(shí)掃描方式流程框圖;
圖3是本發(fā)明按鍵掃描方法獲取按鍵值的流程圖;
圖4是本發(fā)明另一種按鍵掃描方法的流程圖;
圖5是本發(fā)明鍵盤電路的電路圖;
圖6是本發(fā)明中斷信號(hào)電路的電路圖。
具體實(shí)施方式
以下結(jié)合附圖1至6給出的實(shí)施例,進(jìn)一步說明本發(fā)明的按鍵掃描方法和 低壓電器的控制器的具體實(shí)施方式。本發(fā)明的按鍵掃描方法和低壓電器的控制器不限于以下實(shí)施例的描述。
本發(fā)明的一種按鍵掃描方法,包括以下步驟:
a,判斷消抖時(shí)間是否耗盡,如果耗盡,進(jìn)入步驟b,否則重復(fù)步驟a;
b,獲取具體按鍵值;
c,判斷獲取的按鍵值是否有效;如果掃描到按鍵值為有效按鍵值時(shí),則進(jìn)行步驟d,如果掃描到的按鍵值為無效按鍵值,則表示沒有獲取到按鍵值,掃描結(jié)束;
d,對(duì)掃描到的按鍵次數(shù)進(jìn)行判斷:掃描到的按鍵次數(shù)不是第一次時(shí),對(duì)掃描到的按鍵次數(shù)和消抖時(shí)間進(jìn)行復(fù)位操作,進(jìn)入步驟e,掃描的按鍵次數(shù)是第一次時(shí),則保存當(dāng)前獲取的按鍵值,標(biāo)識(shí)按鍵次數(shù)并設(shè)置消抖時(shí)間,進(jìn)入步驟a;
e,對(duì)當(dāng)前獲取的按鍵值進(jìn)行判斷:當(dāng)獲取的按鍵值與上一次獲取的按鍵值相同時(shí),得到掃描的按鍵值,如果獲取的按鍵值與上一次獲取的按鍵值不同,則表示獲取按鍵值無效。
本發(fā)明按鍵掃描方法,通過對(duì)按鍵進(jìn)行連續(xù)兩次掃描,并進(jìn)行確認(rèn),只有連續(xù)兩次掃描的按鍵值一致時(shí),才認(rèn)為按鍵有效,兩次的掃描間隔時(shí)間大于按鍵抖動(dòng)時(shí)間,從而實(shí)現(xiàn)按鍵消抖功能。這里的按鍵次數(shù)是指系統(tǒng)內(nèi)部所掃描到的按鍵次數(shù),但未必是用戶實(shí)際按了多次按鍵,因?yàn)椴捎玫氖菕呙璺绞?每間隔一定時(shí)間掃描一次,檢測是否有按鍵按下),故當(dāng)用戶單次按下按鍵的時(shí)間較長時(shí)(超過掃描間隔時(shí)間時(shí))與系統(tǒng)實(shí)際掃描到按鍵次數(shù)并不相同。
如圖1所示,本發(fā)明的按鍵掃描方法的第一種實(shí)施例:中斷掃描方式。
(1)當(dāng)檢測到按鍵中斷信號(hào)后,置中斷標(biāo)志位。
(2)判斷按鍵消抖時(shí)間是否耗盡:如果耗盡當(dāng)按鍵消抖時(shí)間耗盡,掃描具體的按鍵值;否則重復(fù)步驟(2)。
(3)獲取具體按鍵值。
(4)判斷獲取的按鍵值是否有效:如果掃描到的按鍵值為有效按鍵值時(shí),則進(jìn)行有效按鍵次數(shù)判斷;如果掃描到的按鍵值為無效按鍵值,則表示沒有獲取到按鍵值,對(duì)按鍵次數(shù)、掃描標(biāo)志、中斷標(biāo)志進(jìn)行復(fù)位操作。
(5)進(jìn)行按鍵的次數(shù)判斷:按鍵并不是第一次按下時(shí),對(duì)按鍵次數(shù)、掃描 標(biāo)志、中斷標(biāo)志進(jìn)行復(fù)位操作;如果按鍵為第一次按下,則保存當(dāng)前獲取的按鍵值,并將掃描標(biāo)志和中斷標(biāo)志復(fù)位、消抖時(shí)間重置、按鍵次數(shù)加一,然后進(jìn)行步驟(2)。
(6)對(duì)當(dāng)前獲取的按鍵值進(jìn)行判斷:當(dāng)獲取的按鍵值與上一次獲取的按鍵值相同時(shí),將按鍵值進(jìn)行緩存,以備按鍵處理時(shí)使用;如果獲取的按鍵值與上一次獲取的按鍵值不同,則表示獲取按鍵值無效。
(7)重新配置引腳功能,將中斷引腳以外的引腳都配置為高電平輸出狀態(tài)。不管獲取到按鍵值有效,還是無效,都需要重新配置引腳功能。
(8)此時(shí)一次按鍵中斷掃描結(jié)束。
當(dāng)檢測到按鍵中斷信號(hào)后,置中斷標(biāo)志位,剛開始時(shí)間t=0直接進(jìn)行第一次按鍵掃描,再一次按鍵確認(rèn)掃描時(shí),需要按鍵消抖時(shí)間耗盡后,掃描具體的按鍵值。當(dāng)掃描到的按鍵值為有效按鍵值時(shí),則進(jìn)行按鍵的次數(shù)判斷,按鍵并不是第一次按下時(shí),對(duì)按鍵次數(shù)、掃描標(biāo)志、中斷標(biāo)志進(jìn)行復(fù)位操作,按鍵是第一次按下,則保存當(dāng)前獲取的按鍵值,并將掃描標(biāo)志、中斷標(biāo)志復(fù)位、消抖時(shí)間重置、進(jìn)行再一次的確認(rèn)掃描。獲取的按鍵值與上一次獲取的按鍵值相同時(shí),將按鍵值進(jìn)行緩存,以備按鍵處理時(shí)使用。獲取到按鍵值之后重新配置引腳功能,將中斷引腳以外的引腳都配置為高電平輸出狀態(tài),此時(shí)一次按鍵中斷掃描結(jié)束。
在按鍵獲取過程中,對(duì)于一次檢測到按鍵按下時(shí),需要保存當(dāng)前獲取的按鍵值,并將掃描標(biāo)志和中斷標(biāo)志復(fù)位、消抖時(shí)間重置、按鍵次數(shù)加一。之后通過再進(jìn)行一次按鍵掃描,在這個(gè)過程中起到一個(gè)按鍵消抖的作用。
如圖2所示,本發(fā)明的按鍵掃描方法的第二種實(shí)施例:定時(shí)掃描方式。
(1)定時(shí)掃描開始,系統(tǒng)進(jìn)入定時(shí)服務(wù)程序。
(2)判斷定時(shí)掃描時(shí)間是否到達(dá):當(dāng)時(shí)間到達(dá)后,掃描具體按鍵值;如果時(shí)間還未達(dá)到,則重復(fù)步驟(2)。
(3)獲取具體按鍵值。
(4)判斷獲取的按鍵值是否有效:如果掃描到的按鍵值為有效按鍵值時(shí),則進(jìn)行按鍵的次數(shù)判斷;如果掃描到的按鍵值為無效按鍵值,則表示沒有獲取到按鍵值。
(5)進(jìn)行按鍵次數(shù)判斷:如果按鍵為第一次按下,則保存當(dāng)前獲取的按鍵值,并將按鍵次數(shù)加一,然后進(jìn)行步驟(2);按鍵并不是第一次按下時(shí),對(duì)按鍵次數(shù)進(jìn)行復(fù)位操作,并對(duì)獲取到的有效按鍵值進(jìn)行判斷。
(6)對(duì)當(dāng)前獲取的按鍵值進(jìn)行判斷:當(dāng)獲取的按鍵值與上一次獲取的按鍵值相同時(shí),將按鍵值進(jìn)行緩存,以備按鍵處理時(shí)調(diào)出使用;如果獲取的按鍵值與上一次獲取的按鍵值不同,則表示獲取按鍵值無效,對(duì)按鍵次數(shù)進(jìn)行復(fù)位操作。
(7)不管獲取到按鍵值有效,還是無效,此時(shí)一次按鍵定時(shí)掃描處理結(jié)束。
在系統(tǒng)配置中設(shè)置好定時(shí)處理服務(wù)程序,定時(shí)服務(wù)啟動(dòng)后開始掃描,當(dāng)按鍵掃描時(shí)間達(dá)到后,進(jìn)入到掃描具體按鍵值狀態(tài)。如果掃描到的按鍵值為有效按鍵值時(shí),則進(jìn)行按鍵的次數(shù)判斷;如果掃描到的按鍵值為無效按鍵值,則表示沒有獲取到按鍵值。如果按鍵并不是第一次按下時(shí),對(duì)按鍵次數(shù)進(jìn)行復(fù)位操作,并對(duì)獲取到的有效按鍵值進(jìn)行判斷。當(dāng)獲取的按鍵值與上一次獲取的按鍵值相同時(shí),將按鍵值進(jìn)行緩存,以備按鍵處理時(shí)調(diào)出使用;如果獲取的按鍵值與上一次獲取的按鍵值不同,則表示獲取按鍵值無效,對(duì)按鍵次數(shù)進(jìn)行復(fù)位操作。
在按鍵獲取過程中,通過再進(jìn)行一次按鍵掃描,在這個(gè)過程中起到一個(gè)按鍵消抖的作用。
如圖3所示,按鍵值的具體獲取過程,按鍵值獲取過程中,可以獲取其中任意一行的按鍵值,也可以獲取其中幾行的按鍵值,也可以獲取所有行數(shù)的按鍵值,以獲取四行的按鍵值為例,如圖3所示:
獲取第一行按鍵值:先將key-p2、key-p3、key-p4和key-int四個(gè)io口設(shè)為輸入,將key-p1的io口設(shè)為輸出,將key-p1置為高電平,然后檢測key-p1、key-p2、key-p3、key-p4和key-int這五個(gè)io口的值,再將該數(shù)值加1,即為第一行的按鍵值;
獲取第二行按鍵值:先將key-p1、key-p3、key-p4和key-int四個(gè)io口設(shè)為輸入,將key-p2的io口設(shè)為輸出,將key-p2置為高電平,然后檢測key-p1、key-p2、key-p3、key-p4和key-int這五個(gè)io口的值,再將該數(shù)值加2,即為第二行的按鍵值;
獲取第三行按鍵值:先將key-p1、key-p2、key-p4和key-int四個(gè)io口設(shè)為輸入,將key-p3的io口設(shè)為輸出,將key-p3置為高電平,然后檢測key-p1、key-p2、key-p3、key-p4和key-int這五個(gè)io口的值,再將該數(shù)值加3,即為第三行的按鍵值;
獲取第四行按鍵值:先將key-p1、key-p2、key-p3和key-int四個(gè)io口設(shè)為輸入,將key-p4的io口設(shè)為輸出,將key-p4置為高電平,然后檢測key-p1、key-p2、key-p3、key-p4和key-int這五個(gè)io口的值,再將該數(shù)值加4,即為第四行的按鍵值;
將獲取到的四行按鍵值,組合成一個(gè)值,即為最終獲取到的按鍵值。
顯而易見,按鍵值掃描時(shí),可以對(duì)任意一行進(jìn)行掃描,或者對(duì)其中幾行進(jìn)行掃描,也可以對(duì)所有行進(jìn)行掃描。
如圖4所示,本發(fā)明還提供了另外一種按鍵掃描方法:比較兩次連續(xù)掃描獲取的按鍵值,如果為相同的按鍵值,則將后續(xù)規(guī)定時(shí)間內(nèi)掃描獲得的按鍵值與前面兩次所獲取的按鍵值比較;如果在后續(xù)規(guī)定時(shí)間內(nèi)有一次按鍵掃描獲取的按鍵值與前面兩次所獲取的按鍵值不相同,則所獲取的按鍵類型為短按鍵操作;如果在后續(xù)規(guī)定時(shí)間內(nèi)每次掃描所獲取的按鍵值均與前面兩次所獲取的按鍵值相同,則所獲取的按鍵類型為長按鍵操作。本發(fā)明按鍵掃描方法,可以區(qū)分同一按鍵的短按鍵操作和長按鍵操作,使得同一按鍵可以實(shí)現(xiàn)不同的功能,節(jié)約按鍵,降低成本。
因硬件具備初始條件,當(dāng)沒有任何按鍵按下時(shí)的初始按鍵值,作為一個(gè)無效按鍵,此時(shí)相應(yīng)的按鍵類為無按鍵操作,同理,也是通過檢測該按鍵值作為檢測按鍵是否已經(jīng)被釋放的判斷條件之一。同理,當(dāng)系統(tǒng)連續(xù)兩次掃描所獲取到的按鍵值雖不屬于無效按鍵值,但連續(xù)兩次的按鍵值卻不同(說明在掃描時(shí)間內(nèi)按鍵發(fā)生了變化),此時(shí),相應(yīng)的按鍵類型為無效按鍵操作。
特別地,在同一時(shí)間檢測到有多個(gè)按鍵值同時(shí)有效時(shí),則為組合按鍵操作。采用組合按鍵可以帶來更為多樣的按鍵形式,從而實(shí)現(xiàn)更多的功能。
特別地,當(dāng)按鍵為長按鍵操作時(shí),按鍵掃描時(shí)間到達(dá)后,系統(tǒng)繼續(xù)對(duì)按鍵進(jìn)行掃描,當(dāng)所掃描到的按鍵值發(fā)生變化時(shí),則認(rèn)為該長按鍵已經(jīng)被釋放,此時(shí)所獲取的按鍵類型為長按鍵釋放操作。
本發(fā)明還提供了一種實(shí)現(xiàn)上述按鍵掃描方法的低壓電器的控制器。包括按鍵電路和與按鍵電路連接的控制單元,所述控制單元根據(jù)預(yù)設(shè)的掃描時(shí)間定時(shí)采用上述的按鍵掃描方法對(duì)按鍵電路進(jìn)行掃描獲得按鍵值。所述按鍵電路在按鍵被按下時(shí)向控制單元發(fā)送中斷信號(hào),控制單元在收到中斷信號(hào)后采用上述的按鍵掃描方法對(duì)按鍵電路進(jìn)行掃描獲得按鍵值。
如圖5、6所示,所述按鍵電路包括中斷信號(hào)電路和鍵盤電路,所述鍵盤電路包括按n行n列排列的n*n個(gè)按鍵的矩陣鍵盤,中斷信號(hào)電路用于按鍵值的輸出,所述n*n個(gè)按鍵的矩陣鍵盤的每行按鍵分別通過一根行掃描線連接,每列按鍵分別通過一根列掃描線連接,所述中斷信號(hào)電路包括n個(gè)二極管組成的第一組開關(guān)二極管和另外n個(gè)二極管組成的第二組開關(guān)二極管;所述第二組開關(guān)二極管的n個(gè)二極管的正極分別和n列掃描線連接,第二組開關(guān)二極管的n個(gè)二極管的負(fù)極分別與電阻r302的一端連接,電阻r302的另一端與三極管q301的基極連接,三極管q301的集電極連接至第n+1個(gè)i/o端口key_int,按鍵電路在按鍵被按下時(shí)通過第n+1個(gè)i/o端口key_int向控制單元發(fā)送中斷信號(hào),三極管q301的發(fā)射極接地;n列掃描線的一端與第一組開關(guān)二極管的n個(gè)二極管的正極連接,第一組開關(guān)二極管的n個(gè)二極管的負(fù)極與n行掃描線連接,n行掃描線與n個(gè)i/o端口(key_p1,……,key_pn)連接。圖中實(shí)施例中斷信號(hào)電路和鍵盤電路為獨(dú)立設(shè)置,兩者之間通過接線排連接在一起。
具體地,所述中斷信號(hào)電路的每一根列掃描線通過n個(gè)電阻接地,所述第n+1個(gè)i/o端口key_int通過第n+1個(gè)電阻接地。所述中斷信號(hào)電路還包括電阻r301,電阻r301的一端與三極管q301的集電極連接,另一端與3.3v電源正極連接。
具體地,掃描到的按鍵值為無效按鍵值后,重新配置引腳功能,將i/o端口key_int以外的i/o端口(key_p1,……,key_pn)都配置為高電平輸出狀態(tài)。
以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對(duì)本發(fā)明所作的進(jìn)一步詳細(xì)說明,不能認(rèn)定本發(fā)明的具體實(shí)施只局限于這些說明。對(duì)于本發(fā)明所屬技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。