64723| 35
|
[入门教程] DFR0100 Arduino教程 17--数码管显示 |
该教程实验平台:Arduino入门套件 数码管,常见的用来显示数字的,比如像计算器。这回我们就要来好好研究一下数码管,看看它是如何工作的。数码管,其实也算是LED中的一种。数码管的每一段,都是一个独立的LED,通过数字引脚来控制相应段的亮灭就能达到显示数字的效果。这个项目要实现的是循环显示数字0~9。 所需材料
STEP 1: 硬件连接按下图连线图连接,注意数码管各段所对应的引脚。右边引脚说明图上为什么画这么几个箭头呢?个人觉得,这样看起来更方便。可以给你作为参考。我们从上面一排看,红色箭头的方向,从右往左,b a f g的顺序正好对应,下面红色箭头逆时针顺序b --> a --> f --> g。蓝色箭头也是表达的同样的意思。 我还特意在连接图上,对数码管所连接的引脚做了标示。这样就能更清楚的知道哪个引脚控制哪一段了。这8个电阻同样是起限流的作用。 STEP 2: 输入代码
完成下载后,数码管就会循环显示0~9的数字。由于要看懂代码的话,首先需要了解数码管的构造,所以我们这回先说硬件部分。 STEP 3: 硬件回顾数码管 下图是个引脚说明图,不陌生了吧!在前面硬件连接的时候,已经看到过一次了。 数码管一共有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对应。
从引脚2开始,一直循环到引脚9,都设为OUTPUT模式,初始化为HIGH。前面说过,共阳的话,设置HIGH,不被点亮,所以开始先不点亮数码管。(当然,你一个一个引脚分开设置输出模式也是不会错的,只是会让代码显得很冗长。) 好了,到了主函数,要分别显示0~9的数字。是不是觉得代码大部分都是相似的。所以,我们只要看明白如何显示数字0,那整段代码就都迎刃而解了。
这里我们要引入一个数组的概念。数组是一个变量的集合,可以通过索引号来找到数组中的元素。在我们的程序中,声明了一个int型的数组。并取名为n0。之后用8个数值来初始化这个数组。那如何获得数组中的元素呢?你只需要简单的指出这个元素的索引号。数组是从0开始索引的,这意味着数组中的第一个元素的索引号为0而不是1,因此数组中的8个元素的索引号是0~7。在这里元素4,对应索引号为3(n0[3]),值为1。元素8(索引号7,n0[7])的值为1。 声明中n0[8]的方括号中的8代表有8个元素。 定义完数组后,进入又一个for循环。
这个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段被点亮,依次类推……。 整个循环过程如下: 这样就完成了显示数字“0”了。同样用数组的方法显示数字1~9。自己动手画一下,哪几段亮,哪几段不亮就一目了然了。 |
做了一段可以用遥控器控制8段数码管的程序:
红色开关可以控制数码管显示/关闭; 显示状态下按数字键控制数码管显示相应数字; 按下播放键使数码管循环显示0~9,再按一下停止循环; 还有上下键和快进/后退键也有相应的用途; 有一个比较奇怪的地方是: 我如果把displayNum函数中,下面这两段注释的代码打开,就会导致显示失灵。
有哪位大侠能帮忙解释解释? |
flugkatze 发表于 2015-1-7 22:19 没太看明白你的代码,我之前写过一段也是红外遥控的,给你参考下吧。
|
你好,我对数组不是太理解 int number[10][8] = //the array is used to store the number 0~9 { {0,0,0,1,0,0,0,1},//0 {0,1,1,1,1,1,0,1},//1 {0,0,1,0,0,0,1,1},//2 {0,0,1,0,1,0,0,1},//3 {0,1,0,0,1,1,0,1},//4 {1,0,0,0,1,0,0,1},//5 {1,0,0,0,0,0,0,1},//6 {0,0,1,1,1,1,0,1},//7 {0,0,0,0,0,0,0,1},//8 {0,0,0,0,1,1,0,1} //9 }; 怎么知道0~9对应的数组就是这几个呢? |
此段loop里的函数是什么意思,为什么没有 for(int pin = 2; pin <= 9 ; pin++){ digitalWrite(pin,n[pin-2]); //数字引脚2~9依次按数组n0[8]中的数据显示 这一段? void loop() { if (irrecv.decode(&results)) { for(int i = 0; i <= 11; i++){ if(results.value == codes[i]&& i <= 9){ numberShow(i); // display number 0~9 on the digital control currentNumber = i; Serial.println(i); break; } else if(results.value == codes[10]&& currentNumber != 0){ currentNumber--; numberShow(currentNumber); Serial.println(currentNumber); break; } // else if(results.value == codes[11]&& currentNumber != 9){ currentNumber++; numberShow(currentNumber); Serial.println(currentNumber); break; } } |
Arduino:1.8.3 (Windows 7), 开发板:"Arduino/Genuino Uno" C:\Users\andyyt\Desktop\ygf\arduino-1.8.3\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope int RECV_PIN = TKD2; // the pin the IR receiver is connected to ^ exit status 1 为开发板 Arduino/Genuino Uno 编译时出错。 在文件 -> 首选项开启 “编译过程中显示详细输出”选项 这份报告会包含更多信息。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed