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

PxIPH,PxIP:Px口中断优先级控制位

00:Px 口中断优先级为0级(最低级)
01:Px 口中断优先级为1级(较低级)
10:Px 口中断优先级为2 级(较高级)
11:Px口中断优先级为3级(最高级)

我们把P3P4的中断写好,比较一下:

YangHY 发表于 2026-1-26 21:48:34

P3的级别高:
void P3_IO_Init(void)   //P3端口用作中断初始化
{
        P3IM0 = 0X00; //P3口中断模式为低电平中断
        P3IM1 = 0xFF;
        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;
                       
//                        P04 = !P04;
//                        P05 = !P05;
//                        P06 = !P06;
//                        P07 = !P07;
                }
       
        }

}   

void P4_IO_Init(void)   //P47端口用作中断初始化
{
        P4IM0 = 0X00; //P4口中断模式为低电平中断
        P4IM1 = 0xFF;
        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 ;
                       
//                        P04 = !P04;
//                        P05 = !P05;
//                        P06 = !P06;
//                        P07 = !P07;
                }
       
        }

}   

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

P4肯定对应80

注意判断P47按钮按下:

if(intf & 0X80)//判断是否P47按下01就是P40,02就是P41,04就是P42

7是最高位,对应10000000 就是80

//数码管显示0:执行while函数 1:执行P3_10中断 2:执行P4_10中断




static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
       
// {0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms */
// {0, 600,   600,   LED1_Blink},      /* task 1 Period: 600ms */
// {0, 900,   900,   LED2_Blink},      /* task 1 Period: 600ms */
       
//    {0, 10,   10,    KEY_Task},      /* task 1 Period: 10ms */
//        {0, 10,10,   Task_1},      /* task 1 Period: 矩阵按键 */
        {0,1,   1,   SEG_Task},      /* task 1 Period: 300ms */       
//        {0, 10,10,   PW_write_Task},/* task 1 Period: 密码 */
       
};

只保留数码管显示:

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

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;

P3 用数码管第一位:

YangHY 发表于 2026-1-26 22:00:02

P4用数码管第二位:

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-26 22:01:54

主函数用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;

YangHY 发表于 2026-1-26 22:04:42

编译下载后发现确实是有等级的:

YangHY 发表于 2026-1-26 22:05:34

按住P33,再按P47 没反应:

YangHY 发表于 2026-1-26 22:07:06

倒过来按下P47,再按P33,是可以打断P47区执行P33的:

YangHY 发表于 2026-1-26 22:08:33

也可以把P47的优先级调高:

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