极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 弘毅

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

  [复制链接]
发表于 2012-4-15 14:12:36 | 显示全部楼层
请教一下,如果是共阴的数码管,是不是需要在除共阴外每个管脚上都串限流电阻?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-15 14:31:21 | 显示全部楼层
keen 发表于 2012-4-15 14:12
请教一下,如果是共阴的数码管,是不是需要在除共阴外每个管脚上都串限流电阻?


在共阴端串联也可以,只不过这种方法会导致不同数字因为亮的led数量不同,电流大小有区别,所以亮度不均匀。

除共阴以外其他管脚都串联电阻,这种方法虽然看的用的电阻多。但是不会产生不同数值因为亮的led多少不一样,亮度不均匀问题,推荐这种方法。
回复 支持 反对

使用道具 举报

发表于 2012-4-16 00:06:49 | 显示全部楼层
弘毅 发表于 2012-4-15 14:31
在共阴端串联也可以,只不过这种方法会导致不同数字,因为亮的led不同,电流大小有区别,所以亮度不军用。 ...

非常感谢!!
回复 支持 反对

使用道具 举报

发表于 2012-7-27 01:36:41 | 显示全部楼层
手里只有共阴的,找到的资料又不匹配...控制变量法调试了好久才搞定...

话说阴极共阻的话对亮度影响不仔细看的话基本看不出来,我共的是100欧的
回复 支持 反对

使用道具 举报

发表于 2012-7-27 02:24:54 | 显示全部楼层
纯小白贴段代码,共阴,型号d5611

觉得楼主关数码管的方式有点麻烦,还要加循环...导致像我这类的小白各种混乱....

