极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 38957|回复: 6

74HC595实现四位数码管显示

[复制链接]
发表于 2013-6-3 17:51:25 | 显示全部楼层 |阅读模式
本帖最后由 、六弦 于 2013-6-3 18:00 编辑

今天做了个数码管的显示,利用串行转并行的74hc595来驱动四个数码管,用arduino的定时器做了一个时钟,具体实现的功能是:串口与数码管同步时钟,利用串口发送时间数据可以调时。没有数码管也可以下载代码,从串口看输出时钟哦,也可以发送调时指令。(手机像素不好,大家将就着看看吧)。

  1. //*************************************************************
  2. // 实现功能:数码管显示时钟,通过串口设置时间(串口同步时钟)。
  3. // 1.串口波特率设置为:9600
  4. // 2.设置时间格式: Txxxxxx.  例:12:34:56   发送:T123456
  5. //*************************************************************

  6. #include <TimerOne.h>
  7. #define uchar unsigned char
  8. #define SI_H  digitalWrite(4, HIGH)
  9. #define SI_L  digitalWrite(4, LOW);
  10. #define RCK_H digitalWrite(5, HIGH);
  11. #define RCK_L digitalWrite(5, LOW);
  12. #define SCK_H digitalWrite(6, HIGH);
  13. #define SCK_L digitalWrite(6, LOW);
  14. #define CS_H  digitalWrite(7, HIGH);
  15. #define CS_L  digitalWrite(7, LOW);

  16. uchar second,minute,hour;
  17. String Rx = "";
  18. uchar count[] =
  19. {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

  20. void port_init(void)
  21. {
  22.    pinMode(4, OUTPUT);
  23.    pinMode(5, OUTPUT);
  24.    pinMode(6, OUTPUT);
  25.    pinMode(7, OUTPUT);
  26.    
  27.    pinMode(8, OUTPUT);
  28.    pinMode(9, OUTPUT);
  29.    pinMode(10, OUTPUT);
  30.    pinMode(11, OUTPUT);
  31. }

  32. //num =  0 / 1 / 2 / 3
  33. //mode = HIGH -> open / LOW -> close
  34. void SMG_select(uchar num,uchar mode)
  35. {
  36.   if(num<4)
  37.   {
  38.       switch(num)
  39.       {
  40.          case 0: num = 8; break;  
  41.          case 1: num = 9; break;
  42.          case 2: num = 10;break;
  43.          case 3: num = 11;break;
  44.       }
  45.       digitalWrite(num,mode);
  46.   }
  47. }

  48. void write_data(uchar data)
  49. {
  50.   uchar i;
  51.   CS_H;
  52.   for(i=0;i<8;i++)
  53.   {
  54.    if((data&0x80)==0x80)  SI_H;
  55.    else                   SI_L;  
  56.    SCK_H;
  57.    delayMicroseconds(20);
  58.    SCK_L;
  59.    data=data<<1;  
  60.   }
  61.   RCK_L;
  62.   delay(1);
  63.   RCK_H;
  64.   CS_L;
  65. }

  66. void set_time()
  67. {
  68.     while(Serial.available() >0)  
  69.     {
  70.         Rx += char( Serial.read() );
  71.         delay(2);
  72.     }
  73.    
  74.     if (Rx.length() >0)
  75.     {
  76.         if(Rx[0]==84)
  77.         {
  78.             hour   = (Rx[1]-0x30)*10 + (Rx[2]-0x30);
  79.             minute = (Rx[3]-0x30)*10 + (Rx[4]-0x30);
  80.             second = (Rx[5]-0x30)*10 + (Rx[6]-0x30);
  81.         }
  82.         Serial.println(" -----------------------");
  83.         Serial.print("|  Set Time: ");
  84.         Serial.print(hour,DEC);
  85.         Serial.print(":");
  86.         Serial.print(minute,DEC);
  87.         Serial.print(":");
  88.         Serial.print(second,DEC);
  89.         Serial.println("   |");
  90.         Serial.println(" -----------------------");
  91.         Rx = "";   
  92.     }
  93. }

  94. void setup()
  95. {
  96.   Serial.begin(9600);
  97.   port_init();
  98. // pinMode(13, OUTPUT);
  99.   Timer1.initialize(1000000);
  100.   Timer1.attachInterrupt( timerIsr );
  101. }

  102. void timerIsr()
  103. {
  104.     //digitalWrite( 13, digitalRead( 13 ) ^ 1 );
  105.     second++;
  106.     if(second > 59)
  107.     {
  108.       second = 0;
  109.       minute ++;
  110.       if(minute > 59)
  111.       {
  112.         minute = 0;
  113.         hour ++;
  114.         if(hour > 23)   hour = 0;
  115.       }
  116.     }
  117.     Serial.print("Time :  ");
  118.     Serial.print(hour,DEC);
  119.     Serial.print(":");
  120.     Serial.print(minute,DEC);
  121.     Serial.print(":");
  122.     Serial.println(second,DEC);
  123. }

  124. void loop()
  125. {
  126.     set_time();
  127.    
  128.     SMG_select(0,HIGH);
  129.     write_data(count[hour/10]);
  130.     delayMicroseconds(400);
  131.     SMG_select(0,LOW);
  132.    
  133.     SMG_select(1,HIGH);
  134.     if(second%2) write_data(count[hour%10] + 0x80);
  135.     else           write_data(count[hour%10]);
  136.     delayMicroseconds(400);
  137.     SMG_select(1,LOW);
  138.    
  139.     SMG_select(2,HIGH);
  140.     write_data(count[minute/10]);
  141.     delayMicroseconds(400);
  142.     SMG_select(2,LOW);
  143.    
  144.     SMG_select(3,HIGH);
  145.     write_data(count[minute%10]);
  146.     delayMicroseconds(400);
  147.     SMG_select(3,LOW);
  148. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-6-3 20:15:23 | 显示全部楼层
用595驱动4位太勉强了,仔细看第四位数码管和第三位的数字都要混在一起了!595驱动2位倒是不错
回复 支持 反对

使用道具 举报

发表于 2013-6-19 22:10:06 | 显示全部楼层
应该是ULN2003分时驱动,这样没问题的
回复 支持 反对

使用道具 举报

发表于 2013-6-20 21:19:25 | 显示全部楼层
FoieDEEEE_仲敬 发表于 2013-6-3 20:15
用595驱动4位太勉强了,仔细看第四位数码管和第三位的数字都要混在一起了!595驱动2位倒是不错

对,感觉不是很实用,如果增加其它的程序就会闪的很厉害.就算最好情况下显示效果都不是很好.
回复 支持 反对

使用道具 举报

发表于 2014-2-28 16:50:33 | 显示全部楼层
这个不太明白,还要在研究下。
回复 支持 反对

使用道具 举报

发表于 2015-10-13 11:13:10 | 显示全部楼层
FoieDEEEE_仲敬 发表于 2013-6-3 20:15
用595驱动4位太勉强了,仔细看第四位数码管和第三位的数字都要混在一起了!595驱动2位倒是不错

第四位数码管和第三位的数字混在一起了,是因为每移位8bit就锁存一次,因此段选信号会在瞬间作为段显信号,所以明明不该亮起来的段会看起来微微亮,解决方法是段选和段显信号都发送完成之后再锁存。
回复 支持 反对

使用道具 举报

发表于 2016-3-2 16:31:57 | 显示全部楼层
为什么不用连个595来驱动4位的呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 21:17 , Processed in 0.039675 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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