YangHY 发表于 2026-1-5 19:25:07

接着冲哥给大家演示插件的安装:

YangHY 发表于 2026-1-5 19:26:53

先去STC官网下载插件:

接着解压运行,很简单的

YangHY 发表于 2026-1-5 19:29:47

我们今天的任务1:编写IO中断的程序

上节课的外部中断是这样写的:


其实我们改写一下就OK

YangHY 发表于 2026-1-5 19:53:17

其实手册有完整代码:

YangHY 发表于 2026-1-5 20:07:36

看看我们的程序:

void P3_IO_Init(void)   //P3端口用作中断初始化
{
        P3IM0 = 0X00; //P3口中断模式为下降沿中断
        P3IM1 = 0x00;
        P3INTE= 0X08; //使能 P3.3口中断0x08对应P33,0x08就是1000

       
}

void P3_IO_ISR(void) interrupt 40    //P3端口用作中断初始化,中断号是40
{                                    //我们安装了插件,就不用13号跳转
        u8 intf;
        intf = P3INTF; //读出P3端口IO中断标志
        if(intf)//判断intf是否为0,为0就是没有触发
        {
                P3INTF = 0;       
                if(intf & 0X08)//判断是否P33按下01就是P30,02就是P31,04就是P32,08就是P33
                {
                        P04 = !P04;
                        P05 = !P05;
                        P06 = !P06;
                        P07 = !P07;
                }
       
        }
       

}   

YangHY 发表于 2026-1-5 20:10:26

编译连接:

YangHY 发表于 2026-1-5 20:14:11

P33在中断状态,和普通外部中断一样很灵!

随时按P33都及时反应


YangHY 发表于 2026-1-5 20:18:05

这就意味着,STC的芯片,任意一个引脚都可以外部中断!

我可以用P00或者P10或者P20

接着看:
16.1.4端口中断优先级控制寄存器(PINIPL,PINIPH)


YangHY 发表于 2026-1-5 20:36:09

任务二是验证优先级:

我们让数码管显示0:执行while函数
                   显示1:执行P3_I0中断
                   显示 2:执行P4_I0中断



void P3_IO_Init(void)   //P3端口用作中断初始化
{
        P3IM0 = 0X00; //P3口中断模式为低电平中断
        P3IM1 = 0xFF; //FF就是低电平中断,下降沿的话,一闪而过,不行的
        P3INTE= 0X08; //使能 P3.3 口中断

       
       
}

void P3_IO_ISR(void) interrupt 40    //P3端口中断服务函数
{
        u8 intf;
        intf = P3INTF;
        if(intf)//判断intf是否为0,为0就是没有触发
        {
                P3INTF = 0;       
                if(intf & 0X08)//判断是否P33按下01就是P30,02就是P31,04就是P32
                {
                        passward = 1;
                       
                }

       
        }

}   

void P4_IO_Init(void)   //P47端口用作中断初始化
{
        P4IM0 = 0X00; //P4口中断模式为低电平中断
        P4IM1 = 0xFF; //FF就是低电平中断,下降沿的话,一闪而过,不行的
        P4INTE= 0X80; //使能 P4.7 口中断,7是最高位对应0X80

       
}

void P4_IO_ISR(void) interrupt 41    //P4端口中断服务函数
{
        u8 intf;
        intf = P4INTF;
        if(intf)//判断intf是否为0,为0就是没有触发
        {
                P4INTF = 0;       
                if(intf & 0X80)//判断是否P47按下01就是P40,02就是P41,04就是P42
                {
                        passward = 2 ;
                       
                }

       
        }

}   




YangHY 发表于 2026-1-5 20:38:37

主函数显示0不要忘了:


void main(void)
{
        Sys_init();                                                                                //系统初始化
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
        Timer0_Init();                                                                        //定时器初始化
        Init_595();
//        INT1_Init();//外部中断1(P33按下)中断初始化                                                                        //外部中断1初始化
        P3_IO_Init(); //P3端口用作中断初始化,(P33按下)
//上面这句实际是IO初始化,是所有IO口都能
//用作外部中断的,之所以还用P33,主要是实验板约束       
        P4_IO_Init();
       
        EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
//        WDT_CONTR = 0X24;
       
        while(1)
        {
               
      if (bUsbOutReady)                                                        //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                       
            usb_OUT_done();                                                        //
      }
                Task_Pro_Handler_Callback();//执行功能函数
               
                passward = 0;
               
        }

}


页: 47 48 49 50 51 52 53 54 55 56 [57] 58 59 60 61 62 63 64 65 66
查看完整版本: 第一课 序言《AI8051U的特点》