YangHY 发表于 2026-1-26 21:13:42

PnIM1.x   n代表端口
PnIMO.x   .x就是第几位
Pn.x 口中断模式

比如B0这列: P00M0=0P00M1=0 P01就是下降沿模式

接着看中断使能:

YangHY 发表于 2026-1-26 21:16:31

还是P00这位:
P00INTE =1 就可以使能中断了

每一个脚位都是独立的:



YangHY 发表于 2026-1-26 21:18:39

接着看端口中断标志寄存器(PxINTF)

只要前面的模式和一个中断打开,一旦触发了以后

这里就会触发这个PXINTF的这个寄存器:

YangHY 发表于 2026-1-26 21:19:39

中断号的处理:

YangHY 发表于 2026-1-26 21:21:00

不装这个插件的话,中断号太大

插件的安装方法:

YangHY 发表于 2026-1-26 21:22:47

还可以用13号中断装接:

YangHY 发表于 2026-1-26 21:25:52

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,主要是实验板约束       
        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();                                //执行功能函数
//                if(P33 !=0)
//                        WDT_CONTR = 0X34;
               
                P00 = !P00;
                P01 = !P01;
                P02 = !P02;
                P03 = !P03;
               
               
               
                Delay3000ms();
               
/*不信中断,可以用下面代码替换
                if(P33==0)
                {
                        P04 = !P04;
                        P05 = !P05;
                        P06 = !P06;
                        P07 = !P07;
               
                }
你会发现,P33就很不灵光了吧?*/
        }
}

我们把上节课的外部中断关了:

YangHY 发表于 2026-1-26 21:27:45

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

//        P3IM0 = 0X00;                //IO中断模式设置为了下降沿
//        P3IM1 = 0Xff;
//       
//        P3INTE= 0X08;                //打开中断               
       
}

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
                {
                        P04 = !P04;
                        P05 = !P05;
                        P06 = !P06;
                        P07 = !P07;
                }
       
        }
       
       

}   
   
其中新的中断初始化如上:

YangHY 发表于 2026-1-26 21:41:45

B3这个位对应1000,就是8

P3INTE =0x08 ;   //P33启用中断!

因为1个口只有1个中断号

你要会判断是8个脚的哪个脚按下:

if(intf & 0X08)//判断是否P33按下01就是P30,02就是P31,04就是P32

编译链接下载:

效果和外部中断 是 一样的!

YangHY 发表于 2026-1-26 21:43:20

端口中断优先级控制寄存器(PINIPL,PINIPH)

还可以配置优先级:
页: 74 75 76 77 78 79 80 81 82 83 [84] 85 86 87 88 89 90 91 92 93
查看完整版本: 第一课 序言《AI8051U的特点》