单片机数码管动态显示,急救!求C语言程序

51单片机,2个数码管,要求:
1、实现数码管从0到99的动态显示,每秒增加一
2、最多只能使用10个I/O口,其中两个作为数码管的位选择端
3、不能使用其它的辅助芯片
我并不是懒地动脑,里面确实有个很麻烦的问题,我延时的时候总是无法实现两个数码管同时显示数字,要么显示一个,要么另一个一闪而过
请高手一定要帮忙啊
详细代码信息,请看这里:
http://hi.baidu.com/cshi1990/blog/item/bf13f19dce909a51d0135e71.html?timeStamp=1310564311069
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功辩昌能寄存器的定义
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9

unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{

TMOD |=0x01;//定携逗扒时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断指梁
TR0=1; //打开定时开关

while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0;
delay(300); //短暂延时
P0=Dis_Gewei; //显示个位
P2=1;
delay(300);
}

}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second,count;
TH0=0xd8; //重新赋值
TL0=0xf0;

count++;
if (count==100) //100x10ms=1S,大致延时时间
{
count=0;
second++; //秒加1
if(second==100)
second=0;
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理

}

}
我这里有我亲自写汇编源程序,纯扮功能是从1-99显示再返回从99-1显示,如模裤岁此循环旦睁。这里我刚学单片机的时候写出来的,不过我没有现成C程序,用C写更简单。要不要这个汇编程序?要的话我就贴出来。
延时一下就能显示两位了
用定时中端扫描就行
#include <STC12C5A16S2.h>
uint display_ddata;
//======================================
//**************************************
//======================================
void main(void)
{
mcu_int();
//SCON = 0x50; //串口方式1,允许接收
TMOD = 0x11; //定时器0 定时袜消方式1
TH0 = 0x8a; //5ms 10MS 0X159F
TL0 = 0xcf; //
//===================
//==================
//EA=1;
//ET0=1;
//EPCA_LVD=1;
IP=0X00;
IPH=0X00;
ET0=1;
TCON = 0x11; //设定时器0 开始计数
EA=1;
while(1)
{
if(key_scan_bit)
{
key_scan_bit=0;
s1_bit_10=display_ddata/10;
s1_bit_1=display_ddata%10;
display_ddata++;
}
} //while(1)
}
void mcu_int(void)
{
CLK_DIV= 0X00;
WDT_CONTR=0X07;
P4SW=0x70;
AUXR=0Xf1;
//定义io口的工作模式
//定义io口的工作模式森渣
P0M0 = 0XF0;
P0M1 = 0x0F;//0-3 o 4-7 i
P1M0 = 0X00;//0-5 i 6-7 0
P1M1 = 0x3F;
P2M0 = 0X00;// o
P2M1 = 0XFF;
P3M0 = 0X01;//
P3M1 = 0XFE;//0 ==I
P4M0 = 0X40;//
P4M1 = 0XBF;//6 I
//====================
}
//===============================================
//函数名称:void timer0 ( void ) interrupt 1
//功能描述:T0中断服务程序
//修改日志:10.10.13
//函数接口:系统自动调用,无参数
//=================================================
void timer0 (void) interrupt 1
{
TH0 = 0x8a; //
TL0 = 0xcf; // 5MS
if(led_num>告春知2)
led_num=1;
else
led_num++;
if(led_num==1)
{
// bit_1=led_s1_data%10;
led_display_bit( 0,s1_bit_1);
}
else //if(led_num==2)
{
//bit_10=led_s1_data%100/10;
led_display_bit( 1,s1_bit_10);
}
key_scan_count++;
if(key_scan_count>100)
{
key_scan_count=0;
key_scan_bit=1;
}
}
//=============================
void led_display_bit( unsigned char DS_NO,unsigned char DS_Value )
{
// led_write.led_data = DS_Value ;
switch(DS_NO)
{
case 0 :
LED2=OFF;
P2=disp_tableB[DS_Value];
LED1=ON;
break ;
case 1:
LED1=OFF;
if(bit_point)
P2=disp_tableB_point[DS_Value];
else
P2=disp_tableB[DS_Value];
LED2=ON;
break ;
default :
break ;
}
}