📄 portb.c
字号:
#include <pic18.h>
#include "portb.h"
unsigned int COUNTER0;
unsigned int COUNTER1;
unsigned int COUNTER2;
unsigned int COUNTER3;
unsigned int COUNTER4;
unsigned int COUNTER5;
unsigned int COUNTER6;
unsigned int COUNTER7;
unsigned int COUNTER8;
void interrupt ISR(void);
void init(void);
void main(void)
{
init();
while(1)
{
INTEDG0=RA5; // rising/falling edge trigger set by device on RA5
INTEDG1=RA5;
INTEDG2=RA5;
INTEDG3=RA5;
if(COUNTER0>0)LED0=((--COUNTER0)>>8)&1; // if an LED 16-Bit counter is active,
if(COUNTER1>0)LED1=((--COUNTER1)>>8)&1; // the LED will display the status of
if(COUNTER2>0)LED2=((--COUNTER2)>>8)&1; // bit 8 of the counter variable.
if(COUNTER3>0)LED3=((--COUNTER3)>>8)&1; // This will give the LED a blinking
if(COUNTER4>0)LED4=((--COUNTER4)>>8)&1; // characteristic.
if(COUNTER5>0)LED5=((--COUNTER5)>>8)&1;
if(COUNTER6>0)LED6=((--COUNTER6)>>8)&1;
if(COUNTER7>0)LED7=((--COUNTER7)>>8)&1;
if(COUNTER8>0)LED8=((--COUNTER8)>>8)&1;
}
}
void interrupt ISR(void)
{
static unsigned char last_portb;
unsigned char change;
if((INT0IE)&&(INT0IF))
{
COUNTER0=RELOAD; // reload the LED counter if interrupt detected
INT0IF=0;
}
if((INT1IE)&&(INT1IF))
{
COUNTER1=RELOAD;
INT1IF=0;
}
if((INT2IE)&&(INT2IF))
{
COUNTER2=RELOAD;
INT2IF=0;
}
if((INT3IE)&&(INT3IF))
{
COUNTER3=RELOAD;
INT3IF=0;
}
if((RBIF)&&(RBIE))
{
if((PORTB)>(last_portb))
{
change=(PORTB^last_portb); // general interrupt on change, need to
switch(change) // work out which pin was responsible for
{ // this interrupt.
case 0x10:
COUNTER4=RELOAD;
break;
case 0x20:
COUNTER5=RELOAD;
break;
case 0x40:
COUNTER6=RELOAD;
break;
default:
COUNTER7=RELOAD;
break;
}
}
else
COUNTER8=RELOAD;
RBIF=0;
}
last_portb=PORTB;
}
void init(void)
{
TRISB=0;
PORTB=0;
TRISB=0xFF;
TRISC=0x00;
PORTC=0;
TRISA=0x3F;
RBPU=0;
GIE=1;
IPEN=0;
INT0IE=1;
INT1IE=1;
INT2IE=1;
INT3IE=1;
RBIE=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -