در راه اندازی سونسگمنت های با تعداد رقم بالا از روش مالتی پلکس استفاده می شود . در این روش کلیه پین های 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; } }