单片机实训问题,编写驱动程序,使用仿真解决一些问题,代码无报错但仿真无法实现功能

问题遇到的现象和发生背景

本人51单片机初学者一枚,最近正在做相关的实训,然后问题在下面,代码自己已经纯原创编出来了,并且无报错,但是仿真实现不了相关功能,求hxd帮我看看问题出现在哪里,并且仿真图P1口不知道为什么全都没有电流

这里是题目:
(1)当未按下任何按键时,实现自己的学号动态扫描显示;
(2)当按下Key1时,启动定时器0,并设置定时方式1,并通过IO口输出1000Hz,并采用示波器观察结果;
(3)当按下Key2时,启动定时器1,并设置计数方式1,并采用7段数码管进行显示计数个数(按键方式输入);
(4)当按下Key3时,关闭所有定时器。
(5)请提供硬件分配表格,并绘制电路图。

问题相关代码,请勿粘贴截图
#include <REGX51.H>
 
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code table2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0XFE};
unsigned char code xuehao[]={0x66,0x5b,0x3f,0x3f,0x66,0x4f,0x3f,0x7d};
 
sbit DU=P0;
sbit WE=P2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^2;
sbit DA=P1^7;
sbit MA=P1;
 
void delay(unsigned int t)
{       
    unsigned int j=0;
    for(;t>0;t--)
        for(j=0;j<125;j++);
}
 

void timer0()interrupt 1//定时中断1
{     
    DA=!DA;
    TH0=0Xfe;                     //题(2)示波器显示方波
    TL0=0X0c;
}
 

void timer1()interrupt 3//定时中断2
{        
    TH0=0XFC;
    TL0=0X18;
    if(k1==0)
    {
     delay(10);
        if(k1==0)
        {
            while(1)
            {
             int i;                             //题(3)计数
             i++;
             MA=table1[i];
            }
        }
    }
}


wbzd1() interrupt 0//外部中断1
{
TMOD=0x11;
TH0=0Xfe;
TL0=0X0c;
TH1=0XFC;
TL1=0X18;
TR0=TR1=1;
ET0=ET1=1;
EA=1;

if(k1==0)
    {
        delay(10);
        if(k1==0)
        {
            IT0=1;                             //打开定时中断1
          EX0=1;
        }
    }


if(k2==0)
    {
    delay(10);
    if(k2==0)
        {
        IT1=1;                                    //打开定时中断2
        EX1=1;
        }
    }
}
 
 
wbzd2() interrupt 2//外部中断2
{
      EA=0;                                       //题(4)关闭所有定时器
}
 

 void int0()//执行外部中断1
{
  IT0=1;
  EA=1;
  EX0=1;
 }
 

void int1()//执行外部中断2
{ 
  IT1=1;
  EA=1;
  EX1=1;
 }
 
 
void main()
{
     while(1)
         {
      int i;
      for(i=0;i<=8;i++)
             {
       P0=xuehao[i];
       P2=table2[i];                              //题(1)学号显示
       delay(500);
       if(k1==0|k2==0)
             {
        int0();
                }
        if(k3==0)
            {
        int1();
      }
    }
  }
}



运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

仿真实现题目功能

如果整理书写格式就会发现不少问题解决不少问题,乱用无限循环是一切错误根源,正确是除了主函数内有一个无限循环外,其它循环都必须是有限循环才对,另外变量声明必须在函数开头而不是临时想在哪用就在哪声明是不同其它高级编程语言格式的.

#include <REGX51.H>
 
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code table2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0XFE};
unsigned char code xuehao[]={0x66,0x5b,0x3f,0x3f,0x66,0x4f,0x3f,0x7d};
 
sbit DU=P0;
sbit WE=P2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^2;
sbit DA=P1^7;
sbit MA=P1;
 
void delay(unsigned int t)
{       
    unsigned int j=0;
    for(;t>0;t--)
        for(j=0;j<125;j++);
}
 
void timer0()interrupt 1//定时中断1
{     
    DA=!DA;
    TH0=0Xfe;
    TL0=0X0c;
}
 
void timer1()interrupt 3//定时中断2
{        
    TH0=0XFC;
    TL0=0X18;
    if(k1==0)
    {
     delay(10);
        if(k1==0)
        {
            while(1)
            {
             int i;
                i++;
                MA=table1[i];
            }
        }
    }
}
 
wbzd1() interrupt 0//外部中断1
{
if(k1==0)
    {
        delay(10);
        if(k1==0)
        {
       TMOD=0X01;        //执行定时中断1   
       TH0=0Xfe;
       TL0=0X0c;
       ET0=1;
       TR0=1;
       do{}while(1);
        }
    }
}
 
if(k2==0)
{
    delay(10);
    if(k2==0)
    {
      TMOD=0X01;             //执行定时中断2
      TH1=0XFC;
      TL1=0X18; 
      ET1=1;
      TR1=1;
    }
}
 
wbzd2() interrupt 2//外部中断2
{
      EA=0;
}
 
 void int0()//执行外部中断1
{
  IT0=1;
  EA=1;
  EX0=1;
 }
 
void int1()//执行外部中断2
{ 
  IT1=1;
  EA=1;
  EX1=1;
 }
 
 
void main()
{
     while(1)
         {
      int i;
      for(i=0;i<=8;i++)
             {
       P0=xuehao[i];
       P2=table2[i];
       delay(500);
       if(k1==0|k2==0)
             {
        int0();
                }
        if(k3==0)
            {
        int1();
      }
    }
  }
}

wbzd2()这个中断函数没指定类型,虽然是固定的void,但还是得写。