一.相关芯片
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
2个8位移位寄存器驱动4位数码管,布布扣,bubuko.com
原文:http://www.cnblogs.com/leaveswave/p/3618047.html