當(dāng)輕觸開關(guān)合閉或是斷掉時都有每段電平不平穩(wěn)的時期,輕觸開關(guān)在合閉時不容易立刻就平穩(wěn)的接入,在斷掉時也不容易突然之間完全斷掉,只是在合閉和斷掉的一瞬間隨著了一個一個的電平顫動。這類顫動通常都會10ms上下。為了保證程序流程對功能鍵的一回合閉或是一回斷掉只沒有響應(yīng)一回,務(wù)必開展功能鍵的去抖解決。當(dāng)檢驗到功能鍵情況轉(zhuǎn)變時,并不是馬上去沒有響應(yīng)姿勢,只是先等候合閉或斷掉平穩(wěn)后再開展解決。
功能鍵去抖方式 可分成硬件配置去抖和手機(jī)軟件去抖,硬件配置去抖沒有文中的探討中,文中只探討手機(jī)軟件去抖。
通常的手機(jī)軟件去抖就是說程序流程在檢驗到功能鍵合閉或斷掉時啟用每段廷時匯編程序(在c語言中叫涵數(shù)),程序流程再此死等10ms或更長。廷時之后再檢驗功能鍵的情況是不是與廷時前的情況相同,若相同就實行電腦鍵盤程序流程一部分,若不相同,則繞過實行電腦鍵盤程序流程。
這類方式 在程序流程勞動量并不是挺大時是沒有難題的。但在某些CPU負(fù)荷較為大的程序流程中,尤其某些程序流程運行中有較為多的在不確定性時間就會產(chǎn)生的終斷的狀況下(外界終斷、串口終斷、定時器中斷等),這里死等,總有將會導(dǎo)致某一部分程序流程不可以非常好的被實行,乃至程序流程跑飛等比較嚴(yán)重難題。
自己歷經(jīng)很多年的程序編寫,小結(jié)了一整套處理這難題的方式 ,供大家參考。
單片機(jī)設(shè)計電腦鍵盤去抖的編程設(shè)計
程序流程是用51匯編語言寫的,大伙兒若想用c語言撰寫,參照這流程表改一下下就成。
先表述這流程表中的自變量和匯編程序:
KSTEP:步進(jìn)電機(jī)標(biāo)示自變量,當(dāng)程序流程從子程序進(jìn)到到此匯編程序后,馬上依據(jù)這KSTEP的值跳至相對的程序語言。
KEYSCAN:讀電腦鍵盤匯編程序,若你的功能鍵總數(shù)很少得話,立即讀IO口。功能鍵總數(shù)多得話,還要用向量方法讀電腦鍵盤,這兒未作贅言。
HASK:位自變量,讀電腦鍵盤匯編程序中的位自變量,當(dāng)讀電腦鍵盤匯編程序KEYSCAN檢驗到有鍵合閉時置“1”,相反置“0”。
R2:鍵值自變量,讀電腦鍵盤匯編程序KEYSCAN讀取的鍵值。
KVALU:鍵值自變量,R2的鍵值送至這兒,供此匯編程序下一回分辨或子程序應(yīng)用。
K20MS:20ms記時器自變量,當(dāng)初次檢驗到有鍵合閉時往里送值10。程序流程復(fù)位中設(shè)置定時器中斷為2ms間隔時間。進(jìn)到定時器中斷后,最先分辨K20MS是不是為0?若此0則立即撤出定時器中斷;若不以0則將K20MS減1后再撤出定時器中斷。那樣K20MS自變量從10瘦到0時間為20ms。鍵斷掉時都是相同地實行。
KAVA:位自變量,告知子程序:鍵合閉(斷掉)合理。
程序流程表述:
1.程序流程復(fù)位時KSTEP的數(shù)值0,因此一進(jìn)到本子h程序流程,程序流程立刻就跳至型號KSC0處,在此地啟用讀電腦鍵盤匯編程序KEYSCAN。
1.1從KEYSCAN出去后,若位自變量HASK的數(shù)值0,表明沒有鍵合閉,程序流程立即跳至型號RET處撤出。
1.2若位自變量HASK的數(shù)值1,就是說有鍵合閉,這時將標(biāo)值1送進(jìn)步進(jìn)電機(jī)標(biāo)示自變量KSTEP中,有利于到時候進(jìn)到本子h程序流程時,程序流程立即跳至型號KSC1處。再將從KEYSCAN匯編程序讀出的鍵值送進(jìn)自變量KVALU中,用以到時候再啟用讀電腦鍵盤匯編程序KEYSCAN時與R2讀取的鍵值開展較為。
最終將標(biāo)值10送進(jìn)20ms記時器自變量K20MS中,用以2ms定時器中斷后減1,隨后撤出匯編程序。
2.當(dāng)子程序再度啟用本子h程序流程時,程序流程立刻就跳至型號KSC1處。
2.1在此地最先辨別20ms記時器自變量K20MS是不是瘦到0(也就是說辨別20ms廷時來到?jīng)]有?),若K20MS不以0(20ms廷時都還沒到),則馬上撤出。
2.2若K20MS為0(表明20ms廷時時間來到),再度啟用讀電腦鍵盤匯編程序KEYSCAN。啟用KEYSCAN匯編程序后,再度辨別位自變量HASK是不是合理?
2.2.1若HASK失效,表明之前(KSC0處)將會是遭受一回干撓。因此校準(zhǔn)KSTEP(清0),撤出。使到時候啟用本程序流程時,又重新開始。
2.2.2若HASK合理,則將此次從KEYSCAN讀取的鍵值與之前讀取并存有KVALU中的鍵值開展較為。
2.2.2.1若較為值不一樣,則程序流程跳至型號KE1處,將新的鍵值存進(jìn)KAVALU中,20ms后再啟用KEYSCAN匯編程序,再度較為。
2.2.2.2若較為值同樣,則表明此次鍵合閉合理,因此置位KAVA(當(dāng)子程序是鍵按住實行時),告知子程序,鍵合閉合理,能夠?qū)嵭写随I所需做的程序流程了。一起將標(biāo)值2送進(jìn)步進(jìn)電機(jī)標(biāo)示自變量KSTEP中,有利于到時候進(jìn)到本子h程序流程時,程序流程立即跳至型號KSC2處。最終將標(biāo)值10送進(jìn)20ms記時器自變量K20MS中,在到時候進(jìn)到KSC2型號處,也得等20ms以后再辨別鍵是不是斷掉。
3.如今子程序啟用本子h程序流程時,程序流程立刻就跳至型號KSC2處,再此也是,最先辨別20ms記時器自變量K20MS是不是瘦到0(也就是說辨別20ms廷時來到?jīng)]有?),若K20MS不以0(20ms廷時都還沒到),則馬上撤出。若K20MS為0,啟用讀電腦鍵盤匯編程序KEYSCAN。
啟用KEYSCAN匯編程序后,辨別位自變量HASK是不是合理?
3.1若HASK失效,表明功能鍵將會被釋放出來斷掉,因此將標(biāo)值3送進(jìn)步進(jìn)電機(jī)標(biāo)示自變量KSTEP中,有利于到時候進(jìn)到本子h程序流程時程序流程能夠立即跳至型號KSC3處。最終將標(biāo)值10送進(jìn)20ms記時器自變量K20MS中,在到時候進(jìn)到KSC3型號處,也得等20ms以后再辨別鍵是不是再次斷掉情況。
3.2若HASK合理,表明功能鍵再次合閉情況,再較為KEYSCAN讀取的鍵值與之前讀取在KVALU中的鍵值開展較為。
3.2.1若較為值不一樣,則程序流程跳至型號KE0處,從頭開始。
3.2.1若較為值同樣,則表明功能鍵都還沒斷掉,再次將標(biāo)值10送進(jìn)20ms記時器自變量K20MS中,等20ms以后再進(jìn)到型號KSC2處,再度辨別功能鍵是不是斷掉。
4.當(dāng)子程序啟用本子h程序流程時,程序流程程序流程立刻跳至型號KSC3處,還是最先辨別20ms記時器自變量K20MS是不是瘦到0,若K20MS不以0(20ms廷時都還沒到),則馬上撤出。若K20MS為0,啟用讀電腦鍵盤匯編程序KEYSCAN。
啟用KEYSCAN匯編程序后,辨別位自變量HASK是不是合理?
4.1若HASK失效,表明功能鍵早已徹底釋放出來斷掉,因此將標(biāo)值0送進(jìn)步進(jìn)電機(jī)標(biāo)示自變量KSTEP中,有利于到時候進(jìn)到本子h程序流程時,程序流程重新開始,一起置位KAVA(當(dāng)子程序是鍵釋放出來實行時),告知子程序,鍵釋放出來合理,能夠?qū)嵭写随I所需做的程序流程了。
4.2假如位自變量HASK再次合理,表明又有鍵合閉了(盡管這類幾率較為小,但程序流程得編進(jìn)來),依據(jù)新鍵值與老鍵值的同樣與不一樣,各自跳至型號KE3處,或是型號KE0處實行。
表明:KE3型號和KE7型號下邊常有SETBKAVA,具體程序編寫時僅用一回,依據(jù)你的子程序是在鍵按住實行還是鍵釋放出來實行采用。
本程序流程的特性就是說:在等鍵合閉或斷掉去抖的那20ms時間,并不是死等,只是搞好標(biāo)識及置好必需的變量值后馬上撤出到子程序去做別的事兒。程序流程每一次從進(jìn)到到撤出這一匯編程序中所花的時間通常為十多微秒(沒有讀電腦鍵盤匯編程序KEYSCAN所花的時間,KEYSCAN花的時間依據(jù)功能鍵總數(shù)的是多少而不一樣,通常為好多個微秒到一百多微秒)。
責(zé)任編輯;zl
評論