Re: [問題] 請問反彈跳@@?

看板ASM作者 (呆呆小狼)時間15年前 (2009/08/10 01:34), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串4/6 (看更多)
//既然你要用C寫ARM,那就給你C的程式範例。 //不過這個程式是我現成8051專案的原始碼,自己看看改寫一下囉 #define mkMANUL 0x1 #define mkAUTO 0x2 #define mkCLEAN 0x4 #define mkROLL 0x8 #define mkON 0x10 //這是PORT 按鈕對應位元的宣告 //P0的每個按鈕都對地接一個開關,所以按下去會得到0。 #define bkey_ctc(a,b) if(bKeys&a){if(blKeys&a){if(b<253){b++;}}else{b=0;}} //檢查按鈕,按鈕按著就把計數暫存器加1直到253為止。如果狀態改變先歸零的巨集。 #define chKeyPress(a,b,c) if((nKeys&a)&&(b>c)) //檢查按鈕是不是已經被釋放,並且技術器是否超過指定數字的巨集 #define chKeyNPress(a,b,c) if((bKeys&a)&&(b>c)) //檢查按鈕計數器是否超過指定的數字,並且按鈕仍然按著的巨集 unsigned char data t2buf,t2kb,blKeys,bKeys,nKeys; unsigned char data tMANUL,tAUTO,tCLEAN,tROLL,tON; void timer2(void) interrupt 5 using 1{ // event via 1 ms t2buf=P0; //備份PORT的狀態 P0=0xff; //把PORT設成準接收PORT blKeys=bKeys; //備份上一次的按鈕狀態,以便比對狀態是否變更 nKeys=P0; //取得PORT的狀態 bKeys=~nKeys; //複製一份補數,方便後面用正邏輯檢查是否釋放 P0=t2buf; //還原P0 ,因為P0上面還接LED XDD bkey_ctc(mkMANUL,tMANUL); //檢查各按鈕,並且計算時間 bkey_ctc(mkAUTO,tAUTO); bkey_ctc(mkCLEAN,tCLEAN); bkey_ctc(mkROLL,tROLL); bkey_ctc(mkON,tON); } void main{void){ init(); // init CPU and Interrupt while(1){ chKeyPress(mkMANUL,tMANUL,50){ tMANUAL=0; //if press out of 50ms and released then... ..... chKeyNPress(mkCLEAN,tCLEAN,50){ tCLEAN=0; //if press out of 50ms and not released then... ..... } } chKeyPress(mkAUTO,tAUTO,50){ tAUTO=0; //if press out of 50ms and released then... ..... } chKeyPress(mkROLL,tON,100){ // Power on/off need makesure to 100ms tON=0; if(chKeyNPress(mkROLL,tROLL,80){ tROLL=0; //if press out of 80ms and not released then... ..... } ..... } } } -- ~~於是,銀河的歷史又被海賊抹黑了好幾百頁。 咦?的歷史又被抹黑了好幾百頁!? - A23203 - BM4GRM Harlock WolfLord <<上站通知>> -- 我來啦! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.46.205.50 ※ 編輯: WolfLord 來自: 114.46.205.50 (08/10 01:40)

08/11 18:50, , 1F
嗯嗯 謝謝 我試試看...
08/11 18:50, 1F

08/11 22:01, , 2F
恩 抱歉 這個我用 delay 的方法都會有問題...
08/11 22:01, 2F

08/12 02:27, , 3F
這不是DELAY,而是求算按鈕確定有持續按多久...
08/12 02:27, 3F
文章代碼(AID): #1AVmYu8k (ASM)
文章代碼(AID): #1AVmYu8k (ASM)