2013-11-01 62 views
0

我的代碼如下所示,我試圖使用按鈕來打開和關閉LED。所以按一次就會打開它,它會一直亮着,直到再次按下按鈕。PIC部件 - 檢查按鈕的狀態

但是,在編譯期間出現一個錯誤 - 「地址標籤重複或第二遍不同」 錯誤指向以「check BTFSS」開頭的行的第二次出現。

我在這裏做錯了什麼?

在此先感謝。 :)

;Program name: T code 

;CPU Configuration 
processor 16F84A 
include <p16f84a.inc> 

__config _XT_OSC & _WDT_OFF & _PWRTE_ON 

;Register Label Equates 
PORTA equ 05 
PORTB equ 06 
Count equ 0C 

;Register Bit Label Equates 
Input equ 4 ;PUSH BUTTON INPUT RA4 
LED1 equ 0 ;LED OUTPUT RB0 

;*****Program Start***** 

org 0 

;Initialize (Default = Input) 
movlw B'00000000'  ;Define Port B output 
tris PORTB  ; and set bit direction 
goto check 

;Main Loop 
check BTFSS PORTA,Input  ;If button is OFF, goto check, and keep waiting for button  HIGH condition. 
    goto check  ; 
bsf PORTB,LED1  ;Turn the LED ON 

check BTFSS PORTA,Input  ;Assuming the LED is currently ON, keep checking for a button press... 
    goto check 
bcf PORTB,LED1  ;Turn the LED OFF 
goto check  ;repeat always 

END 
+1

不是PIC程序員,但它看起來像我已經標記了兩行'check',這是混淆了彙編程序。也許你應該給他們貼上'check1'和'check2'。 – 2013-11-01 12:48:05

回答

2

你有兩種不同的標籤叫check,所以彙編程序不能決定在哪裏跳。重命名其中一個標籤。

+0

感謝您的及時回覆。我按照你的建議改變了它,現在它編譯出來了,但是有一個邏輯錯誤,因爲LED一直保持ON狀態,按鈕什麼都不做...... –

+1

這些檢查將發生得如此之快,以致於只需按一次按鈕就可以註冊數十甚至數百(取決於時鐘速度)按鈕按下。一旦您檢測到按鈕按下,您將需要添加延遲。也請確保您的gotos正確無誤,因爲您已更改標籤。 –

1

有這個計劃的幾個誤區:

你有check標籤在那裏兩次,則需要重命名它。

這兩個代碼塊基本相同,因此每個BTFSS指令都會暫停執行,直到您按下按鈕,然後代碼快速執行。我假設你釋放按鈕時LED會打開或關閉(隨機選擇哪個),然後在按住按鈕的同時亮起半路。

你需要沿着線的東西:

check_a BTFSS PORTA,Input ; Wait for button push 
      GOTO check_a 

      ; You need a delay here to debounce the switch 
      MOVLW D'1000' ; You need to tune this value, I'm just guessing 
      MOVWF Delay 
delay_a DECFSZ Delay, 1 
      GOTO delay_a 

check_b BTFSC PORTA,Input ; Wait for button release 
      GOTO check_b  

      ; You need a delay here to debounce the switch 
      MOVLW D'1000' ; You need to tune this value, I'm just guessing 
      MOVWF Delay 
delay_b DECFSZ Delay, 1 
      GOTO delay_b 

      BTG PORTB,LED1 ; Toggle LED on or off 
      GOTO check_a 

反跳是至關重要的,因爲機械按鈕具有小金屬葉子製成,除人可以告訴,但遠遠低於微控制器可以告訴更快中斷聯繫,所以單按鈕顯示爲多個快速推入微控制器。我通常使用20毫秒左右的延遲。

目前,我沒有開發板來試試這個,所以有可能需要一些調試。