打印

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

[复制链接]
2007|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haysion|  楼主 | 2007-4-28 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序描述如下:
void display()
{
    uchar i, j, dis;
    for(j = 0; j < 10; j++)
    {
        if(neg)
        {
            P2 = disp_s[5];  //disp_s用于位码选择
            P0 = 0xbf;  //显示负号
            delayms(1);
            P0 = 0xff;
        }
        for(i = 0; i < 5; i++)
        {
            if(i == 2)
            {
                dis = disp_d;  //disp_d用于保存数据
                P2 = disp_s;
                P0 = disp[dis] & 0x7f;  //disp是数据的段码代码,0x7f用于显示小数点
                delayms(1);
                P0 = 0xff;
            }
            else
            {
                dis = disp_d;
                P2 = disp_s;
                P0 = disp[dis];
                delayms(1);
                P0 = 0xff;
            }
        }
    }
}

相关帖子

沙发
haysion|  楼主 | 2007-4-28 16:40 | 只看该作者

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

以下作为一个参考调试程序:

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <math.h>

#define uchar unsigned char

bit pro;

uchar disp_d[6];  //用于保存所需显示的6位数据及符号位

uchar disp_s[6] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};  //位码选择

uchar disp[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,  //数字0-9段码选择
                 0x82,0xf8,0x80,0x90};  

void display();

void delayms(uchar n);  //ms延时



main()
{
    uchar i, j;
    uchar count[6];
    EA = 1; ET0 = 1;  //开定时中断0
    TMOD = 0x01;
    TH0 = 0xc8; TL0 = 0x32;  //20ms定时中断
    TR0 = 1;  //启动定时中断0
    while(1)
    {
        ++count[0];        
        for(i = 0; i < 5; i++)
        {
            j = i + 1;
            if(count > 0x09)
            {
                ++count[j];
                count = 0;
            }
        }
        if(count[5] > 0x09)
        {
            for(i = 0; i < 6; i++)
            count = 0;
        }
        pro = 1;
        for(i = 0; i < 6; i++)
        {
            disp_d = count;
        }
        pro = 0;
    }
}


void timeint0() interrupt 1  //累计20ms重新显示一次数据
{
    if(!pro)
    {
        display();
    }
    TH0 = 0xc8; TL0 = 0x32;
}


void display()
{
    uchar i, j, dis;
    for(j = 0; j < 9; j++)
    {
        for(i = 0; i < 6; i++)
        {
            dis = disp_d;
            P2 = disp_s;
            P0 = disp[dis];
            delayms(1);
            P0 = 0xff;
        }
        P2 = disp_s[2];
        P0 = 0x7f;  //显示小数点
        delayms(1);
        P0 = 0xff;
    }
}


void delayms(uchar n)  //1ms延时
{
    int t, h;
    for(h = 0; h < n; h++)
    {
        for(t = 0; t < 125; t++)
        {
        ;
        }
    }
}


在子程序display()里,将j < 9改为j < 8则闪得很厉害,数据变换得很快;当用j < 9时,显示比较稳定,但反应很慢,要隔很久才能将新的数据转换到disp_d[]数组中,这到底是什么原因啊?麻烦各位分析以下

使用特权

评论回复
板凳
xwj| | 2007-4-28 16:50 | 只看该作者

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

使用特权

评论回复
地板
haysion|  楼主 | 2007-4-29 08:44 | 只看该作者

谢谢啊

    我后来将display()的j去掉了,运行不闪了,但是嵌在一个大程序里,就闪了。
    请问原理性错误出在哪?俺等得急啊,调了不少时间了

使用特权

评论回复
5
haysion|  楼主 | 2007-4-29 09:13 | 只看该作者

谢谢xwj兄,现在ok了

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

使用特权

评论回复
6
conwh| | 2007-4-29 17:23 | 只看该作者

中断中最好是输出一位字

使用特权

评论回复
7
haysion|  楼主 | 2007-4-30 09:15 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

25

帖子

0

粉丝