[ZLG-MCU] 有关数码显示,帮我看看问题出在哪儿

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

顺便帮你改了下程序,希望你能学会这种思路

至于是定时器刷新还是主循环刷新,系统空闲时是没区别的<br /><br /><br /><font color=#880088>#include&ltreg931.h&gt</font><br /><font color=#880088>#define&nbsp;uchar&nbsp;<font color=#0000CC>unsigned</font>&nbsp;<font color=#0000CC>char</font></font><br /><font color=#0000CC>unsigned</font>&nbsp;<font color=#0000CC>char</font>&nbsp;<font color=#BB0000>data</font>&nbsp;dis_buf[6];&nbsp;&nbsp;<font color=#007F00>//&nbsp;dis_buf&nbsp;显于缓冲区基地址</font><br /><br /><font color=#0000CC>unsigned</font>&nbsp;<font color=#0000CC>char</font>&nbsp;tab[6]={0xfb,0xfd,0xfe,0x7f,0xbf,0xf7};<br /><font color=#0000CC>unsigned</font>&nbsp;<font color=#0000CC>char</font>&nbsp;<font color=#BB0000>code</font>&nbsp;dis_code[11]={<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;0x28,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*0*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0xEB,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*1*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0x32,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*2*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0x62,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*3*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0xE1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*4*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0x64,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*5*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0x24,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*6*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0xEA,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*7*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0x20,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*8*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0x60,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*9*/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;0xff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>/*null*/</font><br />};<br /><br /><font color=#0000CC>long</font>&nbsp;int&nbsp;Num=0;<br />uchar&nbsp;k;<br />uchar&nbsp;disp_com;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//<font color=#0000DD>老x</font>增加的</font><br /><br /><font color=#0000CC>void</font>&nbsp;delay(uchar&nbsp;i)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000CC>while</font>(i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000CC>for</font>(j=0;j&lt50;j++);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><font color=#0000CC>void</font>&nbsp;time()&nbsp;<font color=#BB0000>interrupt</font>&nbsp;1&nbsp;<font color=#BB0000>using</font>&nbsp;1<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;k++;<br />&nbsp;&nbsp;&nbsp;&nbsp;TH0=0xec;<br />&nbsp;&nbsp;&nbsp;&nbsp;TL0=0x78;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(k==100){k=0;Num++;}<br />}<br /><br /><font color=#0000CC>void</font>&nbsp;disp(<font color=#0000CC>void</font>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[5]=Num%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[4]=Num/10%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[3]=Num/100%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[2]=Num/1000%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[1]=Num/10000%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[0]=Num/100000%10;<br />}<br /><br /><font color=#0000CC>void</font>&nbsp;refur_disp(<font color=#0000CC>void</font>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//<font color=#0000DD>老x</font>增加的,每次刷新显示1位,准备下一位</font><br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//每次刷新显示的时间都是一样的哦</font><br />&nbsp;&nbsp;&nbsp;&nbsp;P0=tab[disp_com];<br />&nbsp;&nbsp;&nbsp;&nbsp;P2=dis_code[dis_buf][disp_com]];<br />&nbsp;&nbsp;&nbsp;&nbsp;disp_com++;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(disp_com&gt=6)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_com=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//最后1位其实会多一条指令,不过影响微小,无所谓:-)</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//如果是4/8等2的N次方,那就不用if...&nbsp;,</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//用disp_com&=0x03;/disp_com&=0x07即可,那时间就是完全一样的了</font><br />}<br /><br /><font color=#0000CC>void</font>&nbsp;<font color=#DD0000>main</font>(<font color=#0000CC>void</font>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;P0M1=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;P0M2=0xff;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;P2M1=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;P2M2=0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;P0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;P2=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TMOD=0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;TH0=0xec;<br />&nbsp;&nbsp;&nbsp;&nbsp;TL0=0x78;<br />&nbsp;&nbsp;&nbsp;&nbsp;TR0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;ET0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;EA=1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;disp();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//<font color=#0000DD>老x</font>调整的</font><br />&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000CC>while</font>(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refur_disp();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#007F00>//<font color=#0000DD>老x</font>调整的</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(5);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><font color=#007F00>//这样,修改显示内容和刷新显示是完全分开的,</font><br /><font color=#007F00>//每次刷新显示的时间也就都是一样的了哦</font><br /><br /><font color=#007F00>//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本访问我的Blog&nbsp;或<a href="mailto:发送邮件至:xwjfile@21cn.com">发送邮件至:xwjfile@21cn.com</a></font><br />
zlgmcu 发表于 2009-2-12 11:51 | 显示全部楼层

可以参考这里的例子

周立功单片机(www.ZLGMCU.com)首页左边&nbsp;→&nbsp;Luminary&nbsp;Micro&nbsp;32位ARM系列&nbsp;→&nbsp;开发工具及开发指南<br />Ctrl+F,搜索“动态数码管”
 楼主| frankeng 发表于 2009-2-12 16:38 | 显示全部楼层

没理解很透彻

还是没找出自己的问题所以,郁闷中...
xwj 发表于 2009-2-12 16:59 | 显示全部楼层

因为最后一位是多执行了一大堆指令,当然会更亮一些

这都是比其他位多出来的时间哦:<br />void&nbsp;disp(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[5]=Num%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[4]=Num/10%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[3]=Num/100%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[2]=Num/1000%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[1]=Num/10000%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_buf[0]=Num/100000%10;<br /><br /><br />
computer00 发表于 2009-2-12 17:02 | 显示全部楼层

显示一次后就关掉...或者干脆开定时器刷新,这样轻松多了

  
 楼主| frankeng 发表于 2009-2-13 10:58 | 显示全部楼层

谢谢各位,现在茅塞顿开,真是感激不尽。

  
lhj200304 发表于 2009-2-13 11:11 | 显示全部楼层

注意学习老大的分层的程序设计思想

注意学习老大的分层的程序设计思想,这才是最重要的
 楼主| frankeng 发表于 2009-2-13 11:54 | 显示全部楼层

好的,感谢师傅们的教诲,弟子铭记心中,以后请多多指教

  
xiaoxin1986 发表于 2009-2-16 20:58 | 显示全部楼层

六楼强悍,学到了不少东西

  
hong6xing 发表于 2009-2-24 18:41 | 显示全部楼层
avocationA 发表于 2009-2-26 15:03 | 显示全部楼层

P2=dis_code[dis_buf][disp_com]];

P2=dis_code[dis_buf][disp_com]];
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部