极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 108911|回复: 47

arduino学习笔记5 - 数码管实验

  [复制链接]
发表于 2011-7-4 15:34:53 | 显示全部楼层 |阅读模式
数码管介绍

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数数码管和八段数数码管,八段数数码管比七段数数码管多一个发光二极管单元(多一个小数点显示)
发光二极管单元连接方式分为共阳数码管和共阴数码管。共阳数码管是指将所有发光二极管的阳极连接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极PWR接到电源输入PWR上,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管则更好相反,阴极连接到一起形成了公共阴极,阳极是独立分开的。

先来看一下本次实验使用的数码管。




通过查询型号LG5011BSR得知其为0.5"单联共阳数码管,下面是其引脚图。



查看其背后,四个角分别有2个原点和5,10两个标记。分别表示了1,6,5,10针脚。




数码管和发光二极管一样,需要添加限流电阻,因为网上没有查到资料说明该数码管的击穿电压是多大。所以供给电源电压宁可小不可大,所以选择220Ω限流电阻,和3.3V供电。

线路连接图如下






把下面的代码编译后下载到控制板上,看看效果~
  1. //设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
  2. int a=7;
  3. int b=6;
  4. int c=5;
  5. int d=11;
  6. int e=10;
  7. int f=8;
  8. int g=9;
  9. int dp=4;

  10. //显示数字1
  11. void digital_1(void)
  12. {
  13.   unsigned char j;
  14.   digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段
  15.   digitalWrite(b,LOW);//点亮b段
  16.   for(j=7;j<=11;j++)//熄灭其余段
  17.     digitalWrite(j,HIGH);
  18.   digitalWrite(dp,HIGH);//熄灭小数点DP段
  19. }
  20. //显示数字2
  21. void digital_2(void)
  22. {
  23.   unsigned char j;
  24.   digitalWrite(b,LOW);
  25.   digitalWrite(a,LOW);
  26.   for(j=9;j<=11;j++)
  27.     digitalWrite(j,LOW);
  28.   digitalWrite(dp,HIGH);
  29.   digitalWrite(c,HIGH);
  30.   digitalWrite(f,HIGH);
  31. }
  32. //显示数字3
  33. void digital_3(void)
  34. {
  35.   unsigned char j;
  36.   digitalWrite(g,LOW);
  37.   digitalWrite(d,LOW);
  38.   for(j=5;j<=7;j++)
  39.     digitalWrite(j,LOW);
  40.   digitalWrite(dp,HIGH);
  41.   digitalWrite(f,HIGH);
  42.   digitalWrite(e,HIGH);
  43. }
  44. //显示数字4
  45. void digital_4(void)
  46. {
  47.   digitalWrite(c,LOW);
  48.   digitalWrite(b,LOW);
  49.   digitalWrite(f,LOW);
  50.   digitalWrite(g,LOW);
  51.   digitalWrite(dp,HIGH);
  52.   digitalWrite(a,HIGH);
  53.   digitalWrite(e,HIGH);
  54.   digitalWrite(d,HIGH);   
  55. }
  56. //显示数字5
  57. void digital_5(void)
  58. {
  59.   unsigned char j;
  60.   for(j=7;j<=9;j++)
  61.     digitalWrite(j,LOW);
  62.   digitalWrite(c,LOW);
  63.   digitalWrite(d,LOW);
  64.   digitalWrite(dp,HIGH);
  65.   digitalWrite(b,HIGH);
  66.   digitalWrite(e,HIGH);
  67. }
  68. //显示数字6
  69. void digital_6(void)
  70. {
  71.   unsigned char j;
  72.   for(j=7;j<=11;j++)
  73.     digitalWrite(j,LOW);
  74.   digitalWrite(c,LOW);
  75.   digitalWrite(dp,HIGH);
  76.   digitalWrite(b,HIGH);   
  77. }
  78. //显示数字7
  79. void digital_7(void)
  80. {
  81.   unsigned char j;
  82.   for(j=5;j<=7;j++)
  83.     digitalWrite(j,LOW);
  84.   digitalWrite(dp,HIGH);
  85.   for(j=8;j<=11;j++)
  86.     digitalWrite(j,HIGH);
  87. }
  88. //显示数字8
  89. void digital_8(void)
  90. {
  91.   unsigned char j;
  92.   for(j=5;j<=11;j++)
  93.     digitalWrite(j,LOW);
  94.   digitalWrite(dp,HIGH);
  95. }
  96. void setup()
  97. {
  98.   int i;//定义变量
  99.   for(i=4;i<=11;i++)
  100.     pinMode(i,OUTPUT);//设置4~11引脚为输出模式
  101. }
  102. void loop()
  103. {  
  104.   while(1)
  105.   {
  106.     digital_1();//数字1
  107.     delay(2000);//延时2s
  108.     digital_2();
  109.     delay(2000);
  110.     digital_3();
  111.     delay(2000);
  112.     digital_4();
  113.     delay(2000);
  114.     digital_5();
  115.     delay(2000);
  116.     digital_6();
  117.     delay(2000);
  118.     digital_7();
  119.     delay(2000);
  120.     digital_8();
  121.     delay(2000);   
  122.   }
  123. }
