作者WolfLord (呆呆小狼)
看板ASM
标题Re: [问题] 请问反弹跳@@?
时间Mon Aug 10 01:34:43 2009
//既然你要用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)
1F:推 sorkayi:嗯嗯 谢谢 我试试看... 08/11 18:50
2F:→ sorkayi:恩 抱歉 这个我用 delay 的方法都会有问题... 08/11 22:01
3F:→ WolfLord:这不是DELAY,而是求算按钮确定有持续按多久... 08/12 02:27