文号
t60356
阅读
3872
回复
0
收藏
1
转帖:跟珜羽一起学Arduino NO.2.3 数码管控制
2013/09/05
IP:广西
跟珜羽一起学Arduino NO.2.3 数码管控制

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
照例,先是演示视频:

点击此处查看视频
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
一:硬件准备
数码管的实质是多个LED并联起来,一端映出,另一端接电源或者地供电。即共阳(正极接在一起)共阴(负极接在一起)。
这次要用的数码管如下图:
001.gif

可以清楚的看到这是一个共阳的数码管。红色的数码管压降大概2.2V左右。接在5v上需要接电阻保护。
为了简化电路,在1号脚接一个220Ω电阻,再连到5V上,好处是不用8个引脚全部接电阻,坏处就是只点一段和八段的时候,亮度会有区别。(但是差别也不是很大)
如下表连接硬件。

Arduino引脚

连接方式

数码管引脚

VCC

<=220Ω电阻=>

1(VCC)

13

<===========>

2(F)

12

<===========>

3(G)

11

<===========>

4(E)

10

<===========>

5(D)


不连接NC

6(VCC)

9

<===========>

7(Dp)

8

<===========>

8©

7

<===========>

9(B)

6

<===========>

10(A)

示意图:

002.jpg     
实物图:
003.jpg

硬件准备工作到此结束:

二:打开arduino的IDE,输入以下代码,编译下载:
代码:
const unsigned char LED8Pin[]={
  6,7,8,10,11,13,12,9};//A B C D E F G Dp
const unsigned char LED8Code[]={
  0xC0,    // 0
  0xF9,    // 1
  0xA4,    // 2
  0xB0,    // 3
  0x99,    // 4
  0x92,    // 5
  0x82,    // 6
  0xF8,    // 7
  0x80,    // 8
  0x90,    // 9
  0x88,    // A
  0x83,    // B
  0xC6,    // C
  0xA1,    // D
  0x86,    // E
  0x8E     // F
};
void setup() {
  char i;
  for(i=0;i<8;i++)
  {
    pinMode(LED8Pin, OUTPUT);     [i]
    digitalWrite(LED8Pin, HIGH);  
  }
}
char a;
void loop() {
  for(a=0;a<16;a++)
  {
    LED8Show(a);
    delay(1000);
  }
}
voidLED8Show(char data){
  char i;
  char j;
  char hc;
  if(0<=data<16)
  {
    hc = LED8Code[data];
    for(i=0;i<8;i++)
    {
      j = bitRead(hc,i);
      digitalWrite(LED8Pin, j);
    }
  }
}

也可以从这里下载。

LED.zip
attachment icon LED.zip 0.63KB ZIP 23次下载 (646 Bytes)


如果你的联线没有错误的话,你就能看到跟视频一样的效果。(PS:数码管取模软件在最后)

三:
最开始的一个数组,是用来保存连接到数码管ABCDEFGDp段的引脚,你用不同的连接方式的花,来修改这个数组即可。
第二个数组是用来保存让数码管显示数字的编码方式,例如共阳的数码管要显示1,就要吧B,C段拉低,其他的段置高,数码管就能显示出1来。如果用一个字节保存数码管每个段的状态,第一个位表示A段,第二个位表示B段,一次类推,显示1的表就是:

字节位序

7

6

5

4

3

2

1

0

数码管段

Dp

G

F

E

D

C

B

A

状态

1

1

1

1

1

0

0

1

依次保存0~9,数码管还能显示ABCDEF,也保存下来,这样这个表就组成了上面程序中的第二个数组。

下面程序中用到了一个j =bitRead(hc,i);
bitRead的作用是从hc中读取第i位的数据。hc的数据类型只能是char型,i的取值范围是0~7。

void LED8Show(char data)是将显示的操作封包成函数,以后要显示一个数字的时候带一个参数调用即可。参数范围为0~15。

PS:大家想一下,如果要显示3位,甚至4位数码管要怎么做?arduino只有20个IO哦,一个数码管要8个IO呢。


以下是对数码管的一些介绍:
004.jpg   
照能显示数字的数量分成了一位,两位,三位,四位,六位等。



还有特殊的带冒号,或者前置1的数码管。
按照尺寸来分(多为高度).28英寸,0.3英寸,0.36英寸,0.39,0.4,0.43等等,具体的尺寸见附件1。
根据一个位的段数分日字型和米字型,日字型是7段,带小数点是8段。米字型又分两种,大米小米,小米的上下各只有一段,14段。大米的上下又细分成两个,共有16段。
005.jpg

每个段的位置如下图所示:
006.jpg

还有按照颜色区分的,蓝色,绿色,红色等等。。。。

还有8个段驱动的,还有只有四个引脚,内部带芯片解BCD码等等。。。。

数码管尺寸.pdf
attachment icon 数码管尺寸.pdf 130.62KB PDF 668次下载 预览 (130.62 KB)

数码管的取模软件如图所示:
007.png


attachment icon 七段数码管取模软件.zip 15.08KB ZIP 36次下载
(15.08 KB,)




[/b]
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的