金凌新电源 发表于 2025-3-21 16:30:53

8H2K08U中断进不去


/* --- Web: www.stcai.com ------------------------------------------*/
/* --- BBS: www.stcaimcu.com ---------------------------------------*/

#define MAIN_Fosc      11059200L    //定义主时钟

#include    "STC8Hxxx.h"

/*************    功能说明    **************
请先别修改程序, 直接下载"interrupt.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
由于使用的中断号超过了31,所以KEIL编译器要拓展Keil的C代码中断号, 运行一下"拓展Keil的C代码中断号.exe"即可。

P0~P7所有IO中断测试程序.
P0.0~P0.7中断对应取反P1.0~P1.7输出指示。
P1.0~P1.7中断对应取反P0.0~P0.7输出指示。
P2.0~P2.7中断对应取反P4.0~P4.7输出指示。
P3.0~P3.7中断对应取反P4.0~P4.7输出指示。
P4.0~P4.7中断对应取反P2.0~P2.7输出指示。
P5.0~P5.7中断对应取反P4.0~P4.7输出指示。
P6.0~P6.7中断对应取反P7.0~P7.7输出指示。
P7.0~P7.7中断对应取反P6.0~P6.7输出指示。

由于IO有限, 本例子只设置了P0.0~P0.7和P2.0~P2.7的中断, 中断函数分别取反P1.0~P1.7和P4.0~P4.7来指示进入中断.
用户可以根据例子随意设置自己需要的IO中断.
主函数取反P3.3输出一个方波信号, 方便用户测试.

******************************************/

/*************    本地常量声明    **************/


/*************    本地变量声明    **************/


/*************    本地函数声明    **************/
void    GPIO_INT_Config(u8 gpio, u8 mode, u8 pin);    //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.



/*************外部函数和变量声明 *****************/


