请教:如何优化显示程序,使得程序运行得快些

[复制链接]
2448|6
 楼主| haysion 发表于 2007-4-28 11:38 | 显示全部楼层 |阅读模式
程序描述如下:<br />void&nbsp;display()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;i,&nbsp;j,&nbsp;dis;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;10;&nbsp;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(neg)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;disp_s[5];&nbsp;&nbsp;//disp_s用于位码选择<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0xbf;&nbsp;&nbsp;//显示负号<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;5;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&nbsp;==&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis&nbsp;=&nbsp;disp_d;&nbsp;&nbsp;//disp_d用于保存数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;disp_s;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;disp[dis]&nbsp;&&nbsp;0x7f;&nbsp;&nbsp;//disp是数据的段码代码,0x7f用于显示小数点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis&nbsp;=&nbsp;disp_d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;disp_s;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;disp[dis];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
 楼主| haysion 发表于 2007-4-28 16:40 | 显示全部楼层

晕,没人理,自己做了修改,但出现另一个问题

以下作为一个参考调试程序:<br /><br />#include&nbsp;&ltreg52.h&gt<br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltintrins.h&gt<br />#include&nbsp;&ltmath.h&gt<br /><br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br /><br />bit&nbsp;pro;<br /><br />uchar&nbsp;disp_d[6];&nbsp;&nbsp;//用于保存所需显示的6位数据及符号位<br /><br />uchar&nbsp;disp_s[6]&nbsp;=&nbsp;{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};&nbsp;&nbsp;//位码选择<br /><br />uchar&nbsp;disp[10]&nbsp;=&nbsp;{0xc0,0xf9,0xa4,0xb0,0x99,0x92,&nbsp;&nbsp;//数字0-9段码选择<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x82,0xf8,0x80,0x90};&nbsp;&nbsp;<br /><br />void&nbsp;display();<br /><br />void&nbsp;delayms(uchar&nbsp;n);&nbsp;&nbsp;//ms延时<br /><br /><br /><br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;i,&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;count[6];<br />&nbsp;&nbsp;&nbsp;&nbsp;EA&nbsp;=&nbsp;1;&nbsp;ET0&nbsp;=&nbsp;1;&nbsp;&nbsp;//开定时中断0<br />&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;TH0&nbsp;=&nbsp;0xc8;&nbsp;TL0&nbsp;=&nbsp;0x32;&nbsp;&nbsp;//20ms定时中断<br />&nbsp;&nbsp;&nbsp;&nbsp;TR0&nbsp;=&nbsp;1;&nbsp;&nbsp;//启动定时中断0<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++count[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;5;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count&nbsp;&gt&nbsp;0x09)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++count[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count[5]&nbsp;&gt&nbsp;0x09)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;6;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pro&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;6;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_d&nbsp;=&nbsp;count;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pro&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />void&nbsp;timeint0()&nbsp;interrupt&nbsp;1&nbsp;&nbsp;//累计20ms重新显示一次数据<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(!pro)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;TH0&nbsp;=&nbsp;0xc8;&nbsp;TL0&nbsp;=&nbsp;0x32;<br />}<br /><br /><br />void&nbsp;display()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;i,&nbsp;j,&nbsp;dis;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;9;&nbsp;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;6;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis&nbsp;=&nbsp;disp_d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;disp_s;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;disp[dis];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;disp_s[2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0x7f;&nbsp;&nbsp;//显示小数点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />void&nbsp;delayms(uchar&nbsp;n)&nbsp;&nbsp;//1ms延时<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;t,&nbsp;h;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(h&nbsp;=&nbsp;0;&nbsp;h&nbsp;&lt&nbsp;n;&nbsp;h++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(t&nbsp;=&nbsp;0;&nbsp;t&nbsp;&lt&nbsp;125;&nbsp;t++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />在子程序display()里,将j&nbsp;&lt&nbsp;9改为j&nbsp;&lt&nbsp;8则闪得很厉害,数据变换得很快;当用j&nbsp;&lt&nbsp;9时,显示比较稳定,但反应很慢,要隔很久才能将新的数据转换到disp_d[]数组中,这到底是什么原因啊?麻烦各位分析以下
xwj 发表于 2007-4-28 16:50 | 显示全部楼层

原理性错误,等偶回去找个老程序给你看看吧

  
 楼主| haysion 发表于 2007-4-29 08:44 | 显示全部楼层

谢谢啊

&nbsp;&nbsp;&nbsp;&nbsp;我后来将display()的j去掉了,运行不闪了,但是嵌在一个大程序里,就闪了。<br />&nbsp;&nbsp;&nbsp;&nbsp;请问原理性错误出在哪?俺等得急啊,调了不少时间了
 楼主| haysion 发表于 2007-4-29 09:13 | 显示全部楼层

谢谢xwj兄,现在ok了

&nbsp;&nbsp;&nbsp;&nbsp;刚才调试了一下,不闪了^_^<br />&nbsp;&nbsp;&nbsp;&nbsp;我每次跳到定时中断服务例程时只要先把计时器开了,再显示,就不闪了,请问这是不是你说的原理性错误所在?<br />&nbsp;&nbsp;&nbsp;&nbsp;不好意思,小弟刚出来混饭吃,对技术方面的东西一窍不通,还请各位多指教。<br />&nbsp;&nbsp;&nbsp;&nbsp;另外,若是xwj兄看到了,麻烦快点贴上你的程序,让我多学习学习,谢谢。
conwh 发表于 2007-4-29 17:23 | 显示全部楼层

中断中最好是输出一位字

  
 楼主| haysion 发表于 2007-4-30 09:15 | 显示全部楼层

请问每次刷新一个位的好处是什么呀?

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

25

帖子

0

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