极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 31249|回复: 5

[学习笔记]arduino用2个74HC595点亮2个4位共阳数码管

[复制链接]
发表于 2013-10-7 02:41:20 | 显示全部楼层 |阅读模式
本帖最后由 庚影! 于 2013-10-7 02:49 编辑

开始玩arduino也有2个月了 从什么都不知道到现在能做点东西也基本全靠迷你强和论坛里分享经验的朋友
这个我看论坛里面还没有现成的代码 于是国庆就蹲在家里琢磨这玩意。
因为没有单片机基础74HC595的用法也是慢慢琢磨的,所以各种BUG各种低效率就不要吐槽了。
希望对大家有一定帮助。

arduino和74HC595的连接方法在帖子里有很多 我就不贴了

这个是测试结果


这个是网上淘到的空板
一个从没有摸过烙铁的美术生在浪费了1卷锡丝后才敢对贴片元件下手 然后又浪费1个板子后才焊好(第一个把IC焊反了……)


这个是上面那个淘宝卖价给的74HC595的电路图

下面就是代码了
  1. //VCC -- 5V
  2. //GND -- GND
  3. //DS -- A0
  4. //ST_CP -- A1
  5. //SH_CP -- A2


  6. int latchPin = A1;//ST_CP
  7. int clockPin = A2;//SH_CP
  8. int dataPin = A0; //DS
  9. //这里定义了74HC595的那三个脚


  10. void setup ()
  11. {
  12.   pinMode(latchPin,OUTPUT);
  13.   pinMode(clockPin,OUTPUT);
  14.   pinMode(dataPin,OUTPUT);
  15.   //让74HC595的三个脚都是输出状态
  16. }

  17. //这个函数是显示一个数用的disNum(显示的数,显示的位,是否有小数点(1为有小数点))
  18. void disNum(int Num_Qua, int Num_Pos, int Num_Dec)
  19. {
  20.     int Num_Qua_B = 0;
  21.     int Num_Pos_B = 0;
  22.     switch (Num_Qua)
  23.     {
  24.                 case 0:Num_Qua_B = 192;break;
  25.                 case 1:Num_Qua_B = 249;break;
  26.                 case 2:Num_Qua_B = 164;break;
  27.                 case 3:Num_Qua_B = 176;break;
  28.                 case 4:Num_Qua_B = 153;break;
  29.                 case 5:Num_Qua_B = 146;break;
  30.                 case 6:Num_Qua_B = 130;break;
  31.                 case 7:Num_Qua_B = 248;break;
  32.                 case 8:Num_Qua_B = 128;break;
  33.                 case 9:Num_Qua_B = 144;break;
  34.                 default: Num_Qua_B = 255;break;
  35.     };
  36.         //这个值转换为2进制 为一个数abcdefg的需要亮的针脚。
  37.         switch (Num_Pos)
  38.     {
  39.                 case 1:Num_Pos_B = 1;break;
  40.                 case 2:Num_Pos_B = 2;break;
  41.                 case 3:Num_Pos_B = 4;break;
  42.                 case 4:Num_Pos_B = 8;break;
  43.                 case 5:Num_Pos_B = 16;break;
  44.                 case 6:Num_Pos_B = 32;break;
  45.                 case 7:Num_Pos_B = 64;break;
  46.                 case 8:Num_Pos_B = 128;break;
  47.                 default: Num_Pos_B = 0;break;
  48.     };
  49.         //这个值转换为2进制 为当前点亮的位数。
  50.     if (Num_Dec == 1)
  51.     {
  52.         Num_Qua_B = Num_Qua_B + 128;
  53.     };
  54.         //128是Q7端口2进制值转换为10进制的结果。
  55.     digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
  56.     int L = Num_Qua_B; int R = Num_Pos_B;
  57.     shiftOut(dataPin,clockPin,MSBFIRST,R);
  58.     shiftOut(dataPin,clockPin,MSBFIRST,L);
  59.     digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
  60.         //上面是74HC595的输出方式 每个74HC595能接受一个8位的2进制数值来电灯 第一个74HC595再次输入一个8位的数值他会把他现在的数值传给第二个串联的74HC595。
  61.         delayMicroseconds(100);
  62. }
  63. //这个是显示数用的函数
  64. void showNum(double number)//注意用double,int不够长了。
  65. {
  66.         long  num = number;
  67.         int ShowDec [8];
  68.         for (int x = 1; x < 9; x++)
  69.         {
  70.                 ShowDec [x] = 0;
  71.         }
  72.         //创建显示小数点的数组,0为不显示,1为显示
  73.        
  74.         if (num  < 10000000){
  75.         if (num  < 1000000){num = number*100; ShowDec[6]=1;ShowDec[7]=0;}
  76.                 else{
  77.                 num = number*10; ShowDec[7]=1;
  78.                 }
  79.         }
  80.         //简单的2位小数显示
  81.        



  82.         int ShowNumber [8];
  83.         ShowNumber[1] = (num/10000000)%10;
  84.         ShowNumber[2]=  (num/1000000)%10;
  85.         ShowNumber[3] = (num/100000)%10;
  86.         ShowNumber[4] = (num/10000)%10;
  87.         ShowNumber[5] = (num/1000)%10;
  88.         ShowNumber[6] = (num/100)%10;
  89.         ShowNumber[7] = (num/10)%10;
  90.         ShowNumber[8]= (num/1)%10;
  91.         //取得每一位的数。然后存在一个数组里。


  92.        
  93.         int dectest = 0;
  94.         for (int x = 1; x<8; x++)
  95.         {
  96.                 if ((dectest == 0)and(ShowNumber[x] == 0))
  97.                 {
  98.                         ShowNumber[x] = 11;
  99.                 }
  100.                 else
  101.                 {
  102.                         dectest = 1;
  103.                 }
  104.         }
  105.         //左侧开始检查是否有0 如果有就不显示(在显示单个数的函数里面设置了如果不是1-9,那么就不显示东西)


  106.   disNum(ShowNumber[1],1,ShowDec[1]);
  107.   disNum(ShowNumber[2],2,ShowDec[2]);
  108.   disNum(ShowNumber[3],3,ShowDec[3]);
  109.   disNum(ShowNumber[4],4,ShowDec[4]);
  110.   disNum(ShowNumber[5],5,ShowDec[5]);
  111.   disNum(ShowNumber[6],6,ShowDec[6]);
  112.   disNum(ShowNumber[7],7,ShowDec[7]);
  113.   disNum(ShowNumber[8],8,ShowDec[8]);
  114.         //依次显示数字,因为LED的闪烁很快,所以人眼无法识别闪烁。
  115. }

  116. void loop()
  117. {
  118.     showNum(13456.8);//相对简单的函数调用
  119. }
复制代码



顺便我有几个问题
1、LED这样用脉冲电会不会被闪坏?

2、数码管明显不能用delay(),如果我有个采集器 每10秒采集一次应该如何写这块代码?弄一个计时器?

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-10-7 12:43:56 | 显示全部楼层
1、应该不会,它本来设计就是这么工作的。

2、用Millis()自己做判断
回复 支持 反对

使用道具 举报

发表于 2013-10-9 16:00:59 | 显示全部楼层
本帖最后由 thomas 于 2013-10-9 16:02 编辑

1.用A口做输出?口不够用吗?

2.限流电阻接哪儿了?
回复 支持 反对

使用道具 举报

发表于 2015-7-17 19:38:39 | 显示全部楼层
问下  为什么用你的程序烧进单片机里面数码管会显示 86431320啊最近刚开始学求指教

void loop()
{
    showNum(86431317);//相对简单的函数调用
}
回复 支持 反对

使用道具 举报

发表于 2015-7-25 09:56:09 | 显示全部楼层
void showNum(double number)//注意用double,int不够长了。
{
        long  num = number;
你这个  double number 不能这么写啊  这样写  结果就是数码管显示 比如我说的
void loop()
{
    showNum(86431317);//相对简单的函数调用
}最后的17 变成  20了   应该吧double number 也写成 long 就不会错误了
回复 支持 反对

使用道具 举报

发表于 2017-8-6 19:49:14 | 显示全部楼层
      楼主发帖的程序非常好用,我用的是两个共阴四位数码管,将程序中的  switch (Num_Qua)和 switch (Num_Pos) 选择语句中十进制数均取补数即可,例如:原192,将其改为63(255-192=63);0改为255。
      有了这个程序,再加入DS1307就可以显示日期和时间了。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 21:21 , Processed in 0.044641 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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