找回密码
 立即注册
查看: 2547|回复: 43

所有普通I/O口都支持外部中断的演示程序,STC8系列、STC32系列, 中断号37~44

[复制链接]

该用户从未签到

45

主题

2912

回帖

6546

积分

超级版主

积分
6546
发表于 2023-10-23 15:04:34 | 显示全部楼层 |阅读模式
STC8系列  所有普通I/O口都支持外部中断的演示程序:
STC32系列所有普通I/O口都支持外部中断的演示程序:

===最多支持4种模式
         高电平中断低电平中断
         上升沿中断下降沿中断

/*************        功能说明        **************
请先别修改程序, 直接下载"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输出一个大约4KHz方波信号, 方便用户测试.
******************************************/


STC32系列-所有普通IO的中断.rar (56.77 KB, 下载次数: 124)
STC8-所有普通IO的中断.rar (61.98 KB, 下载次数: 173)
拓展Keil的C代码中断号.zip (157.67 KB, 下载次数: 154)




回复 送花

使用道具 举报

该用户从未签到

45

主题

2912

回帖

6546

积分

超级版主

积分
6546
 楼主| 发表于 2023-10-23 15:05:43 | 显示全部楼层
STC32系列所有普通IO口都支持外部中断的演示程序:

/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Demo --------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.stcai.com ------------------------------------------*/
/* --- BBS: www.stcaimcu.com ---------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/


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

#include        "..\..\STC32G.h"

/*************        功能说明        **************

请先别修改程序, 直接下载"Objects"里的"interrupt.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
由于使用的中断号超过了31,所以KEIL C251编译器要拓展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输出一个大约4KHz方波信号, 方便用户测试.

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

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


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


/*************        本地函数声明        **************/
void        GPIO_INT_Config(u8 gpio, u8 mode, u8 pin);



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


/******************** 主函数 **************************/
void main(void)
{
        WTST  = 0;
        CKCON = 0;
        P_SW2 |= 0x80;        //允许访问扩展寄存器

        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;

        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_FALL, 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)
        {
                u16        edata i;
                P33 = ~P33;                //输出方波 4KHz @11.0592MHz
                i = 230;
                while(--i != 0);
        }
}


//========================================================================
// 函数: 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        volatile far *pt;
        u8        j;

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

        pt  = (unsigned char volatile far *)(0x7efd10 + gpio);        //PxINTF端口中断标志寄存器
        *pt = *pt & ~pin;        //清除中断标志

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

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

        pt  = (unsigned char volatile far *)(0x7efd00 + 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指示
        }
        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指示
        }
}

//========================================================================
// 函数: 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指示
        }
}

回复 支持 反对 送花

使用道具 举报

该用户从未签到

45

主题

2912

回帖

6546

积分

超级版主

积分
6546
 楼主| 发表于 2023-10-23 15:06:20 | 显示全部楼层
STC8系列所有普通IO口都支持外部中断的演示程序:

/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Demo --------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.stcai.com ------------------------------------------*/
/* --- BBS: www.stcaimcu.com ---------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/


#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;

        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_FALL, 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;
                P33 = ~P33;                //输出方波 4KHz @11.0592MHz
                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指示
        }
        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指示
        }
}

//========================================================================
// 函数: 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指示
        }
}

回复 支持 反对 送花

使用道具 举报

该用户从未签到

550

主题

9228

回帖

1万

积分

管理员

积分
13928
发表于 2023-10-23 15:20:15 | 显示全部楼层
截图202310231519127051.jpg


截图202310231519475547.jpg


截图202310231520133897.jpg

回复 支持 反对 送花

使用道具 举报

该用户从未签到

550

主题

9228

回帖

1万

积分

管理员

积分
13928
发表于 2023-10-24 12:57:40 | 显示全部楼层
USB 原理实战16课时】,视频教学已完美完成 ,大学标准课程
【10月/9号,10月/11号】USB基本原理教学视频, 已上传
10月/16号USB-HID 通信 实战】教学视频超级完美, 已上传
             是对着协议代码一行一行的讲解,认真听的都说会了
10月/18号下午USB-CDC虚拟串口 实战】教学视频, 已上传
             USB-CDC虚拟串口 / 就是最简单最强大的串口
             是对着协议代码一行一行的讲解,认真听的都说会了

请帮忙转发给可能需要:从0开始了解 USB 同学/同事/老师/研发人员
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4526&extra=&page=1
=========================================
CAN 原理实战8课时】,教学视频,制作中,后续直接看视频回放

回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 08:43
  • 签到天数: 135 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    577

    积分

    高级会员

    积分
    577
    发表于 2023-11-4 16:34:17 | 显示全部楼层
    注意
    截图202311041633512047.jpg
    纸上得到终觉浅,绝知此事要躬行。
    回复 送花

    使用道具 举报

  • TA的每日心情

    2023-12-5 19:37
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    3

    主题

    325

    回帖

    363

    积分

    禁止发言

    积分
    363
    发表于 2023-11-11 02:40:01 | 显示全部楼层
    这个IO中断,上次没做好. 有时间还需要抽空看下这个帖子,插个眼
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 152 天

    [LV.7]常住居民III

    17

    主题

    370

    回帖

    1281

    积分

    荣誉版主

    积分
    1281
    发表于 2023-12-7 11:05:22 | 显示全部楼层
    问:stc32g8k64普通IO口外部中断能支持边沿中断(同时支持上升沿和下降沿中断)?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    34

    主题

    164

    回帖

    393

    积分

    中级会员

    积分
    393
    发表于 2023-12-7 11:31:41 | 显示全部楼层
    社区闲人 发表于 2023-12-7 11:05
    问:stc32g8k64普通IO口外部中断能支持边沿中断(同时支持上升沿和下降沿中断)? ...

    看这里:

    11.png
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    45

    主题

    2912

    回帖

    6546

    积分

    超级版主

    积分
    6546
     楼主| 发表于 2023-12-7 14:09:10 | 显示全部楼层
    普通IO口中断只支持4种之一,注意是之一:
    下降沿、上升沿、低电平、高电平中断。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-27 19:57 , Processed in 0.078011 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表