在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
答案 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的状态。相信我它会无缝地工作。