[学习笔记]arduino用2个74HC595点亮2个4位共阳数码管
本帖最后由 庚影! 于 2013-10-7 02:49 编辑开始玩arduino也有2个月了 从什么都不知道到现在能做点东西也基本全靠迷你强和论坛里分享经验的朋友
这个我看论坛里面还没有现成的代码 于是国庆就蹲在家里琢磨这玩意。
因为没有单片机基础74HC595的用法也是慢慢琢磨的,所以各种BUG各种低效率就不要吐槽了。
希望对大家有一定帮助。
arduino和74HC595的连接方法在帖子里有很多 我就不贴了
这个是测试结果
这个是网上淘到的空板
一个从没有摸过烙铁的美术生在浪费了1卷锡丝后才敢对贴片元件下手 然后又浪费1个板子后才焊好(第一个把IC焊反了……)
这个是上面那个淘宝卖价给的74HC595的电路图
下面就是代码了
//VCC -- 5V
//GND -- GND
//DS -- A0
//ST_CP -- A1
//SH_CP -- A2
int latchPin = A1;//ST_CP
int clockPin = A2;//SH_CP
int dataPin = A0; //DS
//这里定义了74HC595的那三个脚
void setup ()
{
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
//让74HC595的三个脚都是输出状态
}
//这个函数是显示一个数用的disNum(显示的数,显示的位,是否有小数点(1为有小数点))
void disNum(int Num_Qua, int Num_Pos, int Num_Dec)
{
int Num_Qua_B = 0;
int Num_Pos_B = 0;
switch (Num_Qua)
{
case 0:Num_Qua_B = 192;break;
case 1:Num_Qua_B = 249;break;
case 2:Num_Qua_B = 164;break;
case 3:Num_Qua_B = 176;break;
case 4:Num_Qua_B = 153;break;
case 5:Num_Qua_B = 146;break;
case 6:Num_Qua_B = 130;break;
case 7:Num_Qua_B = 248;break;
case 8:Num_Qua_B = 128;break;
case 9:Num_Qua_B = 144;break;
default: Num_Qua_B = 255;break;
};
//这个值转换为2进制 为一个数abcdefg的需要亮的针脚。
switch (Num_Pos)
{
case 1:Num_Pos_B = 1;break;
case 2:Num_Pos_B = 2;break;
case 3:Num_Pos_B = 4;break;
case 4:Num_Pos_B = 8;break;
case 5:Num_Pos_B = 16;break;
case 6:Num_Pos_B = 32;break;
case 7:Num_Pos_B = 64;break;
case 8:Num_Pos_B = 128;break;
default: Num_Pos_B = 0;break;
};
//这个值转换为2进制 为当前点亮的位数。
if (Num_Dec == 1)
{
Num_Qua_B = Num_Qua_B + 128;
};
//128是Q7端口2进制值转换为10进制的结果。
digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
int L = Num_Qua_B; int R = Num_Pos_B;
shiftOut(dataPin,clockPin,MSBFIRST,R);
shiftOut(dataPin,clockPin,MSBFIRST,L);
digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
//上面是74HC595的输出方式 每个74HC595能接受一个8位的2进制数值来电灯 第一个74HC595再次输入一个8位的数值他会把他现在的数值传给第二个串联的74HC595。
delayMicroseconds(100);
}
//这个是显示数用的函数
void showNum(double number)//注意用double,int不够长了。
{
longnum = number;
int ShowDec ;
for (int x = 1; x < 9; x++)
{
ShowDec = 0;
}
//创建显示小数点的数组,0为不显示,1为显示
if (num< 10000000){
if (num< 1000000){num = number*100; ShowDec=1;ShowDec=0;}
else{
num = number*10; ShowDec=1;
}
}
//简单的2位小数显示
int ShowNumber ;
ShowNumber = (num/10000000)%10;
ShowNumber=(num/1000000)%10;
ShowNumber = (num/100000)%10;
ShowNumber = (num/10000)%10;
ShowNumber = (num/1000)%10;
ShowNumber = (num/100)%10;
ShowNumber = (num/10)%10;
ShowNumber= (num/1)%10;
//取得每一位的数。然后存在一个数组里。
int dectest = 0;
for (int x = 1; x<8; x++)
{
if ((dectest == 0)and(ShowNumber == 0))
{
ShowNumber = 11;
}
else
{
dectest = 1;
}
}
//左侧开始检查是否有0 如果有就不显示(在显示单个数的函数里面设置了如果不是1-9,那么就不显示东西)
disNum(ShowNumber,1,ShowDec);
disNum(ShowNumber,2,ShowDec);
disNum(ShowNumber,3,ShowDec);
disNum(ShowNumber,4,ShowDec);
disNum(ShowNumber,5,ShowDec);
disNum(ShowNumber,6,ShowDec);
disNum(ShowNumber,7,ShowDec);
disNum(ShowNumber,8,ShowDec);
//依次显示数字,因为LED的闪烁很快,所以人眼无法识别闪烁。
}
void loop()
{
showNum(13456.8);//相对简单的函数调用
}
顺便我有几个问题
1、LED这样用脉冲电会不会被闪坏?
2、数码管明显不能用delay(),如果我有个采集器 每10秒采集一次应该如何写这块代码?弄一个计时器? 1、应该不会,它本来设计就是这么工作的。
2、用Millis()自己做判断 本帖最后由 thomas 于 2013-10-9 16:02 编辑
1.用A口做输出?口不够用吗?
2.限流电阻接哪儿了? 问下为什么用你的程序烧进单片机里面数码管会显示 86431320啊最近刚开始学求指教
void loop()
{
showNum(86431317);//相对简单的函数调用
} void showNum(double number)//注意用double,int不够长了。
{
longnum = number;
你这个double number 不能这么写啊这样写结果就是数码管显示 比如我说的
void loop()
{
showNum(86431317);//相对简单的函数调用
}最后的17 变成20了 应该吧double number 也写成 long 就不会错误了 楼主发帖的程序非常好用,我用的是两个共阴四位数码管,将程序中的switch (Num_Qua)和 switch (Num_Pos) 选择语句中十进制数均取补数即可,例如:原192,将其改为63(255-192=63);0改为255。
有了这个程序,再加入DS1307就可以显示日期和时间了。
页:
[1]