C8051F850 GPIO Interrrupt

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值