前面的博文中我們介紹了一個arduino中用一片595來控制一位數碼管,這裏我們介紹一個595來控制兩位數碼管。兩位數碼管是應用最廣泛的,如交通燈倒計時,計數器等都將用到兩位數碼管。
兩位數碼管的動態顯示機制可以簡單的理解爲交錯顯示,僅僅是我們的視覺停留看起來使我們覺得他們是同時顯示的。聽起來有點複雜吧,這樣吧,我們依然從顯示一位數字開始。然後我們再嘗試顯示兩位靜態的數字,最後我們再來看,兩位數字的動態顯示。
一、顯示一位數字
代碼:
int latchPin=6;
int clockPin=4;
int dataPin=5;
int bitSelect1=2;
int bitSelect2=3;
boolean selectStat=0;
int cseg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0x77,0x7c,?0x39,0x5e,0x79,0x71
int n=0;
void setup () {
// TODO: put your setup code here, to run once:
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(bitSelect1,OUTPUT);
pinMode(bitSelect2,OUTPUT);
}
void loop() {
// TODO: put your main code here, to run repeatedly:
digitalWrite(bitSelect1,0);
digitalWrite(bitSelect2,1);
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,cseg[2]);
digitalWrite(latchPin,HIGH);
delay(20);
}
void chaneBit()
{
selectStat=!selectStat;
digitalWrite(bitSelect1,selectStat);
digitalWrite(bitSelect2,!selectStat);
}
看看效果:
二、顯示兩位靜態的數字
代碼:
int latchPin=6;
int clockPin=4;
int dataPin=5;
int bitSelect1=2;
int bitSelect2=3;
boolean selectStat=0;
int cseg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0x77,0x7c,?0x39,0x5e,0x79,0x71
int n=0;
void setup () {
// TODO: put your setup code here, to run once:
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(bitSelect1,OUTPUT);
pinMode(bitSelect2,OUTPUT);
}
void loop() {
// TODO: put your main code here, to run repeatedly:
chaneBit();
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,cseg[4]);
digitalWrite(latchPin,HIGH);
delay(20);
chaneBit();
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,cseg[3]);
digitalWrite(latchPin,HIGH);
delay(20);
}
void chaneBit()
{
selectStat=!selectStat;
digitalWrite(bitSelect1,selectStat);
digitalWrite(bitSelect2,!selectStat);
}
看看效果:
三、兩位數字的動態顯示
代碼:
int latchPin=6;
int clockPin=4;
int dataPin=5;
int bitSelect1=2;
int bitSelect2=3;
boolean selectStat=0;
int cseg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0x77,0x7c,?0x39,0x5e,0x79,0x71
int n=0;
void setup () {
// TODO: put your setup code here, to run once:
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(bitSelect1,OUTPUT);
pinMode(bitSelect2,OUTPUT);
}
void loop() {
// TODO: put your main code here, to run repeatedly:
for(int x=0; x<10; x++)
{
chaneBit();
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,cseg[x]);
digitalWrite(latchPin,HIGH);
delay(20);
chaneBit();
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,cseg[n%10]);
digitalWrite(latchPin,HIGH);
delay(20);
}
n++;
}
void chaneBit()
{
selectStat=!selectStat;
digitalWrite(bitSelect1,selectStat);
digitalWrite(bitSelect2,!selectStat);
}
看看效果:
這裏我們採用了595來實現兩位數碼管的顯示,實際和前面沒有采用595的原理相同,可以參考前面《proteus仿真arduino控制兩位數碼管》的博文。