复制代码
本次试验的效果为数码管1,2,3,4,5,6,7,8这样子循环显示。




上面的代码使用的是传统的方法来显示1,2,3,4。如果遇到工程量比较大的时候,这种方法就不合适了。这时我们需要使用数组的方法来进行控制。使用数组前,需要先对显示0,1,2,3等情况下,各个端口的开关情况进行统计,统计结果如下图。



请大家把下面的代码输入控制板,看看实验效果,然后对两种代码表达方式进行研究~~看看异同。
  1. byte seven_seg_digits[10][8] = {    //设置每个数字所对应的开关数组
  2.   { 1,0,0,0,0,1,0,0 },  // = 0
  3.   { 1,0,0,1,1,1,1,1 },  // = 1
  4.   { 1,1,0,0,1,0,0,0 },  // = 2
  5.   { 1,0,0,0,1,0,1,0 },  // = 3
  6.   { 1,0,0,1,0,0,1,1 },  // = 4
  7.   { 1,0,1,0,0,0,1,0 },  // = 5
  8.   { 1,0,1,0,0,0,0,0 },  // = 6
  9.   { 1,0,0,0,1,1,1,1 },  // = 7
  10.   { 1,0,0,0,0,0,0,0 },  // = 8
  11.   { 1,0,0,0,0,0,1,0 }   // = 9
  12.   };

  13. void setup() {                //4-11号端口设定为输出模式
  14.   pinMode(4, OUTPUT);   
  15.   pinMode(5, OUTPUT);
  16.   pinMode(6, OUTPUT);
  17.   pinMode(7, OUTPUT);
  18.   pinMode(8, OUTPUT);
  19.   pinMode(9, OUTPUT);
  20.   pinMode(10, OUTPUT);
  21.   pinMode(11, OUTPUT);
  22. }
  23.    
  24. void sevenSegWrite(byte digit) {  //设置通过数组控制引脚开关,顺序为4-11号端口
  25.   byte pin = 4;
  26.   for (byte segCount = 0; segCount < 8; ++segCount) {
  27.     digitalWrite(pin, seven_seg_digits[digit][segCount]);
  28.     ++pin;
  29.   }
  30. }

  31. void loop() {   //设置显示效果为从9开始倒数
  32.   for (byte count = 10; count > 0; --count) {
  33.    delay(1000);
  34.    sevenSegWrite(count - 1);
  35.   }
  36.   delay(2000);
  37. }
复制代码
视频效果如下


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-2-24 18:41:30 | 显示全部楼层
陈冬冬 发表于 2012-1-17 17:23
求助!为什么总有个 unsigned char j??为什么要这样定义变量 j 啊

