wwwusr 发表于 2015-5-20 20:19 
原来还真有人跟我一样返璞归真,直接用Arduino驱动数码管啊。
我现在弄的一个,跟你的很像,只是我用A1 ... - //设置阳极接口
- int a = 1;
- int b = 2;
- int c = 3;
- int d = 4;
- int e = 5;
- int f = 6;
- int g = 7;
- int p = 8;
- //设置阴极接口
- int d4 = 9;
- int d3 = 10;
- int d2 = 11;
- int d1 = 12;
-
- byte segs[7] = { a, b, c, d, e, f, g };
-
- byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 }, // = 0
- { 1,1,0,0,0,0,0 }, // = 1
- { 1,0,1,1,0,1,1 }, // = 2
- { 1,1,1,0,0,1,1 }, // = 3
- { 1,1,0,0,1,0,1 }, // = 4
- { 0,1,1,0,1,1,1 }, // = 5
- { 0,1,1,1,1,1,1 }, // = 6
- { 1,1,0,0,1,1,0 }, // = 7
- { 1,1,1,1,1,1,1 }, // = 8
- { 1,1,1,0,1,1,1 } // = 9
- };
-
- void setup()
- {
- pinMode(d1, OUTPUT);
- pinMode(d2, OUTPUT);
- pinMode(d3, OUTPUT);
- pinMode(d4, OUTPUT);
- pinMode(a, OUTPUT);
- pinMode(b, OUTPUT);
- pinMode(c, OUTPUT);
- pinMode(d, OUTPUT);
- pinMode(e, OUTPUT);
- pinMode(f, OUTPUT);
- pinMode(g, OUTPUT);
- pinMode(p, OUTPUT);
- Serial.begin(9600);
- }
- int moistureSensor=0;
- int moisture_val;
- void loop()
- {
-
- moisture_val=analogRead(moistureSensor);
- Serial.print("moisture sensor reads=");
- Serial.println(moisture_val);
- delay(500);
-
- clearLEDs();
- pickDigit(1);
- lightSegments(moisture_val/1000);
- //delayMicroseconds(del);
- delay(500);
-
- clearLEDs();
- pickDigit(2);
- lightSegments((moisture_val/100)%10);
- // delayMicroseconds(del);
- delay(500) ;
-
- clearLEDs();
- pickDigit(3);
- //dispDec(3);
- lightSegments((moisture_val/10)%10);
- //delayMicroseconds(del);
- delay(500);
-
- clearLEDs();
- pickDigit(4);
- lightSegments(moisture_val%10);
- //delayMicroseconds(del);
- delay(500);
- }
-
- void pickDigit(int x) //定义pickDigit(x),其作用是开启dx端口
- {
- digitalWrite(d1, HIGH);
- digitalWrite(d2, HIGH);
- digitalWrite(d3, HIGH);
- digitalWrite(d4, HIGH);
-
- switch(x)
- {
- case 1:
- digitalWrite(d1, LOW);
- break;
- case 2:
- digitalWrite(d2, LOW);
- break;
- case 3:
- digitalWrite(d3, LOW);
- break;
- default:
- digitalWrite(d4, LOW);
- break;
- }
- }
-
- void clearLEDs() //清屏
- {
- digitalWrite(a, LOW);
- digitalWrite(b, LOW);
- digitalWrite(c, LOW);
- digitalWrite(d, LOW);
- digitalWrite(e, LOW);
- digitalWrite(f, LOW);
- digitalWrite(g, LOW);
- digitalWrite(p, LOW);
- }
-
-
- // 点亮对应数字的数码管
- void lightSegments(int x) {
- for (int i = 0; i < 8; i++) {
- digitalWrite(segs[i], seven_seg_digits[x][i]);
- }
- }
复制代码
上面是我参考秒表程序写的程序,大致能显示A0口模拟信号的数值了,但现在有两个问题:
1,数字显示还是有错误,比如打开COM口看到数值是150,显示在数码管是190;看到数值是160,显示在数码管是180;其他还都能正常显示,就是说,该显示5的,显示成了9,该显示6的显示成了8,我不知道是怎么回事,定义数组那里的地方,我查过了,没有错,也试过秒表程序,都正常显示,不知道是怎么回事?
2,现在数码管的显示方式是,数码管上从左至右挨个显示,比如显示数值137,显示为数字为0,1,3,7,而且每次都只能一个数字数码管亮,就像跑马灯一样的,能不能改成四位一起亮,一直有数字,但在不停的变化的那种显示方式?
求大神指点。。。 |