C8051F850有两个外部中断向量,分别是INT0,INT1。只有P0口支持外部中断输入。比较奇怪的是,GPIO的边沿设置竟然是放在了TCON这个寄存器里面。。
如下代码实现了:将P0.4作为外部中断INT0的输入,并且设置成下降沿触发。并使用P1.0口作为LED的输出口。
void C8051F850_IO_Initial(void)
{
//Disable Watchdog with key sequence
WDTCN = 0xDE;
WDTCN = 0xAD;
//Using internal 24.5MHz RC Oscillator, and no Division
CLKSEL = CLKSEL_CLKSL__HFOSC | CLKSEL_CLKDIV__SYSCLK_DIV_1;
//GPIO initial, All IO are input
P0MDOUT = P0MDOUT_B0__OPEN_DRAIN | P0MDOUT_B1__OPEN_DRAIN | P0MDOUT_B2__OPEN_DRAIN
| P0MDOUT_B3__OPEN_DRAIN | P0MDOUT_B4__OPEN_DRAIN | P0MDOUT_B5__OPEN_DRAIN
| P0MDOUT_B6__OPEN_DRAIN | P0MDOUT_B7__OPEN_DRAIN;
//All P0 IO are digital function
P0MDIN = P0MDIN_B0__DIGITAL | P0MDIN_B1__DIGITAL | P0MDIN_B2__DIGITAL
| P0MDIN_B3__DIGITAL | P0MDIN_B4__DIGITAL | P0MDIN_B5__DIGITAL
| P0MDIN_B6__DIGITAL | P0MDIN_B7__DIGITAL;
//P0.4 is GPIO, so Skipped
P0SKIP = P0SKIP_B0__NOT_SKIPPED | P0SKIP_B1__NOT_SKIPPED | P0SKIP_B2__NOT_SKIPPED
| P0SKIP_B3__NOT_SKIPPED | P0SKIP_B4__SKIPPED | P0SKIP_B5__NOT_SKIPPED
| P0SKIP_B6__NOT_SKIPPED | P0SKIP_B7__NOT_SKIPPED;
//P1.0 LED output
P1MDOUT = P1MDOUT_B0__PUSH_PULL | P1MDOUT_B1__OPEN_DRAIN | P1MDOUT_B2__OPEN_DRAIN
| P1MDOUT_B3__OPEN_DRAIN | P1MDOUT_B4__OPEN_DRAIN | P1MDOUT_B5__OPEN_DRAIN
| P1MDOUT_B6__OPEN_DRAIN | P1MDOUT_B7__OPEN_DRAIN;
//All P1 IO are ditigal
P1MDIN = P1MDIN_B0__DIGITAL | P1MDIN_B1__DIGITAL | P1MDIN_B2__DIGITAL
| P1MDIN_B3__DIGITAL | P1MDIN_B4__DIGITAL | P1MDIN_B5__DIGITAL
| P1MDIN_B6__DIGITAL | P1MDIN_B7__DIGITAL;
//P1.0 is GPIO, so skipped
P1SKIP = P1SKIP_B0__SKIPPED | P1SKIP_B1__NOT_SKIPPED | P1SKIP_B2__SKIPPED
| P1SKIP_B3__NOT_SKIPPED | P1SKIP_B4__NOT_SKIPPED | P1SKIP_B5__NOT_SKIPPED
| P1SKIP_B6__NOT_SKIPPED | P1SKIP_B7__NOT_SKIPPED;
XBR2 = XBR2_WEAKPUD__PULL_UPS_ENABLED | XBR2_XBARE__ENABLED;
//Active Low, @P0.4
IT01CF = IT01CF_IN0PL__ACTIVE_LOW | IT01CF_IN0SL__P0_4;
//External 0 interrupt is triggered by edge
TCON |= TCON_IT0__EDGE;
//Enable external interrupt 0
IE = IE_EA__DISABLED | IE_EX0__ENABLED | IE_EX1__DISABLED | IE_ESPI0__DISABLED
| IE_ET0__DISABLED | IE_ET1__DISABLED | IE_ET2__DISABLED | IE_ES0__DISABLED;
}
在主函数中的调用如下:
#pragma vector=IE0_int
__interrupt void External_ISR(void)
{
LED1 != LED1;
}
void main(void)
{
C8051F850_IO_Initial();
IE_bit.EA = 1;
while(1);
}