因为如果直接用char的话就是16个字节了,一般来说在 j 数字允许的情况下,尽量用小点的定义,,
回复 支持 1 反对 0

使用道具 举报

发表于 2011-10-15 22:01:14 | 显示全部楼层
管脚能用类似51单片机总线的方式控制吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-15 22:53:02 | 显示全部楼层
Dawn 发表于 2011-10-15 22:01
管脚能用类似51单片机总线的方式控制吗?

额。。。没有用过51单片机。。。有懂51的介绍介绍。。。
回复 支持 反对

使用道具 举报

发表于 2011-12-14 20:24:26 | 显示全部楼层
这是我写的,不知道有没有错误,我现在没有板子
  1. void loop()
  2. {
  3.   byte i,j;
  4.   for(i=0;i<10;i++)
  5.   {
  6.     for(j=0;j<8;j++)
  7.     {
  8.       if(1==seven_seg_digits[i][j])
  9.       digitalWrite((j+4),HIGH);
  10.       else
  11.       digitalWrite((j+4),LOW);
  12.     }
  13.   delay(1000);
  14.   }
  15.   delay(2000);
  16. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-1-17 17:23:52 | 显示全部楼层
弘毅 发表于 2011-10-15 22:53
额。。。没有用过51单片机。。。有懂51的介绍介绍。。。

求助!为什么总有个 unsigned char j??为什么要这样定义变量 j 啊
回复 支持 反对

使用道具 举报

发表于 2012-1-17 18:04:07 | 显示全部楼层
弘毅 发表于 2011-10-15 22:53
额。。。没有用过51单片机。。。有懂51的介绍介绍。。。
  1. void sevenSegWrite(byte digit) {  //设置通过数组控制引脚开关,顺序为4-11号端口
  2.   byte pin = 4;
  3.   for (byte segCount = 0; segCount < 8; ++segCount) {
  4.     digitalWrite(pin, seven_seg_digits[digit][segCount]);
  5.     ++pin;
  6.   }
  7. }
复制代码
求助。。这段代码不明白诶。。。。
回复 支持 反对

使用道具 举报

发表于 2012-2-1 09:58:37 | 显示全部楼层
不知道能不能用总线来控制管脚呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-1 10:06:53 | 显示全部楼层
勇! 发表于 2012-2-1 09:58
不知道能不能用总线来控制管脚呢?

加上对应的IIC或者SPI总线的芯片,就可以,直接控制貌似不行~
回复 支持 反对

使用道具 举报

发表于 2012-2-25 10:57:17 | 显示全部楼层
25.void sevenSegWrite(byte digit) {  //设置通过数组控制引脚开关,顺序为4-11号端口
26.  byte pin = 4;
27.  for (byte segCount = 0; segCount < 8; ++segCount) {
28.    digitalWrite(pin, seven_seg_digits[digit][segCount]);
29.    ++pin;
30.  }
31.}  
求助这段代码怎么解析?
回复 支持 反对

使用道具 举报

发表于 2012-2-25 13:29:55 | 显示全部楼层
它们控制的原理相同,但引脚和所用的函数有些不同,所以写的程序不能完全通用
回复 支持 反对

使用道具 举报

发表于 2012-3-17 21:45:40 | 显示全部楼层
为什么我接3.3V没用,接GND就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-18 20:03:54 | 显示全部楼层
diamondliu 发表于 2012-3-17 21:45
为什么我接3.3V没用,接GND就可以了

数码管分共阴和共阳。。。你的应该和实验里面所用的,刚好是反的。
回复 支持 反对

使用道具 举报

发表于 2012-3-19 22:26:32 | 显示全部楼层
知道了,我的高低电平也是反的
回复 支持 反对

使用道具 举报

发表于 2012-3-19 22:27:52 | 显示全部楼层
不过觉得控制数码管没有51的好懂
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 18:11 , Processed in 0.055612 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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