我是个初学者,用LPC931做一个很简单的数码管显示的累加实验。程序和电路图如下所示,现在问题如下:如果P0、P2口设为开漏或准双向口,最后一个数码管特别亮,其它正常,如果屏蔽掉最后一个,倒数第二个又变成特亮了。如果把P0、P2口设开推挽的话,整个显示都不正常了,所有数码管同时显示相同的字段,我把延迟时间放的很慢,发现三极管的集电极始终处于高电平,按照道理应该设置成推输出。我想了很长时间都没把问题想出来,请哪位高手指点。
#include<reg931.h> #define uchar unsigned char unsigned char data dis_buf[6]; // dis_buf 显于缓冲区基地址
unsigned char tab[6]={0xfb,0xfd,0xfe,0x7f,0xbf,0xf7}; unsigned char code dis_code[11]={
0x28, /*0*/ 0xEB, /*1*/ 0x32, /*2*/ 0x62, /*3*/ 0xE1, /*4*/ 0x64, /*5*/ 0x24, /*6*/ 0xEA, /*7*/ 0x20, /*8*/ 0x60, /*9*/ 0xff /*null*/ };
long int Num=0; uchar k;
void delay(uchar i) {uchar j; while(i--) { for(j=0;j<50;j++); } }
void time() interrupt 1 using 1 { k++; TH0=0xec; TL0=0x78;
if(k==100){k=0;Num++;} }
void disp(void) { uchar j; dis_buf[5]=Num%10; dis_buf[4]=Num/10%10; dis_buf[3]=Num/100%10; dis_buf[2]=Num/1000%10; dis_buf[1]=Num/10000%10; dis_buf[0]=Num/100000%10; for(j=0;j<6;j++) { P0=tab[j]; P2=dis_code[dis_buf[j]]; delay(5); } } main() { P0M1=0x00; P0M2=0xff;
P2M1=0x00; P2M2=0xff; P0=1; P2=0;
TMOD=0x01; TH0=0xec; TL0=0x78; TR0=1; ET0=1; EA=1;
while(1) { disp(); }
}
|