2个8位移位寄存器驱动4位数码管

一.相关芯片

1.74HC595N * 2

2. Arduino Uno

3. 4位8段数码管

二.关于引脚

1.74HC595N引脚

  基本上引脚就是如此,两块级联的方法是,第一块的9脚(串行输出)接到第二块的14脚(串行输入),ST_CP(latch)和SH_CP(clock)两块板分别对应接在一起

 

 

2.数码管

一位数码管每个段的编号一般如下图,如果不知道如何测引脚, 见引用1

4位数码管

引脚图基本如下所示,dp指的是右下角的点,因为数码管是共阴极的,所以如果要显示多个位数的话,需要使用多路复用的技术

三.代码

程序实现从9999一直减少到0,刚测试的时候发现对于没有亮的段,时常随机莫名的闪动弱光,后来发现原来是电压不够的原因,之前用的电压是3.3V,后来改用5V就就没问题了,

#include <TimerOne.h>

#define NUM_0   B11111100
#define NUM_1   B01100000
#define NUM_2   B11011010
#define NUM_3   B11110010
#define NUM_4   B01100110
#define NUM_5   B10110110
#define NUM_6   B10111110
#define NUM_7   B11100000
#define NUM_8   B11111110
#define NUM_9   B11100110

#define NUM_NULL   B0

int nLatchPin = 8;
int nClockPin = 12;
int nDataPin = 13;

int nCurInt = 9999;
void setup()
{
  pinMode(nLatchPin, OUTPUT);
  pinMode(nClockPin, OUTPUT);
  pinMode(nDataPin, OUTPUT);

  Timer1.initialize(10000);
  Timer1.attachInterrupt( Update ); // attach the service routine here
}

void Update()
{
  LightUpInt(nCurInt, 10);
}

void loop()
{
  delay(100);
  
  if (nCurInt > 0)
    nCurInt--;
}

byte GetNumberDefine(byte nNumber0_9)
{
  switch(nNumber0_9)
  {
    case 0: return NUM_0;
    case 1: return NUM_1;
    case 2: return NUM_2;
    case 3: return NUM_3;
    case 4: return NUM_4;
    case 5: return NUM_5;
    case 6: return NUM_6;
    case 7: return NUM_7;
    case 8: return NUM_8;
    case 9: return NUM_9;
  }  
  return 0;
}

// Light Up an integer, It can be more than 9, such as 123, but must less than 999
void LightUpInt(int nNumbers, int nMicrosecond)
{
  int nLow = 0;
  int nCount = 1;
  do{
    nLow = nNumbers % 10;
    nNumbers = nNumbers / 10;
    LightUpNumberOffset(GetNumberDefine(nLow), nCount);
    if (nMicrosecond > 0)
      delayMicroseconds(nMicrosecond);
    nCount++;
  }while(nNumbers > 0 && nCount < 5);
  
  if (nMicrosecond > 0)
    LightUpNumberOffset(NUM_NULL, 0);
}

void LightUpNumberOffset(byte dataOut, byte offset/*0 if light off, 1 - 4 if light up*/)
{
  digitalWrite(nLatchPin, LOW);  
  if (offset == 0)
  {
    LightUpOneDigital(0);
    LightUpOneDigital(dataOut);
  }
  else
  {
    LightUpOneDigital(~(1 << (3 + offset)));
    LightUpOneDigital(dataOut);
  }
  digitalWrite(nLatchPin, HIGH);
}

void LightUpOneDigital(byte dataOut)
{
  digitalWrite(nDataPin, LOW);
  digitalWrite(nClockPin, LOW);
  
  boolean bStatePin;
  
  for (int i=0; i<=7; i++)
  {        
    if (dataOut & (1 << i))
      bStatePin = HIGH;
    else
      bStatePin = LOW;
    
    digitalWrite(nClockPin, LOW);
    digitalWrite(nDataPin, bStatePin);
    digitalWrite(nClockPin, HIGH);
    
    //digitalWrite(nDataPin, LOW);
  }
  
  digitalWrite(nClockPin, LOW);
}

 

引用:

1.数码管、LED点阵的测试方法,http://v.youku.com/v_show/id_XMTI1Nzc3OTUy.html

posted @ 2014-03-22 20:51  叶浪听风  阅读(1988)  评论(0编辑  收藏  举报