PIC BTFSC和BTFSS不在PORTA上工作

时间:2013-04-21 03:11:11

标签: output pic microchip blink

在PIC16F628A中,我总是在PORTB上眨眼。

现在我需要在PORTA上这样做,因为我在PORTB上尝试键盘矩阵。

以下代码在PORTB的RB3上完美运行,但我没有在PORTA中运行。

以下是PORTA中的示例。 我已经测试过,问题出在BTFSS和BTFSC功能......因为如果我关掉或打开手动功能就好了。 (我还 ommited delay_1s_routine代码)

main
    ;*********CONFIGURACION LED**********
    clrf Puerto_Led
    movlw 0x07
    movwf CMCON
bsf STATUS,RP0
        clrf TRISA
bcf STATUS,RP0

loop
    call prende_apaga_Led
    call delay_1s_routine
goto loop


prende_apaga_Led
 btfsc PORTA,RA1    ;si esta en 0 salta el GOTO
 goto $+3
 bsf PORTA,RA1      ;Pongo en '1' el bit del Led Verde
 return
 bcf PORTA,RA1      ;Pongo en '1' el bit del Led Verde
return

感谢建议!!

编辑:在代码上加上实际值

PD:单独测试此指令并且效果很好   - bsf PORTA,RA1   - bcf PORTA,RA1

2 个答案:

答案 0 :(得分:1)

在标签prende_apaga_Led之后的代码中, 您似乎将LED引脚视为输入(使用btfsc测试),并将其作为输出(bsf和bcf)。该引脚不能同时用作两者。您可以将关联的TRISA位设置为输入或输出并坚持使用。

在我看来,您尝试执行的代码根据其先前的状态切换LED的值。你这样做的方式是行不通的。更简单的方法是使用xor函数,如下所示: movlw 0xYY;其中YY是0表示没有改变引脚输出的模式,1表示切换然后跟随 xorlw PORTA

所以简单地说就是:

    clrf Puerto_Led
    movlw 0x07
    movwf CMCON
    bsf STATUS,RP0
    clrf Conf_Led
    bcf STATUS,RP0
 loop
    movlw 0xYY ; change YY, i.e. if the LED is on RA2 YY will be 0x04
    xorlw Puerto_Led
    call delay_1s_routine
    goto loop

答案 1 :(得分:1)

我更喜欢:

而不是进入技术怪癖和哲学辩论,绕过问题..

我总是将影子寄存器用于端口状态,并对它们进行测试和驱动。

因此,在RAM中使用一点来反映PORTA,RA1的状态。相信我它会无缝地工作。