會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





pin18f4520 利用TMER中斷做防彈跳問題
新會員
註冊日期:
8月22日 19:48:23
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 0
離線
最近練習EVMAP001開發版
呼吸燈與紅綠燈
目前遇到按鈕防彈跳問題與清空問題
想請找高手解答一下
-----------------------------------------------

#include <p18f4520.h>
#include <timers.h>

#define TMR0_VAL 65535-977 // 計數值 0.25s

unsigned char a=0,b=0,c=0,i=0,j=0,k=0,p=0,e=0,g=0,h=0,u=0;

void main(void)
{
PORTD = 0x00; // 讀取輸入值
TRISD = 0; // D腳位為輸出
T0CON = 0b10000101; // TIMER暫存器
TRISAbits.TRISA4 = 1; // 按鈕為輸入
WriteTimer0(TMR0_VAL); // 判斷計數值初值
while(1)
{
if (INTCONbits.TMR0IF == 1) // 中斷旗標判斷0.25s
{
WriteTimer0(TMR0_VAL); // 計數值
INTCONbits.TMR0IF = 0; // 中斷旗標歸零
if (PORTAbits.RA4==0) // 按鈕判斷
{
a++;
if (a>1) // 按鈕判斷a值,執行呼吸燈與紅綠燈切換
a=0;
b=0,c=0;
PORTD = 0x00;
}
if (a==0) // a值為0執行
{
if (b==0) // 判斷b值為0執行
{

if (c>9) // LED燈右至左重複循環
c = 0;
c++;
switch (c) // LED燈右至左
{
case 1: PORTDbits.RD7 = 1;
break;
case 2: PORTDbits.RD6 = 1;
break;
case 3: PORTDbits.RD5 = 1;
break;
case 4: PORTDbits.RD4 = 1;
break;
case 5: PORTDbits.RD3 = 1;
break;
case 6: PORTDbits.RD2 = 1;
break;
case 7: PORTDbits.RD1 = 1;
break;
case 8: PORTDbits.RD0 = 1;
break;
default: b = 1; // b值=1
}
}
else // b值為1時執行
{
u++;
if (u>4) // LED燈左至左(1s)
{
u = 0;
if (i>9) // LED燈左至右重複循環
i = 0;
i++;
switch (i) // LED燈左至右
{
case 1: PORTDbits.RD0 = 0;
break;
case 2: PORTDbits.RD1 = 0;
break;
case 3: PORTDbits.RD2 = 0;
break;
case 4: PORTDbits.RD3 = 0;
break;
case 5: PORTDbits.RD4 = 0;
break;
case 6: PORTDbits.RD5 = 0;
break;
case 7: PORTDbits.RD6 = 0;
break;
case 8: PORTDbits.RD7 = 0;
break;
default: b = 0; // b值=0
}
}
}
}
else // a值為1執行
{
PORTD = 0x00; // 8個LED全滅
b++;
if (b>8) // 經過兩秒後
{
begin: PORTD=0x24; // LED3與LED6亮起
c++;
if (c>20) // 經過五秒後
{
PORTDbits.RD5 = 0; // LED3 熄滅
PORTDbits.RD6 = 1; // LED2 亮起
h++;
if (h>8) // 經過兩秒後
{
i++;
if (i>2) // LED5經過0.5s閃爍
{
i = 0;
PORTDbits.RD4 = 1;
}
i++;
if (i>2) // LED4經過0.5s閃爍
{
i = 0;
PORTDbits.RD3 = 1;
}
i++;
if (i>2) // LED5經過0.5s閃爍
{
i = 0;
PORTDbits.RD3 = 1;
}
i++;
if (i>2) // LED4經過0.5s閃爍
{
i = 0;
PORTDbits.RD4 = 1;
}
j++;
if (j>12) // 經過三秒後
{
PORTD=0x81;
k++;
if (k>20) // 經過五秒後
{
PORTDbits.RD0 = 0; // LED8 熄滅
PORTDbits.RD1 = 1; // LED7 點亮
p++;
if (p>8) // 經過兩秒後
{
e++;
if (e>2) // LED4經過0.5s閃爍
{
e = 0;
PORTDbits.RD3 = 1;
}
e++;
if (e>2) // LED5經過0.5s閃爍
{
e = 0;
PORTDbits.RD4 = 1;
}
e++;
if (e>2) // LED4經過0.5s閃爍
{
e = 0;
PORTDbits.RD4 = 1;
}
e++;
if (e>2) // LED5經過0.5s閃爍
{
e = 0;
PORTDbits.RD3 = 1;
}
g++;
if (g>12) // 經過三秒後
{
PORTD = 0x00;;
c=0,j=0,k=0,p=0,g=0,h=0;
goto begin;
}
}
}
}
}
}
}
}
}
}
}
----------------------------------------------------------

8月27日 16:11:39
轉換PDF檔 列印


Re: pin18f4520 利用TMER中斷做防彈跳問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1001
等級: 28; EXP: 1
HP : 0 / 675
MP : 333 / 22300
離線
a=0,b=0,c=0,i=0,j=0,k=0,p=0,e=0,g=0,h=0,u=0;

別鬧了...
變數只用單個英文字,那學來的...

8月27日 20:41:03
轉換PDF檔 列印


Re: pin18f4520 利用TMER中斷做防彈跳問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14479
等級: 73; EXP: 2
HP : 1080 / 1800
MP : 4826 / 75775
離線
可以參考一下利用 Timer 中斷所做的彈跳處理流程。

附加檔案:



jpg  擷取.JPG (52.37 KB)
16_5b8623ee40208.jpg 907X653 px

8月29日 12:41:18
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project