線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1580
推到 Plurk!
推到 Facebook!

關於多組單鍵開關的問題!!

答題得分者是:handystudio
killerqoo
一般會員


發表:1
回覆:3
積分:0
註冊:2010-04-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-11 21:50:02 IP:112.105.xxx.xxx 訂閱
大家好,我是新手,接觸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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-14 13:42:53 IP:202.39.xxx.xxx 訂閱
 "當我要再加入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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-14 17:09:32 IP:114.37.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-16 10:26:56 IP:114.37.xxx.xxx 訂閱
 最近用別的方式寫出,程式如下。
有一點想要請教的是,在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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-04-26 20:40:05 IP:202.39.xxx.xxx 訂閱
你的程式在沒按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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-05-01 07:51:09 IP:125.228.xxx.xxx 訂閱
大家好,我是新手,接觸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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-05-01 08:01:34 IP:125.228.xxx.xxx 訂閱

[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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-05-04 20:46:21 IP:112.105.xxx.xxx 訂閱
handystudio您好,我照您所修改的方式,將大括弧移動後,問題真的解決了,真是謝謝您了,感激不盡,各位也可以參考一下。
handystudio
高階會員


發表:1
回覆:81
積分:106
註冊:2005-03-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-05-04 20:55:28 IP:114.43.xxx.xxx 訂閱
不客氣.
===================引 用 killerqoo 文 章===================
handystudio您好,我照您所修改的方式,將大括弧移動後,問題真的解決了,真是謝謝您了,感激不盡,各位也可以參考一下。
------
歡迎光臨 輕巧工作室
網站 http://www.handystudio.tw
控制電路板客製設計、製作交貨
8051專題製作/專題客製
系統時間:2024-06-29 16:26:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!