万马奔腾 发表于 2013-12-30 12:55:28

2片74HC595驱动4位数码管,怎么不成功?

本帖最后由 万马奔腾 于 2013-12-30 13:17 编辑

/*
2片595驱动4位共阴极数码管调试程序
*/



int clockPin = 2;
int latchPin =3;
int dataPin = 5; //这里定义了那三个脚
//-----------------------------------设置变量
unsigned long i,j,v;         //计时用的变量
long t=1000,x=60000,k=0,l=0,del=1000,jg=55;//t表示秒(初始值为了开头能够看到60:00)x表示分钟 del为减时间间隔调整jg参数
// 调整jg数值实现时间精度调整

void setup()
{               
//数码管接口(74HC595)管脚定义
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT); //让三个脚都是输出状态
delay(4000);
}

void loop()
{
//-----------------------第1位显示数字
clearLEDs();
pick1Number(x/10000);
delayMicroseconds(jg);
//----------------------第2位显示数字
clearLEDs();
pick2Number(x%10000/1000);
delayMicroseconds(jg);
//-------------------时钟点:显示
clearLEDs();
dispDec();
delayMicroseconds(jg);
//--------------------第3位
clearLEDs();
pick3Number(t/10000);
delayMicroseconds(jg);
//--------------------第4位
clearLEDs();
pick4Number(t%10000/1000);
delayMicroseconds(jg);


//-------------时间计算值
if(t>=0 || x!=0)   t--;       //秒钟减1并自动循环
if(t<0&& x!=0)   t=60000;
if(t==60000&&x!=0)x-=1000;      //分钟数减1

}
void pick1Number(int x)   //定义pickNumber(x),其作用是显示数字x
{
switch(x)
{
default:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 1:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 2:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01011011);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 3:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01001111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 4:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01100110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 5:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 6:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 7:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 8:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 9:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011110);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
}
}
void pick2Number(int x)   //定义pickNumber(x),其作用是显示数字x
{
switch(x)
{
default:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 1:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 2:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01011011);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 3:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01001111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 4:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01100110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 5:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 6:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 7:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 8:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 9:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011101);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
}
}
void pick3Number(int x)   //定义pickNumber(x),其作用是显示数字x
{
switch(x)
{
default:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 1:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 2:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01011011);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 3:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01001111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 4:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01100110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 5:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 6:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 7:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 8:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 9:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00011011);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
}
}
void pick4Number(int x)   //定义pickNumber(x),其作用是显示数字x
{
switch(x)
{
default:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 1:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 2:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01011011);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 3:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01001111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 4:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01100110);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 5:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 6:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111101);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 7:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B00000111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 8:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01111111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
case 9:
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,B00010111);//阴极Q7----Q0
    shiftOut(dataPin,clockPin,MSBFIRST,B01101111);//阳极Q7----Q0
    digitalWrite(latchPin,HIGH);
    break;
}
}
void dispDec()//设定开启时钟点:
{
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,MSBFIRST,B00001111);//阴极Q7----Q0
shiftOut(dataPin,clockPin,MSBFIRST,B10000000);//阳极Q7----Q0
digitalWrite(latchPin,HIGH);
}
void clearLEDs()//清屏
{
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,MSBFIRST,B00011111);//阴极Q7----Q0
shiftOut(dataPin,clockPin,MSBFIRST,B00000000);//阳极Q7----Q0
digitalWrite(latchPin,HIGH);
}


主要表现:
1.显示的数值不对 乱码。
2.屏幕闪得比较厉害。

接线示意图:
靠近ARDUINO的595接数码管
Q0----AQ1---BQ2----CQ3---D Q4---E Q5----F Q6---GQ7---:(时钟的阳极)
另一片595接数码管的管脚
Q0--d1Q1---d2 Q2----d3Q3---d4 Q4---d5(时钟点的阴极)

问题是不是驱动电流不够啊!需要ULN2803?

zoologist 发表于 2013-12-30 15:49:21

没搞过,不过建议你先驱动一根根管子试试看能不能找到一定的条件

万马奔腾 发表于 2013-12-30 17:59:26

一根试过了~

pww999 发表于 2013-12-30 22:26:49

本帖最后由 pww999 于 2013-12-30 22:30 编辑

我试过这个可以

http://www.geek-workshop.com/forum.php?mod=viewthread&tid=7415
页: [1]
查看完整版本: 2片74HC595驱动4位数码管,怎么不成功?