我已经在pic 18F4550上使用c编译器C18在mplab v8.63中编写了这个程序。如果我按下我的picdem上的按钮(S3)并且在RB5上连接了一个LED(带有电阻器),那么led就会继续。当我按下(S3)并且RB4上有一个LED时,led不会打开(虽然我预期这个)与RB3相同。我忘记了要设置的东西吗?
目标是用LDR分别测量红色,绿色和蓝色LED。但首先我显然必须启用端口RB5,RB4和RB3。
#pragma code
/******************************************************************************/
void main (void)
{
TRISD = 0x00; // PORTD as output
TRISB = 0b00110000; // RB4 en RB5 as input
TRISA = 0x00; // RA output
RCONbits.IPEN = 0; // priority
INTCONbits.GIE = 1; // enable interrupt
INTCONbits.RBIE = 1; // interrupt portB on
while(1)
{
_asm sleep _endasm
}
}
#pragma interrupt ISR
void ISR (void)
{
//int red= 01110010011011110110111101100100;
int on = 1;
int off = 0;
if (INTCONbits.RBIF==1)
{
if(PORTBbits.RB5==0) // S3 pressed?
{
LATDbits.LATD1 ^= 1; // D2 toggle
LATAbits.LATA2 ^= on;
}
if(PORTBbits.RB4==0)
{
LATDbits.LATD1 ^= 1; // D2 toggle
LATAbits.LATA2 ^= on;
}
if(PORTBbits.RB3==0)
{
LATDbits.LATD1 ^= 1; // D2 toggle
LATAbits.LATA2 ^= on;
}
}
INTCONbits.RBIF = 0;
}
答案 0 :(得分:1)
在PIC TRIS寄存器中,设置为1表示输入,0表示输出。设置TRISB = 0b00110000,它是端口B上除RB5和输入4之外的所有输出。如果您还需要RB3作为数字输入,则需要设置TRISB = 0b00111000。这些位计为b7,b6,b5,b4,b3,b2,b1,b0。
但是,您期望RB3触发RBIF,而不是explained here。因此,只有RB5和4才会触发RBIF,但如果RB3此时为低,则会切换D1和A2。所以将这段代码按照我的建议移动到主循环,直到你得到它为止,然后让它在中断上工作。
正如ChrisJ所说,有些引脚默认为模拟输入,除非你禁用它,所以你不会得到数字输入和中断引脚更改,你期望使用ADCON1
答案 1 :(得分:0)
如果PBADEN
位置1,PORTB初始化为RB4:RB0设置为模拟输入。如果是这样,您必须使用ADCON1
禁用RB4上的模拟输入:RB0。手册第10.2节开头的示例程序将0x0E改为ADCON1
以正确初始化PORTB。
有关ADCON1
位的说明,另请参见第21.0节。