2014-04-17 77 views
0

我想通過返回每次我得到通過之前問這個問題,但從未工作過不同的布爾的帶領切換功能的幫助,使一個按鈕去抖軟件:愛特梅爾按鍵防抖動不工作

#include <avr/io.h> 

bool ledToggle(); 

int main(void) 
{ 
    DDRB |= (1 << 0); 
    DDRB &= ~(1 << 0); 

    while(1) 
    { 
     //TODO:: Please write your application code     

     if (ledToggle() == true) 
     {  
      //led on 
      PORTB |= (1 << 0);   
     }else{   
      //led off 
      PORTB &= ~(1 << 0);   
     }  
    } 
} 

bool ledToggle() 
{ 
    static bool state = false; 
    if(bit_is_clear(PINB, 1)){ 
     state = !state; 
    } 

    return state; 
} 

編輯

我沒有得到任何錯誤或任何東西,當我嘗試編譯它只是不工作...

+1

您是否收到任何錯誤,出現了意外輸出產生的?你卡住了嗎?你能否提出明確的問題? –

+0

no @TimCastelijns。我什麼也沒得到。它只是不起作用 – user3407319

+0

你期望它做什麼?它有什麼作用 ?請更好地解釋你的問題。 – blue112

回答

0

在main()的第二行中,您錯誤地將LED端口設置爲輸入,而不是BUTTON端口。它應該是:

DDRB &= ~(1 << 1); 

我建議使用定義爲使這種錯誤的方式不太可能:

#define LED 0 
#define BUTTON 1 

DDRB |= (1 << LED); 
DDRB &= ~(1 << BUTTON); 
+2

需要說明爲什麼/這個改變實際上是一個高質量的答案。 –

0

我不承認以何種方式該代碼會抖連接到交換機端口B/1.去抖裝置

  • 校驗和存儲密鑰邏輯狀態
  • 等待一定量的時間(取決於硬件,5 - 50米S)
  • 比較發生了什麼之前
  • 閱讀(現在)的邏輯狀態,如果相等的(現在的)邏輯狀態去抖國家重點

提供程序運作良好,則LED會反彈與交換機的速度相同。

在你bool ledToggle()我建議你宣佈static volatile bool state;,以確保該變量在RAM中(而不是CPU寄存器)