极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16891|回复: 5

写了一个Arduino驱动4位数码管程序,要如何才能做到实时和多进程呢?

[复制链接]
发表于 2013-1-23 23:17:04 | 显示全部楼层 |阅读模式
本帖最后由 happyfoeverq 于 2013-1-23 23:20 编辑

      今天写了一个Arduino驱动4位数码管程序,可以显示-999——9999之间的数字,并且超出范围会显示错误“eoor”,但是有一问题无法解决:
   
    如果单纯显示数字的变换(比如数字递增)是没有问题的(刷新频率够就好),但是如果要求Arduio一边测量数据(或者做其他更复杂的事,一边把结果显示出来,我发现数码管有明显的闪烁感!
   
    是因为CPU速度不够,还是我的程序不够好呢?(贴上我写的一段程序,让数字从-999递增到9999,最后显示“eoor”)

NormalText Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107


unsigned char const segs[]={0,1,2,3,4,5,6,7};             //阳极管脚*a*b*c*d*e*f*g*p*
unsigned char const Pins[]={8,9,10,11};                      //阴极管脚
unsigned char const seven_seg_digits[11][7]=
{{0,0,0,0,0,0,1}//*0*
,{1,0,0,1,1,1,1}//*1*
,{0,0,1,0,0,1,0}//*2*
,{0,0,0,0,1,1,0}//*3*
,{1,0,0,1,1,0,0}//*4*
,{0,1,0,0,1,0,0}//*5*
,{0,1,0,0,0,0,0}//*6*
,{0,0,0,1,1,1,1}//*7*
,{0,0,0,0,0,0,0}//*8*
,{0,0,0,0,1,0,0}//*9*
,{1,1,1,1,1,1,0}//*-*
};
unsigned char const EOOR[4][7]=
{{0,1,1,0,0,0,0}//*E*
,{0,0,0,0,0,0,1}//*O*
,{0,0,0,0,0,0,1}//*O*
,{1,0,1,1,0,0,0}//*R*
};

/*********************************/

void clearLEDs()          //***清屏***
{   
    for(int i=0;i<=7;i++)
    {
       pinMode(segs,OUTPUT);
       digitalWrite(segs,HIGH);
    }

   for(int i=0;i<=3;i++)
    {
      pinMode(Pins,OUTPUT);
      digitalWrite(Pins,LOW);
    }
}

/*********************************/

void eoor()         //***当数据超出范围,出错提示***
{
  for(int n=0;n<=3;n++)
  {
    digitalWrite(Pins[n],HIGH);
    for(int l=0;l<=6;l++)
        {digitalWrite(segs[l],EOOR[n][l]);}
    delay(4);
    digitalWrite(Pins[n],LOW);
  }
}

/*********************************/

void LED_Word(int n,int m)//***显示 第n位 数字m ***
{   
     for(int r=0;r<=32;r++)
     {
      digitalWrite(Pins[n],HIGH);
      for(int x=0;x<=6;x++)
         {digitalWrite(segs[x],seven_seg_digits[m][x]);}
     }
     digitalWrite(Pins[n],LOW);
}

/******************************/

void LED_Segments(short int a)//***显示-999~9999之间的数***
{
  clearLEDs();
  if((a <= 9999)&&(a >= -999))    //***
   {   
       int q, w, e, r;   
       q = abs(a/1000);           //***千位(负数的是负号)***
       w = abs((a/100)%10);       //***百位***
       e = abs((a/10)%10);        //***十位***
       r = abs(a%10);             //***个位***
          {if(a < 0) {q = 10;}}
       char u[]={q,w,e,r};
       for(int p=0;p<=100;p++)    //??做了个循环,避免闪烁,但是效果一般,不知道有没有其他办法?求教
         {
         for(int y=0;y<=3;y++)
           {LED_Word(y,u[y]);}
         }
     }
  else
    {eoor();}                       //***出错提示***
}

/*********************************/


void setup()
{
clearLEDs();
}

void loop()
{
int k =-999;
while(1)
{
   LED_Segments(k);
   k++;
}
}

回复

使用道具 举报

 楼主| 发表于 2013-1-23 23:18:03 | 显示全部楼层
是不是要采用了时间片轮换的多线程框架才行呢?
回复 支持 反对

使用道具 举报

发表于 2013-1-24 22:37:18 | 显示全部楼层
这个对时序要求很高,显示刷新放在主函数里循环,经常会出现时序方面的问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-25 19:28:14 | 显示全部楼层
swim 发表于 2013-1-24 22:37
这个对时序要求很高,显示刷新放在主函数里循环,经常会出现时序方面的问题

嗯,谢啦,我发现用刷新的时候不用到delay就好了,比如我后来改了主函数就好多了

void loop()
{
static int counter1,date =-19;
while(1)
  {
    counter1++;
    LED_Segments(date);
    if(counter1==100)
    {
     date+=1;
     counter1=0;
    }
   }
}
回复 支持 反对

使用道具 举报

发表于 2014-12-4 10:37:39 | 显示全部楼层
第30和31行,36、37行缺了个[i],顺便问下楼主,怎么处理主函数能够避免闪烁?
回复 支持 反对

使用道具 举报

发表于 2014-12-4 11:39:43 | 显示全部楼层
如果要进行数据采集的话,时间不能太长,可以将数据采集“过程”当成显示的延时,即在显示的循环中,进行数据采集。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 18:24 , Processed in 0.036083 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表