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



با سلام و خسته نباشید ببخشید میشه در مورد کد بالا توضیح بدین اصلا توضیح ندادین اون تابع ها چکار میکنه چطوری دوتا شیفت ریجستر را باهم هماهنگ میشن والله نمیشه از کد فهمید ممنون