Arduino 入门教程GO 第七章 四位数码管的应用-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 832|回复: 0

Arduino 入门教程GO 第七章 四位数码管的应用

[复制链接]
发表于 2022-1-17 14:27 | 显示全部楼层 |阅读模式
本帖最后由 OpenJumper 于 2022-1-17 14:26 编辑

[md]## 一、四位数码管显示实验

在上一课中,我们学习了一位数码管的控制,通过程序来使数码管点亮或熄灭,但是遇到多位数字,我们又该怎么显示呢?所以,我们今天要学习的就是四位数码管的控制,四位数码管并不是简单的1+1+1+1的样子,那么它究竟跟一位数码管有什么区别呢,就让我们来看今天的课程。

## 二、实验器材

+ UNO控制板:1块

+ 共阳极四位数码管:1个

+ 面包板:1块

+ 面包板跳线:若干

+ 220Ω电阻:8个

## 三、连线示意图

01.jpg
图7-1



## 四、硬件连接图

02.jpg
图7-2


## 五、硬件知识要点

03.jpg
图7-3


将限流电阻的一端插到数字 I/O 中,另一端和数码管的字段引脚相连,剩下的六个字段和一个小数点依次按照这种方法连接。将公共极 COM 如果是共阳极的就 接到+5V,如果是共阴极的就接到 GND。4 位数码管总共有 12个引脚,小数点朝下正放在面前时,左下角为 1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。

04.jpg
图7-4


驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阳极接,总共接4颗。这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。

## 六、程序编写