我直接新定义一个通用的clearall 来关掉全部的数码管,之前定义各个数字就可以只顾亮的了,然后在loop里每次调用亮某个数字延时之后跟一个clearall就可以了。
  1. int a=7;
  2. int b=6;
  3. int c=4;
  4. int d=11;
  5. int e=12;
  6. int f=9;
  7. int g=10;
  8. int dp=5;

  9. void d_1 (void)   
  10. {
  11.   char j;
  12.   digitalWrite ( b, HIGH);
  13.   digitalWrite ( c, HIGH);
  14. }

  15. void d_2 (void)  
  16. {
  17.   char j;
  18.   digitalWrite ( a, HIGH);
  19.   digitalWrite ( b, HIGH);
  20.   digitalWrite ( d, HIGH);
  21.   digitalWrite ( e, HIGH);
  22.   digitalWrite ( g, HIGH);
  23. }

  24. void d_3 (void)
  25. {
  26.   char j ;
  27.   digitalWrite ( a, HIGH);
  28.   digitalWrite ( b, HIGH);
  29.   digitalWrite ( c, HIGH);
  30.   digitalWrite ( d, HIGH);
  31.   digitalWrite ( g, HIGH);
  32. }

  33. void d_4 (void)
  34. {
  35.   char j ;
  36.   digitalWrite ( b, HIGH);
  37.   digitalWrite ( c, HIGH);
  38.   digitalWrite ( f, HIGH);
  39.   digitalWrite ( g, HIGH);
  40. }

  41. void d_5 (void)
  42. {
  43.   char j ;
  44.   digitalWrite ( a, HIGH);
  45.   digitalWrite ( f, HIGH);
  46.   digitalWrite ( c, HIGH);
  47.   digitalWrite ( d, HIGH);
  48.   digitalWrite ( g, HIGH);
  49. }

  50. void d_6 (void)
  51. {
  52.   char j ;
  53.   digitalWrite ( a, HIGH);
  54.   digitalWrite ( e, HIGH);
  55.   digitalWrite ( c, HIGH);
  56.   digitalWrite ( d, HIGH);
  57.   digitalWrite ( g, HIGH);
  58.   digitalWrite ( f, HIGH);
  59. }

  60. void d_7 (void)
  61. {
  62.   char j ;
  63.   digitalWrite ( a, HIGH);
  64.   digitalWrite ( b, HIGH);
  65.   digitalWrite ( c, HIGH);
  66. }

  67. void d_8 (void)
  68. {
  69.   char j ;
  70.   digitalWrite ( a, HIGH);
  71.   digitalWrite ( b, HIGH);
  72.   digitalWrite ( c, HIGH);
  73.   digitalWrite ( d, HIGH);
  74.   digitalWrite ( e, HIGH);
  75.   digitalWrite ( f, HIGH);
  76.   digitalWrite ( g, HIGH);
  77. }

  78. void d_9 (void)
  79. {
  80.   char j ;
  81.   digitalWrite ( a, HIGH);
  82.   digitalWrite ( b, HIGH);
  83.   digitalWrite ( c, HIGH);
  84.   digitalWrite ( d, HIGH);
  85.   digitalWrite ( g, HIGH);
  86.   digitalWrite ( f, HIGH);
  87. }

  88. void d_0 (void)
  89. {
  90.   char j ;
  91.   digitalWrite ( a, HIGH);
  92.   digitalWrite ( b, HIGH);
  93.   digitalWrite ( c, HIGH);
  94.   digitalWrite ( d, HIGH);
  95.   digitalWrite ( e, HIGH);
  96.   digitalWrite ( f, HIGH);
  97. }

  98. void clearall()  //关闭全部的管子
  99. {
  100.   for ( int k = 4; k <= 12; k++)
  101.     digitalWrite( k, LOW);
  102. }
  103.   
  104. void setup ()
  105. {
  106.   for ( int i = 4; i <= 12; i++)
  107.     pinMode ( i, OUTPUT);
  108.   pinMode ( 8, INPUT);
  109. }

  110. void loop ()
  111. {
  112.   clearall();  //先确保都是关着的
  113.   delay(50);  //延迟可要可不要
  114.   
  115.   d_1();
  116.   delay(500);
  117.   clearall();
  118.   delay(50);
  119.   
  120.   d_2();
  121.   delay(500);
  122.   clearall();
  123.   delay(50);
  124.   
  125.   d_3();
  126.   delay(500);
  127.   clearall();
  128.   delay(50);
  129.   
  130.   d_4();
  131.   delay(500);
  132.   clearall();
  133.   delay(50);
  134.   
  135.   d_5();
  136.   delay(500);
  137.   clearall();
  138.   delay(50);
  139.   
  140.   d_6();
  141.   delay(500);  
  142.   clearall();
  143.   delay(50);
  144.   
  145.   d_7();
  146.   delay(500);
  147.   clearall();
  148.   delay(50);
  149.   
  150.   d_8();
  151.   delay(500);
  152.   clearall();
  153.   delay(50);

  154.   d_9();
  155.   delay(500);
  156.   clearall();
  157.   delay(50);
  158.   
  159.   d_0();
  160.   delay(500);
  161.   clearall();
  162.   delay(50);
  163. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-27 08:56:24 | 显示全部楼层
Uduse 发表于 2012-7-27 02:24
纯小白贴段代码,共阴,型号d5611

觉得楼主关数码管的方式有点麻烦,还要加循环...导致像我这类的小白各 ...

这个代码比我那个好多了
回复 支持 反对

使用道具 举报

发表于 2012-9-28 20:53:27 | 显示全部楼层
不知道怎么回事,我把程序里的HIGH和LOW互换后才正确显示,是因为数码管是共阴?

另附一张数码管的A-G的图

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-29 18:46:50 | 显示全部楼层
ttyp 发表于 2012-9-28 20:53
不知道怎么回事,我把程序里的HIGH和LOW互换后才正确显示,是因为数码管是共阴?

另附一张数码管的A-G的 ...

嗯,共阴的原因。
回复 支持 反对

使用道具 举报

发表于 2012-12-5 16:43:52 | 显示全部楼层
byte code[]= {0x84,0x9F,0xC8,0x8A,0x93,0xA2,0xA0,0x8F,0x80,0x82};

void setup()
{
for(byte j=4;j<12;j++)
{
  pinMode(j, OUTPUT);   
}
}
   
void sevenSegWrite(byte digit)
{
byte pin = 11;
  for (byte i=0;i<8;i++)
  {
    digitalWrite(pin, bitRead(code[digit],i));
    pin--;
  }
}

void loop() {   //设置显示效果为从9开始倒数


  for (byte count = 0; count < 10; count++) {
   delay(500);
   sevenSegWrite(count);
  }
  delay(1000);
}

我用proteus仿真,为什么从0到9能循环计数,但是把循环体改成从9到0就只能循环一次然后停止
回复 支持 反对

使用道具 举报

发表于 2012-12-5 17:05:41 | 显示全部楼层
void loop() {   //设置显示效果为从9开始倒数


  for (byte count = 9; count >= 0;count--) {
   delay(500);
   sevenSegWrite(count);
  }
}
就是这样
回复 支持 反对

使用道具 举报

发表于 2013-4-16 11:03:24 | 显示全部楼层
我学的Linux 下X86.的C 弄得我看什么C都是略懂。。有些细节弄不明白啊 怎么办
回复 支持 反对

使用道具 举报

发表于 2013-5-29 00:46:08 | 显示全部楼层
陈冬冬 发表于 2012-1-17 18:04
void sevenSegWrite(byte digit) {  //设置通过数组控制引脚开关,顺序为4-11号端口
  byte pin = 4;
  f ...

void sevenSegWrite(int digit) {  //设置通过数组控制引脚开关,顺序为4-11号端口
  int pin = 4;
  for (int segCount = 0; segCount <=7; segCount++) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {   //设置显示效果为从9开始倒数
  for (int count =9; count >=0; count--) {
   delay(1000);
   sevenSegWrite(count);
  }
  delay(2000);
}这个比较符合我的思维习惯
回复 支持 反对

使用道具 举报

发表于 2013-5-29 00:49:12 | 显示全部楼层
之之风 发表于 2013-5-29 00:46
void sevenSegWrite(int digit) {  //设置通过数组控制引脚开关,顺序为4-11号端口
  int pin = 4;
  f ...

就是不知道用byte比起int有何优势
用byte的话0--就死机了
回复 支持 反对

使用道具 举报

发表于 2013-5-29 01:25:39 | 显示全部楼层
玄冰之神 发表于 2013-4-16 11:03
我学的Linux 下X86.的C 弄得我看什么C都是略懂。。有些细节弄不明白啊 怎么办

找本 C程序设计语言  学一遍.http://book.douban.com/subject/1139336/
回复 支持 反对

使用道具 举报

发表于 2013-5-29 09:03:33 | 显示全部楼层
伯德 发表于 2013-5-29 01:25
找本 C程序设计语言  学一遍.http://book.douban.com/subject/1139336/

这本书我有实体书。。现在想学C++有好书介绍么?
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-5 13:53 , Processed in 0.045561 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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