STC8H系列—6.普通IO口的中断控制教程

一、概述:

    STC8H系列单片机仅部分支持普通IO口中断,关于通用IO口中断的功能传统的c51单片机是不具备这个功能的,这个功能在原外部中断INT的基础发展而来,使的单片机对中断资源的扩展有了很大的提升。普通IO口的中断除了四种类型的中断模式外,还支持优先级的设定,支持中断唤醒功能。以下测试为P2口的中断开启实验。

二、知识链接:

1、触发模式配置:

      端口的触发模式总共4种模式,下降沿中断、上升沿中断、低电平中断,高电平中断。

   2、PnINTE寄存器为端口使能:

      例如:P2INTE=0x01表示开启P20端口中断的使能。

   3、中断标志位PxINTF:

   中断标志位,当有中断请求后,系统自动自动置1,当中断完成后需要手动清0。

      4、PxWKUE寄存器中断掉电唤醒使能。

   当系统需要掉电唤醒时,必须先使用该位,操作方法与开启中断类似。

   5、配置优先级PINIPL、PINIPH,分为四个优先级别,默认最低级:

三、实验平台搭建:

   1、MCU:STC-打狗棒系列核心实验板 V2.3

   2、实验板平台:德飞莱LY-51s

   3、硬件连接表:

     K1------>P20    P20口中断

      K2------>P21    P21口中断

      K3------>P22    P22口中断

      LED1----->P2    指示灯1,指示P2口所有下降沿

      LED2----->P20   指示灯2,指示P20口所有下降沿

      LED3----->P21   指示灯3,指示P21口所有下降沿

      LED4----->P22   指示灯4,指示P22口所有下降沿

四、测试源代码:

#include <STC8H.h>

#include "intrins.h"

sbit Led1=P0^0;

sbit Led2=P0^1;

sbit Led3=P0^2;

sbit Led4=P0^3;

#define     PINIPL                   (*(unsigned char volatile xdata *)0xfD60)

#define     PINIPH                   (*(unsigned char volatile xdata *)0xfD61)

void Delay1ms(unsigned char x);//当主时钟频率为12M,1ms延时为基准

void init_IO();//初始化IO

void init_IOINT();

void main()

{

      P_SW2 |= 0x80;  //扩展寄存器XFR访问使能

      init_IO();

     init_IOINT();

   while(1)

    {

       

      }

}

void init_IOINT()//中断初始化

{

      P2INTE|=0x07;//开P20-P22的中断使能

      P2INTF&=0x00;//清除P20的中断标志

     

      P2IM1|=0x00;//设置P2端口的中断模式为下降沿触发

      P2IM0|=0x00;

     

      PINIPL|=0x02;//设置P20优先级为11最高级

      PINIPH|=0x02;

  

      EA=1;//开总中断

}

void init_IO()

{

   RSTCFG=0x50;  //开启RST键进入ISP模式

   P0M1 = 0x00;   P0M0 = 0x00;   //设置P0口为准双向口

   P2M1 = 0x00;   P2M0 = 0x00;   //设置P1口为准双向口

   P3M1 = 0x00;   P3M0 = 0x00;   //设置P3口为准双向口

  

}

void Delay1ms(unsigned char x)    //@12.000MHz

{

   unsigned char i, j;

   i = 16;

   j = 147;

   while(x--)

   {

      do

      {

        while (--j);

      } while (--i);

   } 

}

void INTP2_isr() interrupt 39//INTP2中断入口

{

      Led1=~Led1;

      if(P2INTF&0x01)

        Led2=~Led2;//P20口中断时

      if(P2INTF&0x02)

        Led3=~Led3;//P21口中断时

      if(P2INTF&0x04)

        Led4=~Led4;//P22口中断时

      P2INTF&=0x00;//清空p2口所有标志位

}

猜你喜欢

转载自blog.csdn.net/qq_21082985/article/details/132060676
今日推荐