[B]الاردوينو وموديول سفن سيجمنت مكون من أربع وحدات عرض ومسجلات الإزاحة 74HC595 :
وحدة العرض مكونة من أربعة أرقام digit . توفر هذه الوحدة شاشة مثالية للبيانات الرقمية أو السداسية عشرية. يمكن عرض الأرقام من 0 إلى 9 بما في ذلك العلامة العشرية ، والحروف من A إلى F. يمكن أيضًا التحكم في كل شريحة على حدة إذا كنت ترغب في ذلك.
يحتوي الموديول على أربعة سجلات إزاحة 74HC595 – واحد لكل تحكم فى رقم.
الدائرة الكهربية :


البرنامج :
كود:
// Demonstration Arduino sketch for four digit, seven segment display with enclosure
// https://pmdway.com/collections/7-segment-numeric-leds/products/four-digit-seven-segment-display-module-and-enclosure
int latchPin = 13; // connect to LCK pin
int clockPin = 12; // connect to CLK pin
int dataPin = 11; // connect to SDI pin
int LED_SEG_TAB[]={
0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x01,0xee,0x3e,0x1a,0x7a,0x9e,0x8e,0x01,0x00};
//0 1 2 3 4 5 6 7 8 9 dp . a b c d e f off
//a,b,c,d,e,f,g,dp >> for LSBFIRST >> dp>>Q7, g>>Q6, >>…a>>Q0
void setup()
{
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void displayNumber(int value, boolean leadingZero)
// break down "value" into digits and store in a,b,c,d
{
int a,b,c,d;
a = value / 1000;//Digit1 or thousands
value = value % 1000;
b = value / 100;//Didit2 or hundreds
value = value % 100;
c = value / 10; // Digit3 or tens
value = value % 10;
d = value;//Digit4 or ones
if (leadingZero==false) // removing leading zeros
{
if (a==0 && b>0)
{
a = 18;
}
if (a==0 && b==0 && c>0)
{
a = 18;
b = 18;
}
if (a==0 && b==0 && c==0)
{
a = 18;
b = 18;
c = 18;
}
if (a==0 && b==0 && c==0 && d==0)
{
a = 18;
b = 18;
c = 18;
d = 18;
}
}
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[d]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[c]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[a]);
digitalWrite(latchPin, HIGH);
}
void allOff() // turns off all segments
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
shiftOut(dataPin, clockPin, LSBFIRST, 0);
digitalWrite(latchPin, HIGH);
}
void loop()
{
for (int z=900; z<=1100; z++)
{
displayNumber(z, false);
delay(10);
}
delay(1000);
for (int z=120; z>=0; --z)
{
displayNumber(z, true);
delay(10);
}
delay(1000);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[12]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[11]);
digitalWrite(latchPin, HIGH);
delay(1000);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[16]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[15]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]);
digitalWrite(latchPin, HIGH);
delay(1000);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[0]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[1]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[2]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[3]+1);
digitalWrite(latchPin, HIGH);
delay(1000);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]+1);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[4]);
digitalWrite(latchPin, HIGH);
delay(1000);
}
طريقة العمل :
• فى البداية ، نعرف أطراف الخرج الرقمية المستخدمة في المزلاج latch والساعة clock والبيانات data فى السطور :
كود:
int latchPin = 13; // connect to LCK pin
int clockPin = 12; // connect to CLK pin
int dataPin = 11; // connect to SDI pin
• ثم ننشىء مصفوفة تحتوي على قيم والتى يتم إرسالها إلى سجلات الإزاحة في الموديول لعرض الأرقام والحروف الممكنة. على سبيل المثال ، العنصر الأول – 0xfc – سوف يفعل الشرائح لعرض الرقم “0” ، والعنصر 0x7a للحرف C ، وهلم جرا.
• كما أنشأنا دالة ، بمعرفة المستخدم ، والتى تستخدم لإرسال العدد ككل whole number بين “0” و “9999” إلى الشاشة . للقيام بذلك ، ببساطة استخدم الدالة بالصيغة :
كود:
void displayNumber(value, true/false);
حيث value هي العدد number المطلوب عرضه (أو المتغير الذي يحتوي على العدد ) – والبارامتر الثانى هو true أو false . يتحكم هذا البارامتر فيما إذا كان لديك صفر بادئة leading zero معروضة (أصفار على الشمال) – true تعنى نعم وجود أصفار على اليسار ، و false تعنى عدم وجود أصفار على اليسار ا.
على سبيل المثال ، لعرض "0123" ، ستستخدم:
كود:
displayNumber(123, true);
والنتيجة :

