Re: [問題] 請問反彈跳@@?
//既然你要用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
08/11 22:01, 2F
→
08/12 02:27, , 3F
08/12 02:27, 3F
討論串 (同標題文章)
完整討論串 (本文為第 4 之 6 篇):
2
6
ASM 近期熱門文章
PTT數位生活區 即時熱門文章