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