 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:
|
|
15-09-2012, 02:28 AM
المشاركة 27
|
|
أ- التحكم فى وحدات العرض 7-segment المتعددة بالانتخاب (العرض الديناميكى) :
تناول وحدات العرض المتعددة يتم باستخدام نفس نظرية وحدة العرض المفردة , ففى وحدات العرض المتعددة يتم إظهار رقم واحد فى نفس الوقت . على سبيل المثال , إذا كان لديك وحدة عرض لأربعة أرقام عندئذ يتم تفعيل وحدة عرض رقم الآحاد مع عدم تفعيل باقى الوحدات , ثم تفعيل وحدة عرض رقم العشرات مع عدم تفعيل باقى الوحدات ثم تفعيل وحدة عرض رقم المئات مع عدم تفعيل باقى وحدات العرض وأخيرا تفعيل وحدة عرض رقم الألاف مع عدم تفعيل باقى الوحدات . ينبغى أن تتم هذه العملية بسرعة وذلك لخداع العين البشرية لكى تبدو كما لو كانت كافة الأرقام مفعلة . هذا الترتيب يقلل من التوصيلات الكهربائية ومن استهلاك الطاقة لأنه فى واقع الأمر رقم واحد يكون فعال فى أى وقت . العين البشرية لا تلاحظ أى تغيرات تحدث بتردد أكبر من 25Hz ( ويكون الزمن الدورى 40m-seconds ) .
فى المثال التالى سوف نستخدم 4 وحدات عرض لذلك فإن زمن إظهار كل رقم يجب أن يساوى ربع زمن الدورة أى يكون 10m-seconds.
الطريقة الأكثر كفاءة لعرض الأرقام تتم عن طريق استخدام الدالة . بأربعة أرقام (خانات) يمكن عرض الأعداد من 0 إلى 9999 , لذلك يتم إدخال العدد فى متغير من نوع العدد الصحيح . لكل رقم (خانة) يكون من الضرورى إجراء حسابات منفصلة خاصة بها , فعلى سبيل المثال لاشتقاق وحدات خانة الألاف يتم قسمة العدد على 1000 بعد ذلك يتم طرح وحدات الألاف من العدد الكلى , ويتم تكرار هذه العملية حتى نصل إلى وحدات رقم الآحاد .
يجب تفعيل وحدات العرض من خلال منفذ آخر , فى هذا المثال سوف نستخدم المنفذ port A .
لفهم هذه العملية عليك مراقبة وتحليل الدالة التالية :
كود:
// Declaration of the constants for the display.
const unsigned short DIGIT [] =
{
0x3F, // code of digit 0
0x06, // code of digit 1
0x5B, // code of digit 2
0x4F, // code of digit 3
0x66, // code of digit 4
0x6D, // code of digit 5
0x7D, // code of digit 6
0x07, // code of digit 7
0x7F, // code of digit 8
0x6F, // code of digit 9
};
// Function to display the dynamic display.
void VerDisplay (int Number)
{
unsigned short Uints; // Variable to store the units.
unsigned short Tens; // variable to store tens.
unsigned short Hundreds; // Variable to store the hundreds.
unsigned short Thousands; // Variable to save thousands.
Thousands = Number/1000; // Calculate the thousands.
Hundreds = (Number - Thousands * 1000) / 100; // Calculate the hundreds.
Tens = (Number - Thousands * 1000 - Hundreds * 100) / 10; // Calculate the tens.
Uints = (Number - Thousands * 1000 - Hundreds * 100 - Tens * 10); // Calculate the units.
PORTB = DIGIT [Uints] ; // Display units.
PORTA.F0 = 1, // Active high the first display
delay_ms (10) ; // Challenged 10m seconds
PORTA = 0; // disable all displays.
PORTB = DIGIT [Tens] ; // Displays the dozens.
PORTA.F1 = 1 ; // Turns up the second display
delay_ms (10); // Challenged 10m seconds
PORTA = 0; // disable all displays.
PORTB = DIGIT [Hundreds] ; // Displays the hundreds.
PORTA.F2 = 1, // Active high the third display
delay_ms (10); // Challenged 10m seconds
PORTA = 0; // disable all displays.
PORTB = DIGIT [Thousands] ; // Displays thousand units.
PORTA.F3 = 1; // Turns up the fourth display
delay_ms (10) ; // Challenged 10m seconds
PORTA = 0; // disable all displays.
}
|