أو لعرض 500” استخدم :
كود:
displayNumber(500, false);
وتكون النتيجة :

لإيقاف تشغيل جميع الأرقام ، تحتاج إلى إرسال أصفار إلى كل بت في سجل الإزاحة ، ويتم ذلك عن طريق الدالة الآتية :
ماذا عن العلامة العشرية؟
لتشغيل العلامة العشرية لرقم معين ، أضف 1 إلى القيمة التي يتم إرسالها إلى رقم معين. على سبيل المثال ، لعرض 87.65 ، تستخدم:
كود:
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]);
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]+1); // added one for decimal point
shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[8]);
digitalWrite(latchPin, HIGH);
والنتيجة تكون :

شرح لكيفية التحكم في الموديول :
كما هو موضح في الدائرة الكهربية أعلاه ، يتم التحكم في كل رقم digit بواسطة مسجل الإزاحة 74HC595 . يحتوي كل مسجل إزاحة على ثمانية مخارج رقمية ، يتحكم كل منها في شريحة فردية من كل رقم. لذلك من خلال إرسال أربع بايتات bytes من البيانات (بايت واحد = ثمانية بت) ، يمكنك التحكم في كل شريحة من الشاشة.
يتم تعيين شرائح كل رقم على النحو التالي :

وتتوافق مخارج كل مسجل إزاحة مع ترتيب الشرائح من اليسار إلى اليمين. لذلك المخارج 0~7 تطابق A~G ثم الفاصلة العشرية.
على سبيل المثال ، لإنشاء الرقم سبعة بعلامة عشرية ، تحتاج إلى تشغيل الشرائح A, B, C , DP والتي تتوافق مع مخرجات مسجل الإزاحة 0،1،2،8.
وبالتالي فإن البايت المراد إرساله إلى سجل الإزاحة سيكون 0b11100001(أو 225 بالأرقام العشرية أو or 0xE1 بالسداسي عشري).
في كل مرة تريد فيها تغيير العرض ، تحتاج إلى إعادة رسم re-draw الأرقام الأربعة (أو أكثر إذا تستخدم أكثر من موديول متصلة) - بحيث يتم إرسال أربعة بايت من البيانات لكل تغيير العرض. تتم معالجة (عنونة) addressed الأرقام من اليمين إلى اليسار ، لذا فإن إرسال البايت الأول مخصص للرقم الأخير - والبايت الأخير مخصص للرقم الأول.
هناك ثلاث مراحل لتحديث الشاشة.
• وضع Set خط ساعة المزلاج latch على الحالة المنخفضة low .
• إزاحة للخارج Shift out أربعة بايت من البيانات من المتحكم الخاص بك .
• وضع خط ساعة المزلاج هلى الحالة المرتفعة high .
على سبيل المثال ، باستخدام الكود:
كود:
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 0b10000000); // digit 4
shiftOut(dataPin, clockPin, LSBFIRST, 0b01000000); // digit 3
shiftOut(dataPin, clockPin, LSBFIRST, 0b00100000); // digit 2
shiftOut(dataPin, clockPin, LSBFIRST, 0b00010001); // digit 1
digitalWrite(latchPin, HIGH);
تكون النتيجة :

لاحظ كيف تتطابق البايتات الثنائية مع خريطة الأرقام وموضعها. على سبيل المثال ، كان البايت الأول مرسل للرقم الرابع ، وتم تشغيل الشريحة A. وهذا كل ما في الأمر - عرض أنيق وبسيط.
|