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

 

 

Tags:
About Author: USER_4