根据上面的程序,数码管会以三种不同的样式显示,供大家选择。[/md]
  1. //设置阴极接口
  2. int a = 1;
  3. int b = 2;
  4. int c = 3;
  5. int d = 4;
  6. int e = 5;
  7. int f = 6;
  8. int g = 7;
  9. int p = 8;
  10. //设置阳极接口
  11. int d4 = 9;
  12. int d3 = 10;
  13. int d2 = 11;
  14. int d1 = 12;
  15. //设置变量
  16. int del = 100;
  17. int buttoncount = 0;
  18. int loopcount = 0;

  19. void setup()
  20. {
  21.   pinMode(d1, OUTPUT);
  22.   pinMode(d2, OUTPUT);
  23.   pinMode(d3, OUTPUT);
  24.   pinMode(d4, OUTPUT);
  25.   pinMode(a, OUTPUT);
  26.   pinMode(b, OUTPUT);
  27.   pinMode(c, OUTPUT);
  28.   pinMode(d, OUTPUT);
  29.   pinMode(e, OUTPUT);
  30.   pinMode(f, OUTPUT);
  31.   pinMode(g, OUTPUT);
  32.   pinMode(p, OUTPUT);
  33.   digitalWrite(a, HIGH);
  34.   digitalWrite(b, HIGH);
  35.   digitalWrite(c, HIGH);
  36.   digitalWrite(d, HIGH);
  37.   digitalWrite(e, HIGH);
  38.   digitalWrite(f, HIGH);
  39.   digitalWrite(g, HIGH);
  40.   digitalWrite(p, HIGH);
  41. }

  42. void loop()
  43. {
  44.   roulette(4);  //轮转效果
  45.   delay(100);
  46.   zigzag(2);    //Z字型效果
  47.   delay(100);
  48.   circles(4);   //圈状效果
  49.   delay(100);
  50. }

  51. void pickDigit(int x)  //定义pickDigit(x),其作用是开启dx端口
  52. {
  53.   digitalWrite(d1, LOW);
  54.   digitalWrite(d2, LOW);
  55.   digitalWrite(d3, LOW);
  56.   digitalWrite(d4, LOW);

  57.   switch(x)
  58.   {
  59.   case 1:
  60.     digitalWrite(d1, HIGH);
  61.     break;
  62.   case 2:
  63.     digitalWrite(d2, HIGH);
  64.     break;
  65.   case 3:
  66.     digitalWrite(d3, HIGH);
  67.     break;
  68.   default:
  69.     digitalWrite(d4, HIGH);
  70.     break;
  71.   }
  72. }

  73. void clearLEDs()  //清屏
  74. {
  75.   digitalWrite(a, HIGH);
  76.   digitalWrite(b, HIGH);
  77.   digitalWrite(c, HIGH);
  78.   digitalWrite(d, HIGH);
  79.   digitalWrite(e, HIGH);
  80.   digitalWrite(f, HIGH);
  81.   digitalWrite(g, HIGH);
  82.   digitalWrite(p, HIGH);
  83. }

  84. void roulette(int x)  //设置轮转效果
  85. {
  86.   loopcount = 0;
  87.   while (loopcount < x)
  88.   {
  89.     digitalWrite(a, LOW);
  90.     pickDigit(1);
  91.     delay(del);
  92.     pickDigit(2);
  93.     delay(del);
  94.     pickDigit(3);
  95.     delay(del);
  96.     pickDigit(4);
  97.     delay(del);
  98.     digitalWrite(a, HIGH);
  99.     digitalWrite(b, LOW);
  100.     delay(del);
  101.     digitalWrite(b, HIGH);
  102.     digitalWrite(c, LOW);
  103.     delay(del);
  104.     digitalWrite(c, HIGH);
  105.     digitalWrite(d, LOW);
  106.     delay(del);
  107.     pickDigit(3);
  108.     delay(del);
  109.     pickDigit(2);
  110.     delay(del);
  111.     pickDigit(1);
  112.     delay(del);
  113.     digitalWrite(d, HIGH);
  114.     digitalWrite(e, LOW);
  115.     delay(del);
  116.     digitalWrite(e, HIGH);
  117.     digitalWrite(f, LOW);
  118.     delay(del);
  119.     clearLEDs();
  120.     loopcount++;
  121.   }
  122. }

  123. void zigzag(int x)  //设置Z字形效果
  124. {
  125.   loopcount = 0;
  126.   while(loopcount < x)
  127.   {
  128.     digitalWrite(a, LOW);
  129.     pickDigit(1);
  130.     delay(del);
  131.     pickDigit(2);
  132.     delay(del);
  133.     pickDigit(3);
  134.     delay(del);
  135.     pickDigit(4);
  136.     delay(del);
  137.     digitalWrite(a, HIGH);
  138.     digitalWrite(b, LOW);
  139.     delay(del);
  140.     digitalWrite(b, HIGH);
  141.     digitalWrite(g, LOW);
  142.     delay(del);
  143.     pickDigit(3);
  144.     delay(del);
  145.     pickDigit(2);
  146.     delay(del);
  147.     pickDigit(1);
  148.     delay(del);
  149.     digitalWrite(g, HIGH);
  150.     digitalWrite(e, LOW);
  151.     delay(del);
  152.     digitalWrite(e, HIGH);
  153.     digitalWrite(d, LOW);
  154.     delay(del);
  155.     pickDigit(2);
  156.     delay(del);
  157.     pickDigit(3);
  158.     delay(del);
  159.     pickDigit(4);
  160.     delay(del);
  161.     digitalWrite(d, HIGH);
  162.     digitalWrite(c, LOW);
  163.     delay(del);
  164.     digitalWrite(c, HIGH);
  165.     digitalWrite(g, LOW);
  166.     delay(del);
  167.     pickDigit(3);
  168.     delay(del);
  169.     pickDigit(2);
  170.     delay(del);
  171.     pickDigit(1);
  172.     delay(del);
  173.     digitalWrite(g, HIGH);
  174.     digitalWrite(f, LOW);
  175.     delay(del);
  176.     clearLEDs();
  177.     loopcount++;
  178.   }
  179. }

  180. void circles(int x)  //设置圈状效果
  181. {
  182.   loopcount = 0;
  183.   while (loopcount < x)
  184.   {
  185.     digitalWrite(a, LOW);
  186.     digitalWrite(b, LOW);
  187.     digitalWrite(f, LOW);
  188.     digitalWrite(g, LOW);
  189.     pickDigit(1);
  190.     delay(250);
  191.     digitalWrite(a, HIGH);
  192.     digitalWrite(b, HIGH);
  193.     digitalWrite(f, HIGH);
  194.     digitalWrite(c, LOW);
  195.     digitalWrite(d, LOW);
  196.     digitalWrite(e, LOW);
  197.     pickDigit(2);
  198.     delay(250);
  199.     digitalWrite(a, LOW);
  200.     digitalWrite(b, LOW);
  201.     digitalWrite(f, LOW);
  202.     digitalWrite(c, HIGH);
  203.     digitalWrite(d, HIGH);
  204.     digitalWrite(e, HIGH);
  205.     pickDigit(3);
  206.     delay(250);
  207.     digitalWrite(a, HIGH);
  208.     digitalWrite(b, HIGH);
  209.     digitalWrite(f, HIGH);
  210.     digitalWrite(c, LOW);
  211.     digitalWrite(d, LOW);
  212.     digitalWrite(e, LOW);
  213.     pickDigit(4);
  214.     delay(250);
  215.     clearLEDs();
  216.     loopcount++;
  217.   }
  218. }
