關於多組單鍵開關的問題!! |
答題得分者是:handystudio
|
killerqoo
一般會員 發表:1 回覆:3 積分:0 註冊:2010-04-11 發送簡訊給我 |
大家好,我是新手,接觸Keil C一個星期了,想請教一下我該如何實現多組單鍵開關。
動作: 1.當P0.0按下後,P2.0 LED延遲亮,緊接著P2.1與P2.2延遲亮,當再次按下P0.0時,P2.1與P2.2延遲熄滅,最後P2.0 LED延遲熄滅,不斷循環此動作。 2.當P0.1按下時,P2.3 LED延遲亮,緊接著P2.4與P2.5延遲亮,當再次按下P0.0時,P2.4與P2.5延遲熄滅,最後P2.3 LED延遲熄滅,不斷循環此動作。 目前只完成第1項,當我要再加入P0.1按鍵時,完全沒反應,程式應該如何修改呢? (還是說我寫的不對,此程式並不適合) 請教各位能給予解答,謝謝! #include "io51.h" void DELAY(unsigned int value); void main(void) { char I=0; while (1) { while (P0_0!=0); DELAY(1000); while (P0_0!=1); while (I>1) I=0; switch(I) { case 0: DELAY(100); P2_0=0; DELAY(2000); P2_1=0; P2_2=0; break; case 1: DELAY(100); P2_2=1; //Audio Relay On// DELAY(1000); P2_1=1; P2_0=1; break; default: break; } I ; } } void DELAY(unsigned int value) { TR0=1; while (value>0) { TL0=(65536-5000)%6; TH0=(65536-5000)/256; while (TF0!=1); TF0=0; value--; } TR0=0; } |
handystudio
高階會員 發表:1 回覆:81 積分:106 註冊:2005-03-26 發送簡訊給我 |
"當我要再加入P0.1按鍵時,完全沒反應"
=> 你程式裡並無 P0.1 , 能PO 上你說的 "完全沒反應" 的程式嗎? 這樣才能知道為何 "完全沒反應". ===================引 用 killerqoo 文 章=================== 大家好,我是新手,接觸Keil C一個星期了,想請教一下我該如何實現多組單鍵開關。 動作: 1.當P0.0按下後,P2.0 LED延遲亮,緊接著P2.1與P2.2延遲亮,當再次按下P0.0時,P2.1與P2.2延遲熄滅,最後P2.0 LED延遲熄滅,不斷循環此動作。 2.當P0.1按下時,P2.3 LED延遲亮,緊接著P2.4與P2.5延遲亮,當再次按下P0.0時,P2.4與P2.5延遲熄滅,最後P2.3 LED延遲熄滅,不斷循環此動作。 目前只完成第1項,當我要再加入P0.1按鍵時,完全沒反應,程式應該如何修改呢? (還是說我寫的不對,此程式並不適合) 請教各位能給予解答,謝謝! #include "io51.h" void DELAY(unsigned int value); void main(void) { char I=0; while (1) { while (P0_0!=0); DELAY(1000); while (P0_0!=1); while (I>1) I=0; switch(I) { case 0: DELAY(100); P2_0=0; DELAY(2000); P2_1=0; P2_2=0; break; case 1: DELAY(100); P2_2=1; //Audio Relay On// DELAY(1000); P2_1=1; P2_0=1; break; default: break; } I ; } } void DELAY(unsigned int value) { TR0=1; while (value>0) { TL0=(65536-5000)%6; TH0=(65536-5000)/256; while (TF0!=1); TF0=0; value--; } TR0=0; }
------
歡迎光臨 輕巧工作室 網站 http://www.handystudio.tw 控制電路板客製設計、製作交貨 8051專題製作/專題客製 |
killerqoo
一般會員 發表:1 回覆:3 積分:0 註冊:2010-04-11 發送簡訊給我 |
handystudio您好,我是照書上所寫的來做修改,以下是P0.1所增加的部份
#include "io51.h" void DELAY(unsigned int value); void main(void) { char I,P0_1!=0); DELAY(1000); while (P0_0!=1,J>1) I=0,switch(J) { case 0: DELAY(100); P2_3=0; DELAY(2000); P2_4=0; P2_5=0; break; case 1: DELAY(100); P2_5=1; DELAY(1000); P2_4=1; P2_3=1; break; default: break; } J ; } } DELAY副程式....... ..................................................................................................................................................... 以上是照這書本做更改,應該是亂的一蹋糊塗,不過還是想知道要如何讓P0.1作動,以上的程式碼在執行時,只有P0.0動作,P0.1完全不動, 還請handystudio能幫我解答。 最近幾天也努力爬文,應該是錯的。 應該先初始化I=0,識別按鍵是否成功,按一次按鈕I號 1,接著再根據I號做各個執行動作。 目前會先試試新的方法,不過也希望上述程式能完成,謝謝!! |
killerqoo
一般會員 發表:1 回覆:3 積分:0 註冊:2010-04-11 發送簡訊給我 |
最近用別的方式寫出,程式如下。
有一點想要請教的是,在LED2的部份,當我按下按鍵按下後迅速放開),2秒後P0.0時,需按住按鍵2秒後才會作動。 不知有何方式能解決此問題,還請各位高人能給予解答,謝謝。 void LED1(); void LED2(); char count; LED1(); break; case 2: //................................................................................. DELAY(400); P2_1=0; } DELAY(400); P2_0=1; } //.......................................................................................... DELAY副程式.............................. |
handystudio
高階會員 發表:1 回覆:81 積分:106 註冊:2005-03-26 發送簡訊給我 |
你的程式在沒按P0_0時,就一直在執行
switch(count) { case 1: LED1(); break; case 2: LED2(); break; } 程式一起動,因 count = 0,所以沒有執行到LED()裡面的DELAY,所以第一次正常 當第一次執行後,count = 1,雖然還沒按P0_0,但程式一直會執行LED1();所以有機率會等DELAY完後,才偵測P0_0 試試下面程式,跟原程式只移動一個右大括胡的位置 void main(void) { while(1) { if(P0_0==0) { DELAY(20); if(P0_0==0) { count ; if(count==3) { count=1; } while(P0_0==0); } switch(count) { case 1: LED1(); break; case 2: LED2(); break; } } } } ===================引 用 killerqoo 文 章=================== 最近用別的方式寫出,程式如下。 有一點想要請教的是,在LED2的部份,當我按下按鍵按下後迅速放開),2秒後P0.0時,需按住按鍵2秒後才會作動。 不知有何方式能解決此問題,還請各位高人能給予解答,謝謝。 void LED1(); void LED2(); char count; LED1(); break; case 2: //................................................................................. DELAY(400); P2_1=0; } DELAY(400); P2_0=1; } DELAY副程式..............................
------
歡迎光臨 輕巧工作室 網站 http://www.handystudio.tw 控制電路板客製設計、製作交貨 8051專題製作/專題客製 |
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
大家好,我是新手,接觸Keil C一個星期了,想請教一下我該如何實現多組單鍵開關。
動作: 1.當P0.0按下後,P2.0 LED延遲亮,緊接著P2.1與P2.2延遲亮,當再次按下P0.0時,P2.1與P2.2延遲熄滅,最後P2.0 LED延遲熄滅,不斷循環此動作。 2.當P0.1按下時,P2.3 LED延遲亮,緊接著P2.4與P2.5延遲亮,當再次按下P0.0時,P2.4與P2.5延遲熄滅,最後P2.3 LED延遲熄滅,不斷循環此動作。 目前只完成第1項,當我要再加入P0.1按鍵時,完全沒反應,程式應該如何修改呢? (還是說我寫的不對,此程式並不適合) 請教各位能給予解答,謝謝! #include "io51.h" void DELAY(unsigned int value); void main(void) { char I=0; while (1) {? while (P0_0!=0); DELAY(1000); while (P0_0!=1); while (I>1) I=0; switch(I) { case 0: DELAY(100); ??? P2_0=0; ??? DELAY(2000); ??? P2_1=0; ??? P2_2=0; ??? break; case 1: DELAY(100); ??? P2_2=1; //Audio Relay On// ??? DELAY(1000); ??? P2_1=1; ??? P2_0=1; ??? break; default: break; } I ; } } void DELAY(unsigned int value) { TR0=1; while (value>0) { TL0=(65536-5000)%6; TH0=(65536-5000)/256; while (TF0!=1); TF0=0; value--; } TR0=0; } ?
編輯記錄
src 重新編輯於 2010-05-01 07:57:19, 註解 無‧
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
[code c#] 有關判斷多組按鍵的經驗分享 在兩種功能選擇時要設定旗標,當旗標1或0時分別執行不同功能的程式 例: 在程式前面宣告按鍵變數、旗標變數及函式 sbit key1=P0.0; sbit key2=P0.1; bit flag1; bit flag2; void fun1(); void fun2(); void fun3(); void fun4(); main() { if(key1==0) { flag1=~flag1; if(flag1==1) { fun1(); } else { fun2(); } } if(key2==0) { flag2=~flag2; if(flag2==1) { fun3(); } else { fun4(); } } } void fun1() { 執行fun1的動作 } void fun2() { 執行fun2的動作 } void fun3() { 執行fun3的動作 } void fun4() { 執行fun4的動作 } [/code] ===================引 用 src 文 章=================== 大家好,我是新手,接觸Keil C一個星期了,想請教一下我該如何實現多組單鍵開關。 動作: 1.當P0.0按下後,P2.0 LED延遲亮,緊接著P2.1與P2.2延遲亮,當再次按下P0.0時,P2.1與P2.2延遲熄滅,最後P2.0 LED延遲熄滅,不斷循環此動作。 2.當P0.1按下時,P2.3 LED延遲亮,緊接著P2.4與P2.5延遲亮,當再次按下P0.0時,P2.4與P2.5延遲熄滅,最後P2.3 LED延遲熄滅,不斷循環此動作。 目前只完成第1項,當我要再加入P0.1按鍵時,完全沒反應,程式應該如何修改呢? (還是說我寫的不對,此程式並不適合) 請教各位能給予解答,謝謝! #include "io51.h" void DELAY(unsigned int value); void main(void) { char I=0; while (1) {? while (P0_0!=0); DELAY(1000); while (P0_0!=1); while (I>1) I=0; switch(I) { case 0: DELAY(100); ??? P2_0=0; ??? DELAY(2000); ??? P2_1=0; ??? P2_2=0; ??? break; case 1: DELAY(100); ??? P2_2=1; //Audio Relay On// ??? DELAY(1000); ??? P2_1=1; ??? P2_0=1; ??? break; default: break; } I ; } } void DELAY(unsigned int value) { TR0=1; while (value>0) { TL0=(65536-5000)%6; TH0=(65536-5000)/256; while (TF0!=1); TF0=0; value--; } TR0=0; } ? |
killerqoo
一般會員 發表:1 回覆:3 積分:0 註冊:2010-04-11 發送簡訊給我 |
handystudio您好,我照您所修改的方式,將大括弧移動後,問題真的解決了,真是謝謝您了,感激不盡,各位也可以參考一下。
|
handystudio
高階會員 發表:1 回覆:81 積分:106 註冊:2005-03-26 發送簡訊給我 |
不客氣.
===================引 用 killerqoo 文 章=================== handystudio您好,我照您所修改的方式,將大括弧移動後,問題真的解決了,真是謝謝您了,感激不盡,各位也可以參考一下。
------
歡迎光臨 輕巧工作室 網站 http://www.handystudio.tw 控制電路板客製設計、製作交貨 8051專題製作/專題客製 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |