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