/******************** 主函数 **************************/
void main(void)
{
    P0M1 = 0;    P0M0 = 0;
    P1M1 = 0;    P1M0 = 0;
    P2M1 = 0;    P2M0 = 0;
    P3M1 = 0;    P3M0 = 0;
    P4M1 = 0;    P4M0 = 0;
    P5M1 = 0;    P5M0 = 0;
    P6M1 = 0;    P6M0 = 0;
    P7M1 = 0;    P7M0 = 0;
P1PU = 0xff;                                             //1=弱上拉
      P1M0 = 0x00; P1M1 = 0xff;

   
   
    //GPIO_INT_Config(GPIO_P0, INT_FALL, Pin0 | Pin1 | Pin2 | Pin3);    //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
    //GPIO_INT_Config(GPIO_P0, INT_RISE, Pin4 | Pin5 | Pin6 | Pin7);    //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
    GPIO_INT_Config(GPIO_P1, INT_LOW, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
    //GPIO_INT_Config(GPIO_P2, INT_FALL, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
//    GPIO_INT_Config(GPIO_P3, INT_FALL, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
//    GPIO_INT_Config(GPIO_P4, INT_FALL, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
//    GPIO_INT_Config(GPIO_P5, INT_FALL, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
//    GPIO_INT_Config(GPIO_P6, INT_FALL, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
//    GPIO_INT_Config(GPIO_P7, INT_FALL, PinAll);      //普通IO中断配置函数, 中断模式(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.

    EA = 1;    //全局中断允许

    while(1)
    {
      u8    i;
      
      i = 196;
      while(i--);
    }
}


//========================================================================
// 函数: void    GPIO_INT_Config(u8 gpio, u8 pin, u8 mode)
// 描述: IO中断初始化函数.
// 参数: gpio: 要初始化的IO组, 参数取值(只取其一): GPIO_P0, GPIO_P1, GPIO_P2, GPIO_P3, GPIO_P4, GPIO_P5, GPIO_P6, GPIO_P7, GPIO_P8, GPIO_P9.
//       mode: 中断模式,       参数取值(只取其一): INT_FALL, INT_RISE, INT_LOW, INT_HIGH. 分别是 上升沿 下降沿 低电平高电平 中断.
//       pin:要初始化的引脚, 参数取值(多个值时用或操作): Pin0, Pin1, Pin2, Pin3, Pin4, Pin5, Pin6, Pin7. PinAll.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    GPIO_INT_Config(u8 gpio, u8 mode, u8 pin)
{
    u8    xdata    *pt;
    u8    j;

    if(gpio > GPIO_P7)    return;    //IO口错误
    if(mode >= 4)      return;    //模式错误
    P_SW2 |= 0x80;            //访问XFR

    pt= 0xfd10 + gpio;    //PxINTF端口中断标志寄存器
    *pt = *pt & ~pin;      //清除中断标志

    pt= 0xfd30 + gpio;            //PxIM1端口中断模式配置寄存器1
    if(mode & 0x02)    j = 0xff & pin;
    else            j = 0;
    *pt = (*pt & ~pin) | j;            //设置模式

    pt= 0xfd20 + gpio;            //PxIM0端口中断模式配置寄存器0
    if(mode & 0x01)    j = 0xff & pin;
    else            j = 0;
    *pt = (*pt & ~pin) | j;            //设置模式

    pt= 0xfd00 + gpio;    //PxINTE端口中断使能寄存器
    *pt |= pin;                //允许IO中断
}



//========================================================================
// 函数: void    P0INT_ISR(void) interrupt 37
// 描述: P0(P0.0~P0.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P0INT_ISR(void) interrupt 37    //P0.0~P0.7 IO中断处理代码
{
    u8    i;
    i = P0INTF;      //读取中断标志
    P0INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P0.0中断
    {
      P10 = ~P10;            //取反P1.0指示
    }
    if((i & INTF_1) != 0)    //P0.1中断
    {
      P11 = ~P11;            //取反P1.1指示
    }
    if((i & INTF_2) != 0)    //P0.2中断
    {
      P12 = ~P12;            //取反P1.2指示
    }
    if((i & INTF_3) != 0)    //P0.3中断
    {
      P13 = ~P13;            //取反P1.3指示
    }
    if((i & INTF_4) != 0)    //P0.4中断
    {
      P14 = ~P14;            //取反P1.4指示
    }
    if((i & INTF_5) != 0)    //P0.5中断
    {
      P15 = ~P15;            //取反P1.5指示
    }
    if((i & INTF_6) != 0)    //P0.6中断
    {
      P16 = ~P16;            //取反P1.6指示
    }
    if((i & INTF_7) != 0)    //P0.7中断
    {
      P17 = ~P17;            //取反P1.7指示
    }
}

//========================================================================
// 函数: void    P1INT_ISR(void) interrupt 38
// 描述: P1(P1.0~P1.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P1INT_ISR(void) interrupt 38      //P1.0~P1.7 IO中断处理代码
{
    u8    i;
    i = P1INTF;      //读取中断标志
    P1INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P1.0中断
    {
      P00 = ~P00;            //取反P0.0指示
    }
    if((i & INTF_1) != 0)    //P1.1中断
    {
      P01 = ~P01;            //取反P0.1指示
    }
    if((i & INTF_2) != 0)    //P1.2中断
    {
      P02 = ~P02;            //取反P0.2指示
    }
    if((i & INTF_3) != 0)    //P1.3中断
    {
      P03 = ~P03;            //取反P0.3指示
      P33 = ~P33;      //输出方波 4KHz @11.0592MHz
    }
    if((i & INTF_4) != 0)    //P1.4中断
    {
      P04 = ~P04;            //取反P0.4指示
    }
    if((i & INTF_5) != 0)    //P1.5中断
    {
      P05 = ~P05;            //取反P0.5指示
    }
    if((i & INTF_6) != 0)    //P1.6中断
    {
      P06 = ~P06;            //取反P0.6指示
    }
    if((i & INTF_7) != 0)    //P1.7中断
    {
      P07 = ~P07;            //取反P0.7指示
      P33 = ~P33;      //输出方波 4KHz @11.0592MHz
    }
}

//========================================================================
// 函数: void    P2INT_ISR(void) interrupt 39
// 描述: P2(P2.0~P2.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P2INT_ISR(void) interrupt 39      //P2.0~P2.7 IO中断处理代码
{
    u8    i;
    i = P2INTF;      //读取中断标志
    P2INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P2.0中断
    {
      P40 = ~P40;            //取反P4.0指示
    }
    if((i & INTF_1) != 0)    //P2.1中断
    {
      P41 = ~P41;            //取反P4.1指示
    }
    if((i & INTF_2) != 0)    //P2.2中断
    {
      P42 = ~P42;            //取反P4.2指示
    }
    if((i & INTF_3) != 0)    //P2.3中断
    {
      P43 = ~P43;            //取反P4.3指示
    }
    if((i & INTF_4) != 0)    //P2.4中断
    {
      P44 = ~P44;            //取反P4.4指示
    }
    if((i & INTF_5) != 0)    //P2.5中断
    {
      P45 = ~P45;            //取反P4.5指示
    }
    if((i & INTF_6) != 0)    //P2.6中断
    {
      P46 = ~P46;            //取反P4.6指示
    }
    if((i & INTF_7) != 0)    //P2.7中断
    {
      P47 = ~P47;            //取反P4.7指示
    }
}

//========================================================================
// 函数: void    P3INT_ISR(void) interrupt 40
// 描述: P3(P3.0~P3.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P3INT_ISR(void) interrupt 40      //P3.0~P3.7 IO中断处理代码
{
    u8    i;
    i = P3INTF;      //读取中断标志
    P3INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P3.0中断
    {
      P40 = ~P40;            //取反P4.0指示
    }
    if((i & INTF_1) != 0)    //P3.1中断
    {
      P41 = ~P41;            //取反P4.1指示
    }
    if((i & INTF_2) != 0)    //P3.2中断
    {
      P42 = ~P42;            //取反P4.2指示
    }
    if((i & INTF_3) != 0)    //P3.3中断
    {
      P43 = ~P43;            //取反P4.3指示
    }
    if((i & INTF_4) != 0)    //P3.4中断
    {
      P44 = ~P44;            //取反P4.4指示
    }
    if((i & INTF_5) != 0)    //P3.5中断
    {
      P45 = ~P45;            //取反P4.5指示
    }
    if((i & INTF_6) != 0)    //P3.6中断
    {
      P46 = ~P46;            //取反P4.6指示
    }
    if((i & INTF_7) != 0)    //P3.7中断
    {
      P47 = ~P47;            //取反P4.7指示
    }
}

//========================================================================
// 函数: void    P4INT_ISR(void) interrupt 41
// 描述: P4(P4.0~P4.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P4INT_ISR(void) interrupt 41      //P4.0~P4.7 IO中断处理代码
{
    u8    i;
    i = P4INTF;      //读取中断标志
    P4INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P4.0中断
    {
      P20 = ~P20;            //取反P2.0指示
    }
    if((i & INTF_1) != 0)    //P4.1中断
    {
      P21 = ~P21;            //取反P2.1指示
    }
    if((i & INTF_2) != 0)    //P4.2中断
    {
      P22 = ~P22;            //取反P2.2指示
    }
    if((i & INTF_3) != 0)    //P4.3中断
    {
      P23 = ~P23;            //取反P2.3指示
    }
    if((i & INTF_4) != 0)    //P4.4中断
    {
      P24 = ~P24;            //取反P2.4指示
    }
    if((i & INTF_5) != 0)    //P4.5中断
    {
      P25 = ~P25;            //取反P2.5指示
    }
    if((i & INTF_6) != 0)    //P4.6中断
    {
      P26 = ~P26;            //取反P2.6指示
    }
    if((i & INTF_7) != 0)    //P4.7中断
    {
      P27 = ~P27;            //取反P2.7指示
    }
}

//========================================================================
// 函数: void    P5INT_ISR(void) interrupt 42
// 描述: P5(P5.0~P5.4)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P5INT_ISR(void) interrupt 42      //P5.0~P5.4 IO中断处理代码
{
    u8    i;
    i = P5INTF;      //读取中断标志
    P5INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P5.0中断
    {
      P40 = ~P40;            //取反P4.0指示
    }
    if((i & INTF_1) != 0)    //P5.1中断
    {
      P41 = ~P41;            //取反P4.1指示
    }
    if((i & INTF_2) != 0)    //P5.2中断
    {
      P42 = ~P42;            //取反P4.2指示
    }
    if((i & INTF_3) != 0)    //P5.3中断
    {
      P43 = ~P43;            //取反P4.3指示
    }
    if((i & INTF_4) != 0)    //P5.4中断
    {
      P44 = ~P44;            //取反P4.4指示
    }
    if((i & INTF_5) != 0)    //P5.5中断
    {
      P45 = ~P45;            //取反P4.5指示
    }
}

//========================================================================
// 函数: void    P6INT_ISR(void) interrupt 43
// 描述: P6(P6.0~P6.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P6INT_ISR(void) interrupt 43      //P6.0~P6.7 IO中断处理代码
{
    u8    i;
    i = P6INTF;      //读取中断标志
    P6INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P6.0中断
    {
      P70 = ~P70;            //取反P7.0指示
    }
    if((i & INTF_1) != 0)    //P6.1中断
    {
      P71 = ~P71;            //取反P7.1指示
    }
    if((i & INTF_2) != 0)    //P6.2中断
    {
      P72 = ~P72;            //取反P7.2指示
    }
    if((i & INTF_3) != 0)    //P6.3中断
    {
      P73 = ~P73;            //取反P7.3指示
    }
    if((i & INTF_4) != 0)    //P6.4中断
    {
      P74 = ~P74;            //取反P7.4指示
    }
    if((i & INTF_5) != 0)    //P6.5中断
    {
      P75 = ~P75;            //取反P7.5指示
    }
    if((i & INTF_6) != 0)    //P6.6中断
    {
      P76 = ~P76;            //取反P7.6指示
    }
    if((i & INTF_7) != 0)    //P6.7中断
    {
      P77 = ~P77;            //取反P7.7指示
    }
}

//========================================================================
// 函数: void    P7INT_ISR(void) interrupt 44
// 描述: P0(P7.0~P7.7)中断处理函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-20
// 备注:
//========================================================================
void    P7INT_ISR(void) interrupt 44      //P7.0~P7.7 IO中断处理代码
{
    u8    i;
    i = P7INTF;      //读取中断标志
    P7INTF &= ~i;    //清除中断标志

    if((i & INTF_0) != 0)    //P7.0中断
    {
      P60 = ~P60;            //取反P6.0指示
    }
    if((i & INTF_1) != 0)    //P7.1中断
    {
      P61 = ~P61;            //取反P6.1指示
    }
    if((i & INTF_2) != 0)    //P7.2中断
    {
      P62 = ~P62;            //取反P6.2指示
    }
    if((i & INTF_3) != 0)    //P7.3中断
    {
      P63 = ~P63;            //取反P6.3指示
    }
    if((i & INTF_4) != 0)    //P7.4中断
    {
      P64 = ~P64;            //取反P6.4指示
    }
    if((i & INTF_5) != 0)    //P7.5中断
    {
      P65 = ~P65;            //取反P6.5指示
    }
    if((i & INTF_6) != 0)    //P7.6中断
    {
      P66 = ~P66;            //取反P6.6指示
    }
    if((i & INTF_7) != 0)    //P7.7中断
    {
      P67 = ~P67;            //取反P6.7指示
    }
}



金凌新电源 发表于 2025-3-21 16:32:17

使用示例文件,P33作指示, P13P17按钮开关输入,中断没反应

DebugLab 发表于 2025-3-21 16:57:12

请先别修改程序, 直接下载"interrupt.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
由于使用的中断号超过了31,所以KEIL编译器要拓展Keil的C代码中断号, 运行一下"拓展Keil的C代码中断号.exe"即可。

XHB7906021 发表于 4 天前

"STC8Hxxx.h"这个太老了,版主,重新做一个例程吧。是不正常进不了中断。

XHB7906021 发表于 4 天前

用现在新的哪种库函数做一个!

XHB7906021 发表于 3 天前

STC8HXXX.H与现在的STC8H.H不同了,有好多增减了!!!不能直接替代???新的STC8H.H中端口中断的部分没有了????
老的STC8HXXX.H中有以下部分:
#define INTE_0       0x01      /* 使能Px.0口中断功能 */
#define INTE_1       0x02      /* 使能Px.1口中断功能 */
#define INTE_2       0x04      /* 使能Px.2口中断功能 */
#define INTE_3       0x08      /* 使能Px.3口中断功能 */
#define INTE_4       0x10      /* 使能Px.4口中断功能 */
#define INTE_5       0x20      /* 使能Px.5口中断功能 */
#define INTE_6       0x40      /* 使能Px.6口中断功能 */
#define INTE_7       0x80      /* 使能Px.7口中断功能 */

#define INTF_0       0x01      /* 使能Px.0口中断标志 */
#define INTF_1       0x02      /* 使能Px.1口中断标志 */
#define INTF_2       0x04      /* 使能Px.2口中断标志 */
#define INTF_3       0x08      /* 使能Px.3口中断标志 */
#define INTF_4       0x10      /* 使能Px.4口中断标志 */
#define INTF_5       0x20      /* 使能Px.5口中断标志 */
#define INTF_6       0x40      /* 使能Px.6口中断标志 */
#define INTF_7       0x80      /* 使能Px.7口中断标志 */

#define      INT_FALL      0                /* 下降沿中断   */
#define      INT_RISE      1                /* 上升沿中断   */
#define      INT_LOW                2                /* 低电平中断   */
#define      INT_HIGH      3                /* 高电平中断   */
页: [1]
查看完整版本: 8H2K08U中断进不去