极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11298|回复: 3

今天用ARDUINO驱动4位数码管遇到了问题求高手解答

[复制链接]
发表于 2016-1-11 22:35:37 | 显示全部楼层 |阅读模式
本帖最后由 tianlongk 于 2016-1-11 22:37 编辑

我用ARDUINO驱动4位数码管,本来打算输出1到1000玩,结果发现输出十位以上就不会了,先输出前两位,发现数字闪烁,不知道为什么,视频不太明显,但是确实闪烁,代码如下:
  1. //设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
  2. int a=6;
  3. int b=9;
  4. int c=8;
  5. int d=7;
  6. int e=10;
  7. int f=11;
  8. int g=12;
  9. int dp=13;

  10. //显示数字1
  11. void digital_1(void)
  12. {

  13.   digitalWrite(a,HIGH);
  14.   digitalWrite(b,LOW);
  15.     digitalWrite(c,LOW);
  16.     digitalWrite(d,HIGH);
  17.   digitalWrite(e,HIGH);
  18.   digitalWrite(f,HIGH);
  19.     digitalWrite(g,HIGH);
  20.   digitalWrite(dp,HIGH);
  21. }
  22. //显示数字2
  23. void digital_2(void)
  24. {
  25.   digitalWrite(a,LOW);
  26.   digitalWrite(b,LOW);
  27.     digitalWrite(c,HIGH);
  28.     digitalWrite(d,LOW);
  29.   digitalWrite(e,LOW);
  30.   digitalWrite(f,HIGH);
  31.     digitalWrite(g,LOW);
  32.   digitalWrite(dp,HIGH);
  33. }
  34. //显示数字3
  35. void digital_3(void)
  36. {
  37.   digitalWrite(a,LOW);
  38.   digitalWrite(b,LOW);
  39.     digitalWrite(c,LOW);
  40.     digitalWrite(d,LOW);
  41.   digitalWrite(e,HIGH);
  42.   digitalWrite(f,HIGH);
  43.     digitalWrite(g,LOW);
  44.   digitalWrite(dp,HIGH);
  45. }
  46. //显示数字4
  47. void digital_4(void)
  48. {
  49.   digitalWrite(c,LOW);
  50.   digitalWrite(b,LOW);
  51.   digitalWrite(f,LOW);
  52.   digitalWrite(g,LOW);
  53.   digitalWrite(dp,HIGH);
  54.   digitalWrite(a,HIGH);
  55.   digitalWrite(e,HIGH);
  56.   digitalWrite(d,HIGH);   
  57. }
  58. //显示数字5
  59. void digital_5(void)
  60. {
  61.   digitalWrite(a,LOW);
  62.   digitalWrite(b,HIGH);
  63.     digitalWrite(c,LOW);
  64.     digitalWrite(d,LOW);
  65.   digitalWrite(e,HIGH);
  66.   digitalWrite(f,LOW);
  67.     digitalWrite(g,LOW);
  68.   digitalWrite(dp,HIGH);
  69. }
  70. //显示数字6
  71. void digital_6(void)
  72. {
  73.   digitalWrite(a,LOW);
  74.   digitalWrite(b,HIGH);
  75.     digitalWrite(c,LOW);
  76.     digitalWrite(d,LOW);
  77.   digitalWrite(e,LOW);
  78.   digitalWrite(f,LOW);
  79.     digitalWrite(g,LOW);
  80.   digitalWrite(dp,HIGH);
  81. }
  82. //显示数字7
  83. void digital_7(void)
  84. {
  85.   digitalWrite(a,LOW);
  86.   digitalWrite(b,LOW);
  87.     digitalWrite(c,LOW);
  88.     digitalWrite(d,HIGH);
  89.   digitalWrite(e,HIGH);
  90.   digitalWrite(f,HIGH);
  91.     digitalWrite(g,HIGH);
  92.   digitalWrite(dp,HIGH);
  93. }
  94. //显示数字8
  95. void digital_8(void)
  96. {
  97.   unsigned char j;
  98.   for(j=6;j<=13;j++)
  99.     digitalWrite(j,LOW);
  100.   digitalWrite(dp,HIGH);
  101. }
  102. //显示数字9
  103. void digital_9(void)
  104. {
  105.   digitalWrite(a,LOW);
  106.   digitalWrite(b,LOW);
  107.     digitalWrite(c,LOW);
  108.     digitalWrite(d,LOW);
  109.   digitalWrite(e,HIGH);
  110.   digitalWrite(f,LOW);
  111.     digitalWrite(g,LOW);
  112.   digitalWrite(dp,HIGH);
  113. }
  114. //显示数字0
  115. void digital_0(void)
  116. {
  117.   digitalWrite(a,LOW);
  118.   digitalWrite(b,LOW);
  119.     digitalWrite(c,LOW);
  120.     digitalWrite(d,LOW);
  121.   digitalWrite(e,LOW);
  122.   digitalWrite(f,LOW);
  123.     digitalWrite(g,HIGH);
  124.   digitalWrite(dp,HIGH);
  125. }
  126. void setNum(int n){
  127.   switch(n){
  128.     case 1:
  129.     digital_1();
  130.     break;
  131.     case 2:
  132.     digital_2();
  133.     break;
  134.     case 3:
  135.     digital_3();
  136.     break;
  137.     case 4:
  138.     digital_4();
  139.     break;
  140.     case 5:
  141.     digital_5();
  142.     break;
  143.     case 6:
  144.     digital_6();
  145.     break;
  146.     case 7:
  147.     digital_7();
  148.     break;
  149.     case 8:
  150.     digital_8();
  151.     break;
  152.     case 9:
  153.     digital_9();
  154.     break;
  155.     case 0:
  156.     digital_0();
  157.     break;
  158.     };
  159.   }
  160. void setup()
  161. {
  162.   int i;//定义变量
  163.   for(i=6;i<=13;i++)
  164.     pinMode(i,OUTPUT);//设置4~11引脚为输出模式
  165. }
  166. void loop()
  167. {  
  168.   while(1)
  169.   {
  170.     int i=0;
  171.     for(i=0;i<=1000;i++){
  172.       if(i<10){
  173.     digitalWrite(5,HIGH);
  174.     setNum(i);
  175.     delay(100);
  176.     }
  177.     else if(i<100){
  178.     digitalWrite(5,HIGH);
  179.     digitalWrite(4,LOW);
  180.     setNum(i%10);
  181.     delay(30);
  182.     digitalWrite(5,LOW);
  183.     digitalWrite(4,HIGH);
  184.     setNum(i/10);
  185. //    delay(2);
  186.     delay(100);
  187.       }
  188.       }
  189. //    digital_1();//数字1
  190. //    delay(2000);//延时2s
  191. //    digital_2();
  192. //    delay(2000);
  193. //    digital_3();
  194. //    delay(2000);
  195. //    digital_4();
  196. //    delay(2000);
  197. //    digital_5();
  198. //    delay(2000);
  199. //    digital_6();
  200. //    delay(2000);
  201. //    digital_7();
  202. //    delay(2000);
  203. //    digital_8();
  204. //    delay(2000);   
  205. //    digital_9();
  206. //    delay(2000);   
  207. //    digital_0();
  208. //    delay(2000);   
  209.   }
  210. }
复制代码


上面是我试验视频效果,求高手解答疑惑。
回复

使用道具 举报

发表于 2016-1-12 09:07:01 | 显示全部楼层
数码管刷新频率和持续时间都必须合适。但你这种情况属于驱动电流不够。7段同时亮亮度会低,只亮2段亮度会高。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-12 16:11:53 | 显示全部楼层
164335413 发表于 2016-1-12 09:07
数码管刷新频率和持续时间都必须合适。但你这种情况属于驱动电流不够。7段同时亮亮度会低,只亮2段亮度会高 ...

我加了220的电阻,因为看购买的原件资料里就这么加的,具体这个还不太懂,刚开始玩这东西,怕烧元器件,我们这边不好配,所以我想问的是,不加电子可以么?直接连,如果可以的话,我就把电阻去掉,再设置一下代码看看
回复 支持 反对

使用道具 举报

发表于 2016-1-12 21:28:43 | 显示全部楼层
最好用驱动芯片驱动,Arduino毕竟不能驱动这么多二极管正常亮。
你可以四位串电阻,而不是8段串电阻。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 13:30 , Processed in 0.062470 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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