我的代码如下所示,我正在尝试使用按钮打开和关闭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
答案 0 :(得分:2)
您有两个名为check
的不同标签,因此汇编程序无法决定跳转到何处。重命名其中一个标签。
答案 1 :(得分: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毫秒左右的延迟。
目前,我没有开发板试试这个,所以有可能需要一些调试。