写了一个Arduino驱动4位数码管程序,要如何才能做到实时和多进程呢?
本帖最后由 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=
{{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=
{{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,HIGH);
for(int l=0;l<=6;l++)
{digitalWrite(segs,EOOR);}
delay(4);
digitalWrite(Pins,LOW);
}
}
/*********************************/
void LED_Word(int n,int m)//***显示 第n位 数字m ***
{
for(int r=0;r<=32;r++)
{
digitalWrite(Pins,HIGH);
for(int x=0;x<=6;x++)
{digitalWrite(segs,seven_seg_digits);}
}
digitalWrite(Pins,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);}
}
}
else
{eoor();} //***出错提示***
}
/*********************************/
void setup()
{
clearLEDs();
}
void loop()
{
int k =-999;
while(1)
{
LED_Segments(k);
k++;
}
}
是不是要采用了时间片轮换的多线程框架才行呢? 这个对时序要求很高,显示刷新放在主函数里循环,经常会出现时序方面的问题 swim 发表于 2013-1-24 22:37 static/image/common/back.gif
这个对时序要求很高,显示刷新放在主函数里循环,经常会出现时序方面的问题
嗯,谢啦,我发现用刷新的时候不用到delay就好了,比如我后来改了主函数就好多了
void loop()
{
static int counter1,date =-19;
while(1)
{
counter1++;
LED_Segments(date);
if(counter1==100)
{
date+=1;
counter1=0;
}
}
} 第30和31行,36、37行缺了个,顺便问下楼主,怎么处理主函数能够避免闪烁? 如果要进行数据采集的话,时间不能太长,可以将数据采集“过程”当成显示的延时,即在显示的循环中,进行数据采集。
页:
[1]