0

我的代码如下所示,我正在尝试使用按钮来打开和关闭 LED。因此,按一次它会打开它,它会一直亮着,直到再次按下按钮。

但是,我在编译过程中遇到一个错误 - “地址标签在第二遍中重复或不同” 该错误指向以“检查 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
4

2 回答 2

2

您有两个不同的标签,称为check,因此汇编器无法决定跳转到哪里。重命名这些标签之一。

于 2013-11-01T12:47:43.733 回答
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 毫秒左右的延迟。

目前,我没有开发板可以尝试这个,所以有可能需要一些调试。

于 2013-11-04T01:56:56.710 回答