你那个显示程序有问题,动态显示你那个位选应该是选一个然后在再关一个的,
void display(uchar num)
{
P2=0x7f; //数码管位
P0=seg[num/100]; //数码管段
delay5ms();
P2=0xff;
P2=0xbf; //数码管位
P0=seg[num%100/10];
delay5ms();
P2=0xff;
P2=0xdf; //数码管位
P0=seg[num%10];
delay5ms();
P2=0xff;
}
我还觉得你那个数码管位选也有点问题。既不像0选,也不像1选,我该了一下,但我不知道你的外接电路时怎样的。你再看看你的电路图。
这样显示会出现一个问题,就是现实的亮度不均。我建议你再开个定时,把显示放到中断里去。
你这程序还有一个问题是:你用定时器软件模拟一个时钟信号时达不到500KHZ的,而且你定时器0的定时太短就会老进行中断处理,会很占用资源,甚至程序都跑不起来。建议你用89S52的定时器2,它能输出不高于4M的始终信号。