در راه اندازی سونسگمنت های با تعداد رقم بالا از روش مالتی پلکس استفاده می شود . در این روش کلیه پین های A تا G سونسگمنت ها با همدیگر مشترک اند و تنها پین کام آن ها جدا می باشد . در این حالت هر بار MCU یک سگمنت را فعال و سپس دیتای آن را بر روی پین های A تا G قرار می دهد . با وجود اینکه در این روش پین های کمتری از MCU اشغال می شوند ، اما باز در صورت استفاده از سونسگمنت های با تعداد رقم بالا ، پین های بسیار زیادی از میکروکنترلر را اشغال می کند . معمولا در راه اندازی سونسگمنت های با تعداد رقم بالا از درایور هایی مانند TM1637 استفاده می شود . اما یک راه ارزان و ساده تر استفاده از شیفت رجیستر 74HC595 است . این چیپ یک شیفت رجیستر SIPO می باشد که می توان آن را جایگزین درایور های سونسگمنت کرد . ماژول سونسگمنت 8 رقمی نیز بر پایه 74HC595 می باشند . از طریق تنها 3 پایه می توانید ماژول را راه اندازی کنید . در این ماژول دو چیپ 74HC595 استفاده شده است که اولی برای کنترل پین های A تا G و دومی برای کنترل پین های کام می باشد .
در تصویر زیر شماتیک این ماژول نشان داده شده است :
راه اندازی با آردوینو :
ماژول را همانند تصویر زیر به آردوینو متصل کنید . سپس کد های زیر را بر روی برد خود کپی کنید . درا این برنامه به صورت تصادفی بر روی هر سگمنت یک عدد نمایش داده می شود .
کد های آردوینو :
const int clock = 11; //SCK
const int latch = 12; //RCK
const int data = 10; //DIO
byte value[] ={ B11111001, // 1
B10100100, // 2
B10110000, // 3
B10011001, // 4
B10010010, // 5
B10000010, // 6
B11111000, // 7
B10000000, // 8
B10010000, // 9
B11000000, // 0
B11111111};// display nothing
byte digit[] ={ B00000001, // left segment
B00000010,
B00000100,
B00001000,
B00010000,
B00100000,
B01000000,
B10000000}; // right segment
byte ii = 0;
byte v0, v1,v2,v3,v4,v5,v6,v7;
byte vvalue = value[0];
void setup() {
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
pinMode(data, OUTPUT);
cli();//stop interrupts
//set timer0 interrupt at 980Hz
TCCR0A = 0;// set entire TCCR0A register to 0
TCCR0B = 0;// same for TCCR0B
TCNT0 = 0;//initialize counter value to 0
OCR0A = 255;//(must be 16000000 / (prescaler*255) = 980 Hz
TCCR0A |= (1 << WGM01);
TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64
TIMSK0 |= (1 << OCIE0A);
sei();//allow interrupts
v0=v1=v2=v3=v4=v5=v6=v7=10; // default: show nothing
}
ISR(TIMER0_COMPA_vect){
ii++;
if (ii==8) ii=0;
if (ii==0) { vvalue = v0; }
else if (ii==1) { vvalue = v1; }
else if (ii==2) { vvalue = v2; }
else if (ii==3) { vvalue = v3; }
else if (ii==4) { vvalue = v4; }
else if (ii==5) { vvalue = v5; }
else if (ii==6) { vvalue = v6; }
else if (ii==7) { vvalue = v7; }
digitalWrite(latch,LOW);
shiftOut(data,clock,MSBFIRST,B11111111);
shiftOut(data,clock,MSBFIRST,B11111111);
digitalWrite(latch,HIGH);
digitalWrite(latch,LOW);
shiftOut(data,clock,MSBFIRST,digit[ii]);
shiftOut(data,clock,MSBFIRST,value[vvalue]);
digitalWrite(latch,HIGH);
}
int a, b,t,d;
void loop() {;
b = random(0,11); // value to display
t = random(25,100); // time to count
d = random(0,8); // digit to change
switch (d) {
case 0:
for (a=0;a<=b;++a) {v0 = a; delay(t);}
break;
case 1:
for (a=0;a<=b;++a) {v1 = a; delay(t);}
break;
case 2:
for (a=0;a<=b;++a) {v2 = a; delay(t);}
break;
case 3:
for (a=0;a<=b;++a) {v3 = a; delay(t);}
break;
case 4:
for (a=0;a<=b;++a) {v4 = a; delay(t);}
break;
case 5:
for (a=0;a<=b;++a) {v5 = a; delay(t);}
break;
case 6:
for (a=0;a<=b;++a) {v6 = a; delay(t);}
break;
case 7:
for (a=0;a<=b;++a) {v7 = a; delay(t);}
break;
default:
v0=v1=v2=v3=v4=v5=v6=v7=10;
break;
}
}


