PIC组件 - 检查按钮状态

时间:2013-11-01 12:42:02

标签: assembly pic

我的代码如下所示,我正在尝试使用按钮打开和关闭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

2 个答案:

答案 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毫秒左右的延迟。

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