C8051F850 GPIO Interrrupt

来源:互联网 发布:dps分析软件win7 编辑:程序博客网 时间:2024/05/17 20:14

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);}


使用的IDE环境为IAR for 8051


0 0