手上有一只四位数码管,型号是F5461BH 首先直接测试发现,他是共阳极的。
管脚分布如下【参考1】,注意这是正面视图(不知道为什么,大多数文章中给出来的都是背面旋转后的视图):
(一般来说判断管脚的方法是“4位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。”这里引用的图片顺序标记错了,上面是修正后的结果 2014/10/13)
从电路图的角度说,应该是这样的【参考2】:
很多朋友在使用【参考1】中的程序的时候会发现始终显示为0.这是下面的代码导致的
if (digitalRead(13) == HIGH) { n = 0; }
因为原文中并没有要求Pin13连接什么东西,所以会出现Pin13悬空的情况,结果这个Pin读取结果一直为 High, n不断被赋值为0,看起来就是一串0.刚开始我也遇到这个问题,检查了很多次线路,最终检查代码才发现问题。
具体代码如下:
//设置阴极接口 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; //设置变量 long n = 0; int x = 100; int del = 55; //此处数值对时钟进行微调 byte segs[7] = { a, b, c, d, e, f, g }; byte seven_seg_digits[10][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 }; 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); } void loop() { clearLEDs(); pickDigit(1); lightSegments((n/x/1000)%10); delayMicroseconds(del); clearLEDs(); pickDigit(2); lightSegments((n/x/100)%10); delayMicroseconds(del); clearLEDs(); pickDigit(3); dispDec(3); lightSegments((n/x/10)%10); delayMicroseconds(del); clearLEDs(); pickDigit(4); lightSegments(n/x%10); delayMicroseconds(del); n++; if (digitalRead(13) == HIGH) { //n = 0; } } void pickDigit(int x) //定义pickDigit(x),其作用是开启dx端口 { digitalWrite(d1, LOW); digitalWrite(d2, LOW); digitalWrite(d3, LOW); digitalWrite(d4, LOW); switch(x) { case 1: digitalWrite(d1, HIGH); break; case 2: digitalWrite(d2, HIGH); break; case 3: digitalWrite(d3, HIGH); break; default: digitalWrite(d4, HIGH); break; } } void dispDec(int x) //设定开启小数点 { digitalWrite(p, LOW); } void clearLEDs() //清屏 { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(p, HIGH); } // 点亮对应数字的数码管 void lightSegments(int x) { for (int i = 0; i < 7; i++) { digitalWrite(segs[i], seven_seg_digits[x][i]); } }
具体实物:
http://www.tudou.com/programs/view/ZaV8YxX1s5k/?resourceId=414535982_06_02_99
参考:
1. http://www.geek-workshop.com/forum.php?mod=viewthread&tid=82&extra=&highlight=%CA%FD%C2%EB%B9%DC&page=3
2. http://www.geek-workshop.com/forum.php?mod=viewthread&tid=82&highlight=%CA%FD%C2%EB%B9%DC arduino学习笔记13 - 4位数码管实验
3. http://blog.csdn.net/yingcloud/article/details/19032663 Arduino系列教程-015 四位数码管
《Arduino 四位数码管实验》有一个想法