1

我总是在 PIC16F628A 的 PORTB 上闪烁 LED。

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

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

这是 PORTA 中的示例。我已经测试过,问题出在 BTFSS 和 BTFSC 功能上……因为如果我手动关闭或打开 led 运行良好。(我也省略了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

4

2 回答 2

1

我更喜欢:

与其陷入技术怪癖和哲学辩论,不如绕过这个问题。

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

因此,在您的 RAM 中使用一点来反映 PORTA、RA1 的状态。相信我,它将无缝运行。

于 2013-04-23T12:31:24.870 回答
1

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

在我看来,您尝试执行的代码会根据 LED 先前的状态切换 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
于 2013-04-22T03:53:39.980 回答