|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
說說按鍵處理到底要怎么做才實時性好! |
| 作者:emailli 欄目:單片機 |
參見:http://blog.21ic.com/user1/3407/archives/2006/31593.html |
| 2樓: | >>參與討論 |
| 作者: 農(nóng)民講習所 于 2006/11/13 19:32:00 發(fā)布:
按鍵處理需要實時性嗎? 請對實時性確定一個時間指標。 |
|
| 3樓: | >>參與討論 |
| 作者: wangkj 于 2006/11/13 21:22:00 發(fā)布:
反轉(zhuǎn)法 |
|
| 4樓: | >>參與討論 |
| 作者: yuands 于 2006/11/13 21:28:00 發(fā)布:
與人打交道的不用實時性吧 |
|
| 5樓: | >>參與討論 |
| 作者: emailli 于 2006/11/14 8:40:00 發(fā)布:
前一段時間看到的程序 前一段時間看到有人把按鍵掃描,分支處理全部放到了中斷內(nèi) 這樣的程序運行的時候你就知道有沒有必要了 當你按鍵不能做到立刻響應,需要等上一會才回答的時候 有你痛苦的了 |
|
| 6樓: | >>參與討論 |
| 作者: xzl 于 2006/11/14 8:44:00 發(fā)布:
如果要求快速響應有兩個方法 1、放到中斷里 2、如果中斷被占用,可以考慮主程序調(diào)用鍵盤檢測。如果主程序較大,調(diào)用間隔時間長,就要考慮在大的子程序中也要調(diào)用鍵盤檢測處理程序 |
|
| 7樓: | >>參與討論 |
| 作者: 農(nóng)民講習所 于 2006/11/14 8:49:00 發(fā)布:
暈,放到中斷中是為了去抖需要的時間和定時掃描,和你想的不同 一個按鍵有效,延時處理0.2-0.3s都正常,外部一點感覺都沒有。 和人操作有關的,允許的時間范圍都是比較大的。 |
|
| 8樓: | >>參與討論 |
| 作者: yewuyi 于 2006/11/14 8:50:00 發(fā)布:
實時? 消抖就要20MS,你怎么實時? 呵呵,放在中斷或者放在主函數(shù)里面都需要消抖的…… 俺以前喜歡放中斷里做,現(xiàn)在喜歡放主函數(shù)里面做,放中斷里面容易把中斷程序?qū)懙奶_嗦,所以俺現(xiàn)在定時中斷只用來提供全局的Tip+動態(tài)掃描 |
|
| 9樓: | >>參與討論 |
| 作者: 農(nóng)民講習所 于 2006/11/14 9:07:00 發(fā)布:
樓主的BLOG里 “而一個前后臺的系統(tǒng),也許一個程序運行下來也就20ms,而由于有鍵盤延時判斷的存在,將導致整個系統(tǒng)運行都慢了下來! 說明你還沒掌握設計的理論。不可能這樣設計。你可參考我的培訓教材: http://www.21icbbs.com/club/bbs/showEssence.asp?id=8047 |
|
| 10樓: | >>參與討論 |
| 作者: hq_y 于 2006/11/14 9:11:00 發(fā)布:
所長的設計思想值得認真學習,很多概念的提出可能是第一次的 |
|
| 11樓: | >>參與討論 |
| 作者: diannaoza 于 2006/11/14 11:32:00 發(fā)布:
我是這么鍵盤消抖與處理的. 中斷10MS或20ms內(nèi)做兩個標志位,一個消抖用,一個做處理鍵值轉(zhuǎn)存. |
|
| 12樓: | >>參與討論 |
| 作者: fushaobing 于 2006/11/14 11:59:00 發(fā)布:
先把概念理一下 樓主的題目可以有2種理解: 1.按鍵處理要怎樣做才能使按鍵響應及時; 2.按鍵處理要怎樣做才能使整個系統(tǒng)實時性好。 我估計樓主想表達的是第2種。 那么按鍵處理要怎樣做才不會影響整個系統(tǒng)的實時性呢?我覺得可以這樣,用定時掃描的方法掃描鍵盤(定時周期約62.5ms,我常用),利用2次掃描的時間間隔來去抖動。以62.5ms為時鐘節(jié)拍,計算鍵齡,作為長按的時間依據(jù)。 用中斷讀鍵盤也可以,不會影響系統(tǒng)的實時性。 只要不是用調(diào)用延時子程序的方法來延時10ms(或20ms),就不會對系統(tǒng)的實時性造成明顯明顯影響。 |
|
| 13樓: | >>參與討論 |
| 作者: makesoft 于 2006/11/14 12:18:00 發(fā)布:
呵呵,不知道為什么要實時 只要按照規(guī)定響應按鍵就可以了,即使有延遲也是合理的 |
|
| 14樓: | >>參與討論 |
| 作者: 平常人 于 2006/11/14 17:42:00 發(fā)布:
按鍵處理需要實時性!你要用來玩游戲就體會了,響應時間應<50ms |
|
| 15樓: | >>參與討論 |
| 作者: 農(nóng)民講習所 于 2006/11/14 17:44:00 發(fā)布:
響應時間應<200ms也算是需要實時性。實時性如何定義? |
|
| 16樓: | >>參與討論 |
| 作者: xwj 于 2006/11/14 17:46:00 發(fā)布:
再適時也只需要弱適時,對于自控系統(tǒng)幾十mS是很長的時間了 |
|
| 17樓: | >>參與討論 |
| 作者: emailli 于 2006/11/17 13:51:00 發(fā)布:
12理解的不錯 對于按鍵實時性,我的本意是12樓說的第二種 2.按鍵處理要怎樣做才能使整個系統(tǒng)實時性好。 可憐你們很多人都沒有仔細看我的代碼是如何處理的。 如何讓按鍵的延時去抖程序不是簡單的調(diào)用delay(20)實現(xiàn)20ms的延遲,從而影響了系統(tǒng)的實時性。就在這里說我不理解系統(tǒng)設計的什么什么理論的的。 對于你們你們說按鍵不需要實時,也許對于按鍵本身這個處理而言,的確是這樣的。 但是如果你的系統(tǒng)還有串口通信啊什么的在里面,中斷利用比較多的話,你就會發(fā)現(xiàn),如果你用的是delay(20)來做的按鍵掃描。那么你可以測試一下你的系統(tǒng),當有人使用鍵盤的時候和沒有人使用鍵盤的時候有一些什么區(qū)別? 我估計這個時候串口通信會出問題了。。 不信你做做高強度的測試,100MS串口輪詢數(shù)據(jù)看看。! |
|
| 18樓: | >>參與討論 |
| 作者: xwj 于 2006/11/17 14:09:00 發(fā)布:
LZ,是你自己不會表達,按鍵應該盡量0耗時消抖,這是每個人都知道的 同樣, 多任務下稍長的延時也是不準用指令循環(huán)的方法的 除非是真正的新手,才會對著書用指令循環(huán)的要是方法來消抖 這種話題可謂是老生常談了,論壇中叫做“月經(jīng)帖”... 發(fā)貼前先去搜索下舊帖吧 呵呵 |
|
| 19樓: | >>參與討論 |
| 作者: emailli 于 2006/11/17 16:19:00 發(fā)布:
可能?? 你說月經(jīng)貼,我覺得好像不是 之前看到一個人的程序就是在中斷里面又是延時又是分支的處理著他的按鍵。 他的程序出了問題 他自己卻不知道是怎么引起的,發(fā)帖求助,沒有一個回答的人說了他按鍵的問題 只有我一個人說了一下而已 你覺得沒有必要將這個問題的處理單獨出臺討論么? 同時,這種處理方式不但但可以用來做按鍵處理 對于語音播放處理,電話撥號處理等等需要長延時的處理都可以采取這種類似的方式 這樣做不好???? |
|
| 20樓: | >>參與討論 |
| 作者: 農(nóng)民講習所 于 2006/11/17 17:28:00 發(fā)布:
說多了,大家都不想提了。 再說初學者基本知識都沒懂,說多了就更糊涂。倒是LZ完全可以再進一步學習。 很早以前的帖子,可惜討論部分都被刪除了,只有提綱: http://www.21icbbs.com/club/bbs/showEssence.asp?id=5190&page=1 |
|
| 21樓: | >>參與討論 |
| 作者: IceAge 于 2006/11/17 21:43:00 發(fā)布:
老農(nóng)是這方面的高手,多體會老農(nóng)的教材 真理越辯越明,是不是月經(jīng)貼無所謂。這個問題以前爭論過很多次,這方面俺絕對支持老農(nóng)。 俺的做法更極端:全部任務都在定時中斷里,“主程序“休眠。按鍵任務每20ms 進入一次,用狀態(tài)機實現(xiàn)。 同意老農(nóng)的斷言: 如果你的按鍵程序里有延時程序,說明你還沒掌握 (基本)設計的理論。 |
|
| 22樓: | >>參與討論 |
| 作者: HotPower 于 2006/11/17 21:55:00 發(fā)布:
要學會忍讓~~~所謂實時都是相對的~~~ 鍵盤和LED動態(tài)顯示等與人"打交道"的都可容忍~~~就算游戲鍵盤的"實時". |
|
| 23樓: | >>參與討論 |
| 作者: emailli 于 2006/11/17 21:59:00 發(fā)布:
可否發(fā)一個給我 看了一下你的提綱 覺得很不錯 不知道是否可以發(fā)一份全文給我學習 謝謝 cm.leo.lee#gmail.com 為了防止垃圾郵件,將#改成@即可 |
|
| 24樓: | >>參與討論 |
| 作者: fsaok 于 2006/11/18 6:30:00 發(fā)布:
路過 佩服hotpower對鍵盤的處理 |
|
| 25樓: | >>參與討論 |
| 作者: lag3631 于 2006/11/18 14:39:00 發(fā)布:
我的做法 采用調(diào)度器,每隔xx ms查詢一次 采用先讓列線為高(或低),令行線依次為低(或高),查詢列線狀態(tài) 如果有鍵按下,則返回鍵值 函數(shù) uCHAR Key_Number_Check(void) { static data CHAR Old_Key; CHAR Key = KEYPAD_NO_NEW_DATA; uCHAR index; R1=0; if(C1==0) index=0; if(C2==0) index=1; if(C3==0) index=2; if(C4==0) index=3; R1=1; R2=0; if(C1==0) index=4; if(C2==0) index=5; if(C3==0) index=6; if(C4==0) index=7; R2=1; R3=0; if(C1==0) index=8; if(C2==0) index=9; if(C3==0) index=10; if(C4==0) index=11; R3=1; R4=0; if(C1==0) index=12; if(C2==0) index=13; if(C3==0) index=14; if(C4==0) index=15; R4=1; if(Key==Old_Key) //Check twice to assure there is a key pressed { //A valid Key checked if(Key != Last_valid_key_G) //New Key! Last_valid_key_G = Key; while(C1==0||C2==0||C3==0||C4==0); return index; } else { Old_Key=Key; return index; } } |
|
| 26樓: | >>參與討論 |
| 作者: YUERZE 于 2006/11/18 15:43:00 發(fā)布:
記號 |
|
| 27樓: | >>參與討論 |
| 作者: wuaihua 于 2006/11/21 6:35:00 發(fā)布:
處理程序采用函數(shù)或子程序即可 采用中斷完全沒有必要,我開發(fā)的儀表鍵盤處理采用函數(shù)或子程序。速度沒有顯出慢。 |
|
| 28樓: | >>參與討論 |
| 作者: coalch 于 2006/11/21 8:52:00 發(fā)布:
同意21樓 有點操作系統(tǒng)時間片的意思,用20ms延時處理按鍵、顯示、計數(shù)器累加.... 不過我用的一般不在中斷里,那樣堆棧開銷太大,只在中斷置個標志,出來判斷。這樣不好的地方就是很多地方都得調(diào)用這個處理程序。 |
|
| 29樓: | >>參與討論 |
| 作者: 汽車電子 于 2006/11/21 9:30:00 發(fā)布:
初學者的難點之一:延時 掌握“延時,并不是在那里純粹等待。在前后臺系統(tǒng)里,是置一個標志位,在OS里用延時函數(shù)釋放CPU控制權(quán)”是初學者遇到的難題之一。當然有時做短延時(比如1ms)是可以干等的。 初學者掌握了延時的奧妙和技巧,其它程序?qū)W起來就容易多了 |
|
| 30樓: | >>參與討論 |
| 作者: fushaobing 于 2006/11/21 9:33:00 發(fā)布:
to coalch: 我的做法跟你差不多。中斷里面只設置標志?傆X得在中斷里面做事不塌實。 但為什么你說“很多地方都得調(diào)用這個處理程序”? 你把它做成一個模塊不可以嗎? ;---------------------------------------------------------------- 有點操作系統(tǒng)時間片的意思,用20ms延時處理按鍵、顯示、計數(shù)器累加.... 不過我用的一般不在中斷里,那樣堆棧開銷太大,只在中斷置個標志,出來判斷。這樣不好的地方就是很多地方都得調(diào)用這個處理程序。 |
|
| 31樓: | >>參與討論 |
| 作者: coalch 于 2006/11/21 15:04:00 發(fā)布:
TO: fushaobing 你好! 俺是做的一個模塊啊。姑且把這個模塊子程序叫“intpro”。如果在中斷里面處理的話,因為中斷可以看作“全局程序”,在程序任何地方都能觸發(fā)。而如果一個程序里有好幾個循環(huán)狀態(tài),就必須在每一個循環(huán)狀態(tài)里調(diào)用“intpro”,否則這個循環(huán)里就處理不了按鍵、顯示什么的了。 當然,如果你的程序里只有一個循環(huán)狀態(tài),就沒這么麻煩了。 |
|
| 32樓: | >>參與討論 |
| 作者: yuzq2001 于 2006/11/21 15:34:00 發(fā)布:
受益匪淺 :) 好好學習 |
|
| 33樓: | >>參與討論 |
| 作者: chenar 于 2006/11/21 23:51:00 發(fā)布:
不需要這么實時的吧? 不需要這么實時的,鍵盤掃描光是去抖的時間都要20MS左右,若加上一個按下和彈開的去抖,一個按鍵就得4、50個MS,在OS里只需要簡單設置即可,設置鍵盤掃描的間隔掃描時間,時間到后發(fā)一個消息給某特定的任務(比如說鍵盤掃描任務),用有限狀態(tài)機是比較簡單的 |
|
| 34樓: | >>參與討論 |
| 作者: netscaner 于 2006/11/22 8:08:00 發(fā)布:
支持中斷里設置標記 中斷里處理時間長了好像會出問題。所以在中斷設置標記,在主程序里關掉中斷根據(jù)標記判斷完成子功能,然后打開中斷 |
|
| 35樓: | >>參與討論 |
| 作者: 第五生産隊 于 2006/11/23 9:15:00 發(fā)布:
習慣問題 個人經(jīng)驗,按鍵放到中斷中來處理是不合適的。 按鍵的處理如果要滿足系統(tǒng)的實時性,還是採用掃描的方式。 以前的做法是:在主程序中按照一個固定的時間運行部分的程序,這個固定的時間由定時器來設定時間,再考慮使用讀鍵次數(shù)來消抖。 一個程序中每一部分的子程序要運行的周期是不一樣的。 |
|
| 36樓: | >>參與討論 |
| 作者: fushaobing 于 2006/11/23 10:22:00 發(fā)布:
to coalch: 是的,我的程序只有一個循環(huán)狀態(tài)。我覺得好奇,你的程序怎么會有幾個循環(huán)狀態(tài)?不可以統(tǒng)一起來嗎? |
|
| 37樓: | >>參與討論 |
| 作者: emailli 于 2006/11/23 19:29:00 發(fā)布:
誤解誤解 很多人都誤解了我的意思了。 再次澄清: 我的本意是看到有人在中斷內(nèi)不但按鍵掃描,而且用DELAY消抖,還包括分支處理全部都在按鍵內(nèi)做了。 各位可以參考下面鏈接: http://bbs.21ic.com/club/bbs/list.asp?boardid=11&t=2303218&tp=51%u5916%u90E8%u4E2D%u65AD%u7684%u5947%u602A%u73B0%u8C61%u3002%u5927%u5BB6%u770B%u770B%u3002 在這個帖子里面我意識到還有很多的新手在我?guī)啄昵暗睦Щ笾芯幊。所以,冒著被人罵月經(jīng)貼的危險,我還是寫了一個日志來記錄。同時希望能夠幫到入門者。 結(jié)果呢,被人罵了不說,還有不少人誤解了我。 看來,只有不停的轉(zhuǎn)貼才能夠保持不被人罵。 自己寫點東西還真難!!! |
|
| 38樓: | >>參與討論 |
| 作者: linwei1234 于 2006/11/23 22:48:00 發(fā)布:
同一emailli(37樓) |
|
| 39樓: | >>參與討論 |
| 作者: flydog1984 于 2006/11/25 14:49:00 發(fā)布:
支持12樓 支持12樓的方法,我也是在用類似的方法。 把鍵盤掃描放在定時器中斷里去做。 而且沒有用到所謂的消抖。 我是這樣做的:當某一時刻發(fā)現(xiàn)有按鍵按下時,置位一特定標志位,設flag_Key_Pressed;同時,置位系統(tǒng)消息標志位:msg_Key_Valid,還有,記錄當前按鍵值 key_Value; 第二次定時器中斷到了后,首先去去檢查有沒有按鍵按下的,如果有,則繼續(xù)置位flag_Key_Pressed,且不執(zhí)行按鍵掃描(即進入按鍵掃描程序的先決條件是當前沒有按鍵按下,即flag_Key_Pressed == 0)。如果沒有按鍵按下,則可以執(zhí)行按鍵掃描。 這樣某一個按鍵按下,只可能觸發(fā)一次,而且非?。只有這個按鍵按下后,松開,才可以繼續(xù)觸發(fā)。 在主程序中,可以在需要按鍵輸入的時候,時刻監(jiān)測msg_Key_Valid和Key_Valude,當msg_Key_Valid == 1時,讀入Key_Value。 |
|
| 40樓: | >>參與討論 |
| 作者: zhonggx 于 2006/11/26 3:17:00 發(fā)布:
其實都是單片機教材的錯啦。 比如動不動就用行例矩陣鍵盤一樣,呵呵…… 鍵盤掃描和任何中斷處理一樣,要盡量快的處量完,盡量不要做無謂的等待工作,降低系統(tǒng)響應效率。不過要達到好的系統(tǒng)效果,能用RTOS的情況下,最好盡量用OS,可以大大提高CPU的調(diào)度能力和系統(tǒng)實時性。 順便發(fā)一個我用的鍵盤程序吧;赨COSII,在系統(tǒng)時鐘HOOK函數(shù)中調(diào)用。鍵可用時發(fā)送鍵盤值到隊例。有長按鍵處理,并隨著按鍵時間的增加而加快重復產(chǎn)生鍵值能的頻率,對一些少鍵系統(tǒng)調(diào)節(jié)數(shù)值時很有用。 void KeyScan(void) { static INT32U bPreKeyBuf=0x3f,bCurKeyBuf=0x3f,bKeyOK=FALSE,bLongKey=FALSE,bKeyRepeatDelay; static INT32U bTickCount=0; INT32U dwTemp; dwTemp=IO0PIN; bCurKeyBuf=0; bCurKeyBuf=bCurKeyBuf|((dwTemp>>22)&0x08); //Key1(ESC_KEY)P0.25 bCurKeyBuf=bCurKeyBuf|((dwTemp>>24)&0x04); //Key2(UP_KEY) P0.26 bCurKeyBuf=bCurKeyBuf|((dwTemp>>29)&0x02); //Key3(DOWN_KEY)P0.30 dwTemp=IO1PIN; bCurKeyBuf=bCurKeyBuf|((dwTemp>>16)&0x01); //Key4(ENTER_KEY)P1.16 if(bCurKeyBuf!=0x0f){ if(bCurKeyBuf!=bPreKeyBuf){ bPreKeyBuf=bCurKeyBuf; bTickCount=0; bKeyOK=FALSE; bLongKey=FALSE; if(bKeyRepeat==1){ bKeyRepeat=0; OSQPost(KeyQueue,(void*)UPDATE_KEY); } } else{ bTickCount++; if(bLongKey==FALSE){ if(bTickCount==2){ bKeyOK=TRUE; OSQPost(KeyQueue,(void*)bPreKeyBuf); } if(bTickCount==LONG_KEY_DELAY){ bLongKey=TRUE; bKeyRepeatDelay=KEY_REPEAT_DELAY; bKeyOK=FALSE; OSQPost(KeyQueue,(void*)(bPreKeyBuf|0x80)); bTickCount=0; } } else{ if(bKeyRepeat==TRUE){ if(bTickCount>=(bKeyRepeatDelay)){ OSQPost(KeyQueue,(void*)(bPreKeyBuf|0x80)); bTickCount=0; if(bKeyRepeatDelay>4) bKeyRepeatDelay--; } } } } } else{ bPreKeyBuf=0x0F; bTickCount=0; bKeyOK=FALSE; bLongKey=FALSE; if(bKeyRepeat==1){ bKeyRepeat=0; OSQPost(KeyQueue,(void*)UPDATE_KEY); } } } * - 本貼最后修改時間:2006-11-26 3:19:58 修改者:zhonggx |
|
| 41樓: | >>參與討論 |
| 作者: 無悔 于 2006/11/27 18:21:00 發(fā)布:
學習 |
|
| 42樓: | >>參與討論 |
| 作者: fushaobing 于 2006/11/28 15:29:00 發(fā)布:
to flydog1984: 看了你的按鍵處理,的確沒有消抖。這樣是不可靠的! 消抖的目的不是防止重復響應,而是因為在按鍵按下或者松開時,電平不穩(wěn)定,通過消抖,避開不穩(wěn)定時期。 在不穩(wěn)定時期,電平或高或低,那么在高的時候,你很可能當作按鍵釋放了,那么接下來的低電平你就會再一次響應按鍵。當然,這要在你的系統(tǒng)時鐘很快而且主程序節(jié)拍很短的情況下才能發(fā)生。何況如果按鍵做的好,抖動也很小,發(fā)現(xiàn)不了你的問題。 * - 本貼最后修改時間:2006-11-28 15:32:29 修改者:fushaobing |
|
| 43樓: | >>參與討論 |
| 作者: 碧水長天 于 2006/11/28 19:27:00 發(fā)布:
每10ms~20ms掃描一次鍵盤,連續(xù)兩次有效,則認為按鍵有效 放到中斷中是有害的,delay(10ms)是懶惰的. * - 本貼最后修改時間:2006-11-28 20:45:35 修改者:碧水長天 |
|
| 44樓: | >>參與討論 |
| 作者: flydog1984 于 2006/11/29 10:25:00 發(fā)布:
to fushaobing 不錯 我的定時器“延時”是50ms 50ms后,抖動肯定不存在了。 按鍵未必要消抖。 如果兩次采集的間隔足夠長,不用消抖。除非有強干擾源存在。 確實,如果定時器定時間隔太小,會有問題存在的,就像 fushaobing說的那樣。 * - 本貼最后修改時間:2006-11-29 15:39:07 修改者:flydog1984 |
|
| 45樓: | >>參與討論 |
| 作者: iammercy 于 2006/11/29 16:57:00 發(fā)布:
看我的 寄存器: zKeyFlag 0-上一次的值和上上次的一樣 1-上一次的值不上上次的一樣 zKeyTMP 當前值 zKeyBuf 緩存值 zKeyValue 穩(wěn)定值 zKeyDebounce 去抖倒計時 KEY_DEBOUNCE 10ms 10ms去抖時間 開始掃描按鍵: zKeyFlag = 1? 是的,轉(zhuǎn)繼續(xù)檢查穩(wěn)定 開始掃描按鍵 ;上一次的值和上上次的一樣,讓我們看看這次與上次一不一樣 zKeyTMP <= IO口的值 zKeyTMP 與 zKeyBuf相等嗎? 是的,噢,這次與上次依然一樣,轉(zhuǎn)結(jié)束掃描按鍵 ;哈,終于不一樣了,有戯唱了: 開始進入檢查穩(wěn)定: zKeyBuf <=zKeyTMP 設置zKeyFlag = 1 zKeyDebounce<=KEY_DEBOUNCE ;裝載去抖時間 轉(zhuǎn)結(jié)束掃描按鍵 繼續(xù)檢查穩(wěn)定: ;按鍵的狀態(tài)曾經(jīng)改變過後 zKeyTMP <= IO口的值 看看是否依然穩(wěn)定 zKeyTMP 與 zKeyBuf相等嗎? ;汗,居然有不一樣了,還沒有穩(wěn)定,轉(zhuǎn)開始進入檢查穩(wěn)定 。还,繼續(xù)保持一樣, 按鍵去抖: 有1ms標誌嗎? 沒有,轉(zhuǎn)結(jié)束掃描按鍵 清1ms標誌 zKeyDebounce自減1 zKeyDebounce 減到0嗎? 不是,轉(zhuǎn)結(jié)束掃描按鍵 去抖結(jié)束: ;假如我的按鍵是按下去是0,沒按下是vdd的 如果zKeyTMP < zKeyValue =>證明按鍵按下 call 按鍵按下程序 轉(zhuǎn)保存按鍵值 zKeyTMP 〉zKeyValue =>證明按鍵釋放 call 按鍵釋放處理程序 保存按鍵值: zKeyValue<=zKeyTMP 結(jié)束掃描按鍵 |
|
| 46樓: | >>參與討論 |
| 作者: zuoshu0733 于 2006/11/29 17:26:00 發(fā)布:
討論滿激烈的嘛 我是菜鳥 板凳來聽 |
|
| 47樓: | >>參與討論 |
| 作者: xinzha 于 2006/11/29 22:51:00 發(fā)布:
現(xiàn)在不是有自己去判斷消抖的芯片了,為什么還要討論這樣的問題。 再說了,按鍵那么慢的東西也不能叫實時啊,完全也可以在判斷消抖的10多個ms里面釋放了CPU去干別的,按鍵程序別影響了其他代碼的實時性才是真的。 |
|
| 48樓: | >>參與討論 |
| 作者: sharks 于 2006/11/30 8:49:00 發(fā)布:
四只手贊成老農(nóng) 程序中只要有超過100us的耗CPU式的延遲,都是垃圾程序。其實大部分時候不是CPU不夠速度,而是我們沒有發(fā)揮他1/10的效用,都浪費在延遲、等待上了 |
|
| 49樓: | >>參與討論 |
| 作者: nxy825715 于 2006/11/30 9:29:00 發(fā)布:
個人建議: 我認為要達到實時性,就不能在采樣按鍵的時候,停止了主程序的運行, 可以這樣想一下:主程序運行一次也是需要時間的,我們可以利用主程序運行所需要的時間作為消抖之用. |
|
| 50樓: | >>參與討論 |
| 作者: kapo 于 2006/12/1 15:46:00 發(fā)布:
對于這個問題,其實我覺得沒有必要搞的那么復雜 在中斷里也好,用延時也好,在主程序里調(diào)用掃描也好,只要能解決了問題,什么都行,一般人都是考慮盡可能的不占用整個系統(tǒng)時間就行,我是根據(jù)實際要求,每種都有用過,目前還是比較喜歡用中斷加主程序調(diào)用掃描,在中斷里只作判斷,不作處理. |
|
| 51樓: | >>參與討論 |
| 作者: lthirty 于 2006/12/4 17:55:00 發(fā)布:
就是,實時的定義 |
|
| 52樓: | >>參與討論 |
| 作者: baipengwei 于 2006/12/7 18:32:00 發(fā)布:
用74HC165做的鍵盤 采用4片74HC165(并轉(zhuǎn)串)級聯(lián),做成32個按鍵,發(fā)現(xiàn)實時性不是很高,而且現(xiàn)在想增加一個功能,多個按鍵同時按下的時候進入“設置密碼子程序”,類似于“CTRL”+“ALT”+“DEL”的處理; 要怎樣處理才是最完美的啊 |
|
| 53樓: | >>參與討論 |
| 作者: dwh000 于 2006/12/9 16:47:00 發(fā)布:
做個標志 做個標志,有時間了來學習!要下班了 |
|
| 54樓: | >>參與討論 |
| 作者: gegegegeda 于 2006/12/11 19:11:00 發(fā)布:
支持! 支持! |
|
| 55樓: | >>參與討論 |
| 作者: cqzhoujie 于 2006/12/13 6:35:00 發(fā)布:
使用狀態(tài)機的模塊結(jié)構(gòu) 如果要保證整個系統(tǒng)的實時性,最好使用狀態(tài)機。 |
|
| 56樓: | >>參與討論 |
| 作者: eeproom 于 2006/12/13 7:38:00 發(fā)布:
如果不用OS,一般處理鍵盤也不要多少時間的 不用OS,設計程序時,用一個Timer設計一個Tick,系統(tǒng)循環(huán)的脈搏,根據(jù)你的實時需要定制5-100ms,鍵盤用中斷,如果有鍵盤事件,查詢后標志了就走,下一次還有?再查詢是否放開...,這樣處理鍵盤不要很多時間,特別是處理需要長時間按下發(fā)出N個鍵值的需求很容易了。這種方式,順便DelayTime()也不要在那里傻瓜一樣的用計數(shù)器來消耗時間,完全可以 unsigned CHAR DelayMs(unsigned CHAR tick); ......... if(!DelayMs(2)) { //定時時間到了 } ........ 設計上,盡量不讓任何一個函數(shù)霸占CPU。, 最近需要在120us內(nèi)處理兩軸插值聯(lián)動(包括加速減速)決策、OS任務調(diào)度、4 x 4鍵盤處理、緊急事件,UCOSII就占了近50us,系統(tǒng)RISC指令單周期0.1uS。做出來人都瘦了點! * - 本貼最后修改時間:2006-12-13 7:51:10 修改者:eeproom |
|
| 57樓: | >>參與討論 |
| 作者: eeproom 于 2006/12/13 8:15:00 發(fā)布:
與zhonggx探討一下 我也曾把鍵盤查詢放在TickHook里,覺得不舒服,會導致tick有細微的誤差,我們需要固定的Tick時鐘,改成:查詢到矩陣鍵盤有操作但不明確鍵值時就發(fā)實消息,否則就發(fā)虛消息,讓tickhook的運行時間一致。外部建立鍵盤任務處理。還有更好的辦法沒有? * - 本貼最后修改時間:2006-12-15 10:10:40 修改者:eeproom |
|
| 58樓: | >>參與討論 |
| 作者: martial 于 2006/12/15 9:21:00 發(fā)布:
每次都學一次 |
|
| 59樓: | >>參與討論 |
| 作者: taosha 于 2006/12/16 9:09:00 發(fā)布:
硬件實現(xiàn)比較好 |
|
| 60樓: | >>參與討論 |
| 作者: fossicker 于 2006/12/20 13:47:00 發(fā)布:
說說相關 承18樓所說,我覺得寫程序最不應該兜指令延時的方式死等在那里!這樣效率會很低。像我通常開一個MS標志,把一些程式分支化處理。實時性要求高的就在主程式處理,不高的就通過時間標志就走分支,從來不會有死等的程序。這樣主程序加一條分支所需的時間才可能幾十微秒。幾十微秒的時間即使要做一些實時性相對高的檢測也是足夠的了。還不夠才用中斷! |
|
| 61樓: | >>參與討論 |
| 作者: 199041042 于 2006/12/20 14:29:00 發(fā)布:
學習一下~~ 我是新手~~來看看 |
|
| 62樓: | >>參與討論 |
| 作者: forthlab 于 2006/12/20 16:23:00 發(fā)布:
cqzhoujie 說的對,最好使用狀態(tài)機 cqzhoujie 發(fā)表于 2006-12-13 06:35 侃單片機 ←返回版面 55樓: 使用狀態(tài)機的模塊結(jié)構(gòu) 如果要保證整個系統(tǒng)的實時性,最好使用狀態(tài)機。 ============================= 看這個帖子一直在首頁,忍不住進來看看。 一直沒有遇到鍵盤問題,看了許久才明白原來如此。 同意cqzhoujie 的說法,用狀態(tài)機,我現(xiàn)在的程序都是狀態(tài)機的,處理>1ms的事件不要中斷了。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |