查看: 8440|回复: 9

【入门教程】DFR0100 Arduino教程17--数码管显示

[复制链接]
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2016-12-7 10:33 | 显示全部楼层 |阅读模式
    本帖最后由 dfrobot 于 2018-12-14 10:41 编辑

    该教程实验平台:Arduino入门套件
    上一篇教程:
    Arduino教程 Lesson 16--遥控灯


    数码管,常见的用来显示数字的,比如像计算器。这回我们就要来好好研究一下数码管,看看它是如何工作的。数码管,其实也算是LED中的一种。数码管的每一段,都是一个独立的LED,通过数字引脚来控制相应段的亮灭就能达到显示数字的效果。这个项目要实现的是循环显示数字0~9。

    所需材料
    • 1×  八段数码管
    • 8×  220欧电阻

    STEP 1: 硬件连接
    按下图连线图连接,注意数码管各段所对应的引脚。右边引脚说明图上为什么画这么几个箭头呢?个人觉得,这样看起来更方便。可以给你作为参考。我们从上面一排看,红色箭头的方向,从右往左,b  a  f  g的顺序正好对应,下面红色箭头逆时针顺序b --> a --> f --> g。蓝色箭头也是表达的同样的意思。

    我还特意在连接图上,对数码管所连接的引脚做了标示。这样就能更清楚的知道哪个引脚控制哪一段了。这8个电阻同样是起限流的作用。


    STEP 2: 输入代码

    kittenblock中小学创客名师推荐的图形化编程软件

    
    void setup(){
      for(int pin = 2 ; pin <= 9 ; pin++){       // 设置数字引脚2~9为输出模式
          pinMode(pin, OUTPUT);
          digitalWrite(pin, HIGH);
      }
    }
    
    void loop() { 
         // 显示数字0          
    int n0[8]={0,0,0,1,0,0,0,1}; 
    //数字引脚2~9依次按数组n0[8]中的数据显示  
    for(int pin = 2; pin <= 9 ; pin++){ 
       digitalWrite(pin,n0[pin-2]);
        }
        delay(500);
        
        // 显示数字1 
    int n1[8]={0,1,1,1,1,1,0,1};
    // 数字引脚2~9依次按数组n1[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n1[pin-2]);
        }
        delay(500);
        
        // 显示数字2
    int n2[8]={0,0,1,0,0,0,1,1};
    // 数字引脚2~9依次按数组n2[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n2[pin-2]);
        }
    delay(500);  
    
        // 显示数字3
    int n3[8]={0,0,1,0,1,0,0,1};
    // 数字引脚2~9依次按数组n3[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n3[pin-2]);
        }
        delay(500);  
        
        // 显示数字4
    int n4[8]={0,1,0,0,1,1,0,1};
    // 数字引脚2~9依次按数组n4[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n4[pin-2]);
        }
        delay(500);  
        
    // 显示数字5 
    int n5[8]={1,0,0,0,1,0,0,1};
    // 数字引脚2~9依次按数组n5[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n5[pin-2]);
        }
        delay(500); 
        
    // 显示数字6 
    int n6[8]={1,0,0,0,0,0,0,1};
    // 数字引脚2~9依次按数组n6[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n6[pin-2]);
        }
        delay(500); 
        
    // 显示数字7 
    int n7[8]={0,0,1,1,1,1,0,1};
    // 数字引脚2~9依次按数组n7[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n7[pin-2]);
        }
        delay(500); 
        
        // 显示数字8
    int n8[8]={0,0,0,0,0,0,0,1};
    // 数字引脚2~9依次按数组n8[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n8[pin-2]);
        }
        delay(500); 
        
        // 显示数字9
    int n9[8]={0,0,0,0,1,0,0,1};
    // 数字引脚2~9依次按数组n9[8]中的数据显示
        for(int pin = 2; pin <= 9 ; pin++){
           digitalWrite(pin,n9[pin-2]);
        }
        delay(500);
    }  
    

    完成下载后,数码管就会循环显示0~9的数字。由于要看懂代码的话,首先需要了解数码管的构造,所以我们这回先说硬件部分。


    STEP 3: 硬件回顾
    数码管
    数码管其实就是一个前面介绍的led的组合体,这个组合体包含8个led,所以也称之为八段数码管。说白了就八个灯。哪八段?不用多说了吧!a到g以及小数点DP。其实用法和前面说的LED也是一样的,每段都是一个发光二极管,分别用8个数字口来控制它们的亮灭,通过不同段的显示,就能组成0~9的数字。比如,我们让b,a,f,e,d,c亮起的话,就能显示一个数字“0”了。

    下图是个引脚说明图,不陌生了吧!在前面硬件连接的时候,已经看到过一次了。
    这里,b --> a --> f --> g --> e --> d --> c --> DP分别连接到Arduino数字引脚2~9。


    数码管一共有10个引脚。a~DP 这8个引脚接到数字口,那还有两个引脚呢?这是公共端,LED只有一端是不能被点亮的。我们在RGB灯那章讲到过共阴共阳的问题,数码管也存在共阴共阳问题。所谓共阳就是公共端接+5V,共阴则是公共端接GND。

    数码管的共阴共阳在使用上有什么区别

    共阳数码管,它们公共端接5V,那在代码中,控制另一端的数字引脚为LOW,这样才能让数码管点亮。如果是共阴数码管,公共端接GND,在代码中中,控制另一端数字引脚为HIGH,才让数码管点亮。

    所以,共阴共阳只是在代码上要稍作修改。我们这里选用的是共阳数码管。硬件有了了解,我们来看看软件部分。


    STEP 4: 代码回顾
    硬件部分我们已经说过,数码管需要接到8个数字引脚,所以在一开始,需要定义8个数字引脚作为输出。这次我们用一个for循环来完成这8个数字引脚的设置。数码管b,a,f,g,e,d,c,DP分别和Arduino数字引脚2~9对应。

    kittenblock中小学创客名师推荐的图形化编程软件

    
    for(int pin = 2 ; pin <= 9 ; pin++){      
        pinMode(pin, OUTPUT);
        digitalWrite(pin, HIGH);
    }
    


    从引脚2开始,一直循环到引脚9,都设为OUTPUT模式,初始化为HIGH。前面说过,共阳的话,设置HIGH,不被点亮,所以开始先不点亮数码管。(当然,你一个一个引脚分开设置输出模式也是不会错的,只是会让代码显得很冗长。)

    好了,到了主函数,要分别显示0~9的数字。是不是觉得代码大部分都是相似的。所以,我们只要看明白如何显示数字0,那整段代码就都迎刃而解了。

    kittenblock中小学创客名师推荐的图形化编程软件

    
    <font face="微软雅黑" size="4">int n0[8]={0,0,0,1,0,0,0,1};</font>
    



    这里我们要引入一个数组的概念。数组是一个变量的集合,可以通过索引号来找到数组中的元素。在我们的程序中,声明了一个int型的数组。并取名为n0。之后用8个数值来初始化这个数组。那如何获得数组中的元素呢?你只需要简单的指出这个元素的索引号。数组是从0开始索引的,这意味着数组中的第一个元素的索引号为0而不是1,因此数组中的8个元素的索引号是0~7。在这里元素4,对应索引号为3(n0[3]),值为1。元素8(索引号7,n0[7])的值为1。


    声明中n0[8]的方括号中的8代表有8个元素。

    定义完数组后,进入又一个for循环。

    kittenblock中小学创客名师推荐的图形化编程软件

    
    for(int pin = 2; pin <= 9 ; pin++){ 
         digitalWrite(pin,n0[pin-2]);
    }


    这个for循环是给2~9引脚写入状态值,也就是HIGH还是LOW,digitalWrite函数中写入HIGH的另一种形式就是写入“1”,LOW则可以写为“0”。我们通过数组索引的方式给2~9引脚赋值。

    比如当pin=2,代入n0[pin-2]中,对应为n0[0],n0[0]意思是获得数组的第一个元素,为0。完成了引脚2置低(LOW)。我们前面说了,共阳的数码管,置低(LOW)的话,是被点亮,所以,b端被点亮了。循环到pin=3,a段被点亮,。循环到pin=4,f段被点亮,依次类推……。

    整个循环过程如下:
    pin=2 --> n0[0] =0 --> digitalWrite(2,0) --> b段点亮
    pin=3 --> n0[1] =0 --> digitalWrite(3,0) --> a段点亮
    pin=4 --> n0[2] =0 --> digitalWrite(4,0) --> f 段点亮
    pin=5 --> n0[3] =1 --> digitalWrite(5,1) --> g段不点亮
    pin=6 --> n0[4] =0 --> digitalWrite(6,0) --> e段点亮
    pin=7 --> n0[5] =0 --> digitalWrite(7,0) --> d段点亮
    pin=8 --> n0[6] =0 --> digitalWrite(8,0) --> c段点亮
    pin=9 --> n0[7] =1 --> digitalWrite(9,1) --> DP段不点亮

    这样就完成了显示数字“0”了。同样用数组的方法显示数字1~9。自己动手画一下,哪几段亮,哪几段不亮就一目了然了。

    打赏作者鼓励一下!
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

     楼主| 发表于 2016-12-27 14:52 | 显示全部楼层
    打赏作者鼓励一下!
  • TA的每日心情
    慵懒
    2017-11-24 20:13
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2017-2-11 09:32 | 显示全部楼层
    谢谢,不错的帖子。
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

     楼主| 发表于 2017-2-14 14:12 | 显示全部楼层
    Byron20 发表于 2017-2-11 09:32
    谢谢,不错的帖子。

    谢谢夸奖~
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2018-9-11 16:18
  • 签到天数: 133 天

    [LV.7]常住居民III

    发表于 2017-5-24 13:14 | 显示全部楼层
    这样显示数字是不是太麻烦了!!!使用个译码器不是就能把引脚数目降到4个吗,还简单了许多
    打赏作者鼓励一下!
  • TA的每日心情
    无聊
    2017-11-11 17:51
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2017-6-20 16:44 | 显示全部楼层
    学习了哈哈

    该用户从未签到

    发表于 2018-11-3 16:35 | 显示全部楼层
    有没有更简单的代码,像51的数码管,可以用二进制
  • TA的每日心情
    无聊
    2019-1-11 19:53
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-12-12 20:29 | 显示全部楼层
    数字9 少1横
    应该是int n9[8]={0,0,0,0,1,0,0,1};
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

     楼主| 发表于 2018-12-14 10:39 | 显示全部楼层
    ks2ks2 发表于 2018-12-12 20:29
    数字9 少1横
    应该是int n9[8]={0,0,0,0,1,0,0,1};

    谢谢纠错!!感激感激,这就改掉
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    关于arduino编译问题
    关于arduino编译问题
    编译示例程序老是这个问题,换了电脑都不行
    莫名乱码 —— Arduino+RFID-RC522 读写实验
    莫名乱码 —— Arduino+RF
    目标:想把自己房间门改成感应门锁 器材:Arduino Uno (淘宝七星虫LY-F2)、RFID-RC
    [blinker开发实战2]数据反馈
    [blinker开发实战2]数据反
    [md] ### 添加DIY组件 在编辑模式下,点击按键进入编辑组件页面,可以看到 **按键
    用Arduino控制PS2无线手柄为什么一直连接不上
    用Arduino控制PS2无线手柄
    用Arduino UNO板 连接PS2手柄接收器,为什么指示灯已经显示对接上了,但是打开串口监
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表