51单片机数码管的位选端接在I/O口,要怎么写代码确定位选端?

请问我这样子对吗?


#include<reg52.h>   //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^0;
sbit wei1=P1^0;
sbit wei2=P1^1;
sbit wei3=P1^2;
sbit wei4=P1^3;

uchar code table[]={
 0x3f,0x60,0x5b,0x4f,
 0x66,0x6d,0x7d,0x07,
 0x7f,0x6f,0x77,0x7c,
 0x39,0x5e,0x79,0x71};

uchar num,num1,num2,shi,ge;

void delay(uint xms)   //延时函数
{
     uint i,j;
     for(i=xms;i>0;i--)
          for(j=110;j>0;j--);
}

void display(uchar shi,uchar ge)   //关于显示子函数
{
     dula=1;
     P2=table[shi];   //送入段选数据
     dula=0;
     P2=0xff;   //消影 送入位选数据前关闭所有显示,防止打开位选锁存时,原来段选数据通过位选锁存器造成混乱
     wei1=1;
     wei2=0;
     wei3=0;
     wei4=0;
     P2=0xfe;   //送入位选数据
     wei2=0;
     delay(5);   //延时极短
     
     dula=1;
     P2=table[ge];
     dula=0;
     P2=0xff;
     wei2=1;
     wei1=0;
     wei3=0;
     wei4=0;
     P2=0xfd;
     wei2=0;
     delay(5);
}

void T0_time() interrupt 3   //T1中断 数码管的中断函数
{
     TH0=(65536-50000)/256;   //重装初值
     TL0=(65536-50000)%256;
     num2++;
     if(num2==20)   //如果到了20次 说明1秒时间到
     {
          num2=0;   //然后把num2清0再重新计20次
          num++;
          if(num==60)   //这个数用来送数码管显示,到60后归0
               num=0;
          shi=num/10;   //把一个2位数分离后成十位和个位分别送入数码管
          ge=num%10;   //%是求余,/是求模即取整数部分
      }
}

void main()
{
    TMOD=0x01;            //定时/计数器工作方式1,即16位的定时计数器
    TH0=(65536-50000)/256;            //装入初值
    TL0=(65536-50000)%256;
    EA=1;            //打开全局中断
    ET0=1;            //打开定时计数器T0的中断
    TR0=1;            //打开定时器T0的运行控制,即启动定时器0
    
    while(1)
    {
        display(shi,ge);
    }
}