【问题标题】:PIC BTFSC and BTFSS not working on PORTAPIC BTFSC 和 BTFSS 不适用于 PORTA
【发布时间】:2013-04-21 03:11:11
【问题描述】:

我总是在 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

【问题讨论】:

    标签: output pic microchip blink


    【解决方案1】:

    我更喜欢:

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

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

    所以在你的 RAM 中使用一点来反映 PORTA、RA1 的状态。相信我,它会无缝运行。

    【讨论】:

      【解决方案2】:

      在标签 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
      

      【讨论】:

      • 我不确定你在说什么。 BTFSS 或 BTFSC 指令查看寄存器的位 X 是 1 还是 0。以及您的 TRISA 端口是否设置为输出模式。然后您应该可以查看它们的输出是否已设置。您只给了我一个切换位的解决方案,但没有解决:如何知道位的状态?该代码在 TRISB / PORTB 上完美运行。所以 BTFSS 似乎是这里的问题......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 2016-08-03
      • 2012-01-27
      • 2012-02-14
      相关资源
      最近更新 更多