复制代码
[md]
## 七、程序知识要点

switch / case语句:
和 if 语句相同,switch…case通过程序员设定的在不同条件下执行的代码控制程序的流程。特别地,switch语句将变量值和case语句中设定的值进行比较。当一个case语句中的设定值与变量值相同时,这条case语句将被执行。
关键字break可用于退出switch语句,通常每条case语句都以break结尾。如果没有break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break,或者直到switch语句结尾。
[/md]
  1. switch (var) {
  2. case 1:
  3.   //当var等于1时,执行一些语句
  4.   break;
  5. case 2
  6.   //当var等于2时,执行一些语句
  7.   break;
  8. default:
  9.   //如果没有任何匹配,执行default
  10.   //default可有可不有
  11. }
复制代码
[md]
## 八、拓展阅读

在本章的拓展阅读中,我们为大家制作一款简易的秒表,其程序如下:
[/md]
  1. //设置阴极接口
  2. int a = 1;
  3. int b = 2;
  4. int c = 3;
  5. int d = 4;
  6. int e = 5;
  7. int f = 6;
  8. int g = 7;
  9. int p = 8;
  10. //设置阳极接口
  11. int d4 = 9;
  12. int d3 = 10;
  13. int d2 = 11;
  14. int d1 = 12;
  15. //设置变量
  16. long n = 0;
  17. int x = 100;
  18. int del = 55;  //此处数值对时钟进行微调

  19. void setup()
  20. {
  21.   pinMode(d1, OUTPUT);
  22.   pinMode(d2, OUTPUT);
  23.   pinMode(d3, OUTPUT);
  24.   pinMode(d4, OUTPUT);
  25.   pinMode(a, OUTPUT);
  26.   pinMode(b, OUTPUT);
  27.   pinMode(c, OUTPUT);
  28.   pinMode(d, OUTPUT);
  29.   pinMode(e, OUTPUT);
  30.   pinMode(f, OUTPUT);
  31.   pinMode(g, OUTPUT);
  32.   pinMode(p, OUTPUT);
  33. }

  34. void loop()
  35. {
  36.   clearLEDs();
  37.   pickDigit(1);
  38.   pickNumber((n/x/1000)%10);
  39.   delayMicroseconds(del);
  40.   
  41.   clearLEDs();
  42.   pickDigit(2);
  43.   pickNumber((n/x/100)%10);
  44.   delayMicroseconds(del);
  45.   
  46.   clearLEDs();
  47.   pickDigit(3);
  48.   dispDec(3);
  49.   pickNumber((n/x/10)%10);
  50.   delayMicroseconds(del);
  51.   
  52.   clearLEDs();
  53.   pickDigit(4);
  54.   pickNumber(n/x%10);
  55.   delayMicroseconds(del);
  56.   
  57.   n++;
  58.   
  59.   if (digitalRead(13) == HIGH)
  60.   {
  61.     n = 0;
  62.   }
  63. }

  64. void pickDigit(int x)  //定义pickDigit(x),其作用是开启dx端口
  65. {
  66.   digitalWrite(d1, LOW);
  67.   digitalWrite(d2, LOW);
  68.   digitalWrite(d3, LOW);
  69.   digitalWrite(d4, LOW);
  70.   
  71.   switch(x)
  72.   {
  73.   case 1:
  74.     digitalWrite(d1, HIGH);
  75.     break;
  76.   case 2:
  77.     digitalWrite(d2, HIGH);
  78.     break;
  79.   case 3:
  80.     digitalWrite(d3, HIGH);
  81.     break;
  82.   default:
  83.     digitalWrite(d4, HIGH);
  84.     break;
  85.   }
  86. }

  87. void pickNumber(int x)   //定义pickNumber(x),其作用是显示数字x
  88. {
  89.   switch(x)
  90.   {
  91.   default:
  92.     zero();
  93.     break;
  94.   case 1:
  95.     one();
  96.     break;
  97.   case 2:
  98.     two();
  99.     break;
  100.   case 3:
  101.     three();
  102.     break;
  103.   case 4:
  104.     four();
  105.     break;
  106.   case 5:
  107.     five();
  108.     break;
  109.   case 6:
  110.     six();
  111.     break;
  112.   case 7:
  113.     seven();
  114.     break;
  115.   case 8:
  116.     eight();
  117.     break;
  118.   case 9:
  119.     nine();
  120.     break;
  121.   }
  122. }

  123. void dispDec(int x)  //设定开启小数点
  124. {
  125.   digitalWrite(p, LOW);
  126. }

  127. void clearLEDs()  //清屏
  128. {
  129.   digitalWrite(a, HIGH);
  130.   digitalWrite(b, HIGH);
  131.   digitalWrite(c, HIGH);
  132.   digitalWrite(d, HIGH);
  133.   digitalWrite(e, HIGH);
  134.   digitalWrite(f, HIGH);
  135.   digitalWrite(g, HIGH);
  136.   digitalWrite(p, HIGH);
  137. }

  138. void zero()  //定义数字0时阴极那些管脚开关
  139. {
  140.   digitalWrite(a, LOW);
  141.   digitalWrite(b, LOW);
  142.   digitalWrite(c, LOW);
  143.   digitalWrite(d, LOW);
  144.   digitalWrite(e, LOW);
  145.   digitalWrite(f, LOW);
  146.   digitalWrite(g, HIGH);
  147. }

  148. void one()  //定义数字1时阴极那些管脚开关
  149. {
  150.   digitalWrite(a, HIGH);
  151.   digitalWrite(b, LOW);
  152.   digitalWrite(c, LOW);
  153.   digitalWrite(d, HIGH);
  154.   digitalWrite(e, HIGH);
  155.   digitalWrite(f, HIGH);
  156.   digitalWrite(g, HIGH);
  157. }

  158. void two()  //定义数字2时阴极那些管脚开关
  159. {
  160.   digitalWrite(a, LOW);
  161.   digitalWrite(b, LOW);
  162.   digitalWrite(c, HIGH);
  163.   digitalWrite(d, LOW);
  164.   digitalWrite(e, LOW);
  165.   digitalWrite(f, HIGH);
  166.   digitalWrite(g, LOW);
  167. }

  168. void three()  //定义数字3时阴极那些管脚开关
  169. {
  170.   digitalWrite(a, LOW);
  171.   digitalWrite(b, LOW);
  172.   digitalWrite(c, LOW);
  173.   digitalWrite(d, LOW);
  174.   digitalWrite(e, HIGH);
  175.   digitalWrite(f, HIGH);
  176.   digitalWrite(g, LOW);
  177. }

  178. void four()  //定义数字4时阴极那些管脚开关
  179. {
  180.   digitalWrite(a, HIGH);
  181.   digitalWrite(b, LOW);
  182.   digitalWrite(c, LOW);
  183.   digitalWrite(d, HIGH);
  184.   digitalWrite(e, HIGH);
  185.   digitalWrite(f, LOW);
  186.   digitalWrite(g, LOW);
  187. }

  188. void five()  //定义数字5时阴极那些管脚开关
  189. {
  190.   digitalWrite(a, LOW);
  191.   digitalWrite(b, HIGH);
  192.   digitalWrite(c, LOW);
  193.   digitalWrite(d, LOW);
  194.   digitalWrite(e, HIGH);
  195.   digitalWrite(f, LOW);
  196.   digitalWrite(g, LOW);
  197. }

  198. void six()  //定义数字6时阴极那些管脚开关
  199. {
  200.   digitalWrite(a, LOW);
  201.   digitalWrite(b, HIGH);
  202.   digitalWrite(c, LOW);
  203.   digitalWrite(d, LOW);
  204.   digitalWrite(e, LOW);
  205.   digitalWrite(f, LOW);
  206.   digitalWrite(g, LOW);
  207. }

  208. void seven()  //定义数字7时阴极那些管脚开关
  209. {
  210.   digitalWrite(a, LOW);
  211.   digitalWrite(b, LOW);
  212.   digitalWrite(c, LOW);
  213.   digitalWrite(d, HIGH);
  214.   digitalWrite(e, HIGH);
  215.   digitalWrite(f, HIGH);
  216.   digitalWrite(g, HIGH);
  217. }

  218. void eight()  //定义数字8时阴极那些管脚开关
  219. {
  220.   digitalWrite(a, LOW);
  221.   digitalWrite(b, LOW);
  222.   digitalWrite(c, LOW);
  223.   digitalWrite(d, LOW);
  224.   digitalWrite(e, LOW);
  225.   digitalWrite(f, LOW);
  226.   digitalWrite(g, LOW);
  227. }

  228. void nine()  //定义数字9时阴极那些管脚开关
  229. {
  230.   digitalWrite(a, LOW);
  231.   digitalWrite(b, LOW);
  232.   digitalWrite(c, LOW);
  233.   digitalWrite(d, LOW);
  234.   digitalWrite(e, HIGH);
  235.   digitalWrite(f, LOW);
  236.   digitalWrite(g, LOW);
  237. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 08:04 , Processed in 0.080020 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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