pregnancy

شرح البرمجة مع السفن سيجمنت ومفسر الشفرة 7447



شرح البرمجة مع السفن سيجمنت ومفسر الشفرة 7447 بلغة السى والمترجم ميكروسى برو :

مقدمة :
وحدة العرض السفن سيجمنت هى واحدة من أجهزة العرض الشائعة الاستخدم فى عالم الإلكترونيات . سهول التشغيل والرؤية الجيدة جعلتها تستخدم فى الكثير من التطبيقات . كما هو واضح من الاسم , فإن بها سبع ليدات LEDs مقسمة إلى سبع شرائح segments . هذه الشرائح تستخدم عادة لعرض الأرقام من 0 إلى 9 والحروف من A إلى F ,كما أن بها أيضا نقطة عشرية DP .



أنواع وحدات السفن سيجمنت :
يوجد 8 ليدات , لذلك من المفترض وجود 16 طرف , لكن من ذلك يوجد 10 أطراف (كما فى الشكل أعلاه) . لذك , يجب وجود بعض التوصيلات الداخلية والتى تحتاج لمعرفتها .
بناء على التوصيلات الداخلية يوجد نوعين من السفن سيجمنت :
1- السفن سيجمنت نوع الأنود المشترك Common anode 7-segment .
2- السفن سيجمنت نوع الكاثود المشترك Common cathode 7-segment .







من الشكل المبين أعلاه يمكنك أن ترى أنه فى "الأنود المشترك" يتم توصيل جميع أنودات الليدات معا لتشكيل طرف أنود مشترك ولإضاءة ليد , يجب عليك توصيل الجهد الموجب للمصدر ( VCC على سبيل المثال ) بهذا الطرف المشترك والأرضى بكاثود الليد المناسب ( a,b,c..g على سبيل المثال ) . والعكس بالعكس فى "الكاثود المشترك" . لاحظ وجود طرفين للطرف المشترك وهما متصلان معا داخليا ليكون المجموع 10 أطراف .
عرض العدد

الشرائح لها 7 أسماء مختلفة (مبينة بالشكل أدناه) وطرف مناظر (مبين بالشكل أعلاه) . الآن إذا أردت عرض العدد "4" يجب عليك إضاءة شرائح الليدات "f,g,b,c" كما فى الشكل التالى :





وعلى فرض أنك تستخدم السفن سجمنت نوع "الأنود المشترك" ( هذا يعنى "0" لإضاءة الليد) وأن الثمانى أطراف نتصلة بالمنفذ PORTB للميكروكونترولر , عندئذ يجب أن تكتب : PORTB = 0b10011001; or PORTB = 0x99;
سوف تشاعد العدد "4" على السفن سيحمنت . والآن يمكنك عرض أى عدد تريده كما فى الشكل التالى :





مترجم الميكروسى برو يمتلك العديد من الأدوات والمكتبات , من أدواته "محرر السفن سيجمنت"
7-segment editor لتوفير الراحة لك فهو يقوم نيابة عنك بجميع الحسابات .




  #2  




مفسر الشفرة من ثنائى مكود عشرى BCD إلى سفن سيجمنت
قد يشكل حساب كود السفن سيجمنت فى كل مرة شىىء من الإزعاج للبعض .
هل هناك طريقة لاستخدام القيمة العشرية فقط لتعرضها السفن سيجمنت ؟
نعم , الدائرة المتكاملة المسماة مفسر الشفرة من BCD إلى سفن سيجمنت ( 7447 للأنود المشترك و 7448 للكاثود المشترك ) تقوم بذلك نيابة عنك .



هذه الدائرة المتكاملة تقبل دخل ثنائى مكود عشرى BCD وتقوم بتحويله إلى النموذج المناسب اللازم لإضاءة وحدة السفن سيجمنت . فى حالة الأنود المشترك (7447) , الحالة المنخفضة للخرج تؤدى إلى إضاءة ليد الشريحة . هذه الدائرة المتكاملة لها 4 مداخل هى A,B,C,D . هذه المداخل يمكن أن تبدء من 0000 إلى 1001 ( أى من 0 إلى 9 ) .
الوضع العادى , عندما تكون حالة الأطراف LT,RBI,BI مرتفعة فإن الدائرة المتكاملة ستقوم بتحويل أى عدد عشرى مكود ثنائى BCD على المداخل A,B,C,C إلى ما ئؤدى إلى ظهور العدد العشرى المكافىء على وحدة العرض السفن سيجمنت , عدا أنه لإذا ذات العدد العشرى المكود ثنائى عن 9 فإنه يظهر رمز معين مع كل رقم . يجب استخدام مقاومات لتحديد التيار قيمتها 330 ohms عند استخدام هذه الدائرة المتكاملة .





ملاحظات :
1- فى العمل العادى , دخل الإطفاء BI (الطرف 4"BI/RBO" ) يجب أن يكون "مفتوح" open أو محفوظ عند الحالة المرتفعة (غير فعال) عند الرغبة فى عرض الخرج من 0 إلى 15 . دخل الإطفاء المتموج RBI ( الطرف 5 "RBI" ) يجب أن يكون مفتوحا أو مرتفعا (غير فعال) عند عدم الرغبة فى إطفاء الصفر العشرى .
2- عند تطبيق الحالة المنطقية المنخفضة low (تفعيل) مباشرة على دخل الإطفاء BI (الطرف 4"BI/RBO" ) , يصبح جميع مخارج الشرائح مفصولة off بغض النظر عن أى مدخل آخر .
3- عندما يكون مدخل الإطفاء المتموج RBI ( الطرف 5 "RBI" ) والمداخل A,B,C,D (الأطراف 7,1,2,6 ) عند الحالة المنخفضة , مع وجود دخل اختبار اللمبات LT مرتفعا (عدم تفعيل),فإن جميع مخارج الشرائح تصبح مفصولة off ويصبح مخرج الإطفاء المتموج RBO فى الحالة المنخفضة ( حالة الاستجابة) .
4- عندما يكون دخل الأطفاء / خرج الأطفاء المتموج B1/RBO مفتوح open أو محفوظ عند الحالة المرتفعة وتم تطبيق حالة منخفضة على دخل اختبار اللمبات , فإن جميع مخارج الشرائح تكون موصلة on .







الطرف BI/RBO موصل فى شكل منطق AND ليساعد كدخل إطفاء BI و / أو كخرج إطفاء متموج RBO.
الآن سوف نستخدم مترجم الميكروسى برو لكتابة برنامج من أجل السفن سيجمنت , هذا البرنامج سوف يقوم بالعد من الصفر إلى تسعة ويبدأ ويتكرر من جديد .
البرنامج :





كود:

 
void main()
{
int i = 0 ;                     //Take a variable for "for" loop
           TRISB = 0 ;                // PORTB set as outputs 
           PORTB = 0xFF;        // All LEDs off 
 
while (1)
           {
for(i=0; i<=9 ; i++) 
                       {
PORTB = i ;               // show counting 
                                   Delay_ms(1000) ;      // Wait
}
}
}
النتيجة :





السفن سجمنت نوع الكاثود المشترك ومفسر الشفرة 7448 والميكروكونترولر PIC16F628 وعداد تصاعدى تنازلى من 00 إلى 99 :
الغرض :
إنشاء عداد تصاعدى / تنازلى من 00 إلى 99 يمكن أن يستخدم فى الكثير من التطبيقات مثل عد السيارت فى موقف السيارات أو عدد الأشخاص فى مكان ما .

الدائرة الكهربية :

[/url][/IMG]

سوف نستخدم الدائرة المتكاملة 7448 كمفسر للشفرة من BCD إلى سفن سيمنت , ومن ثم يجب أن نستخدم وحدتين سفن سيجمنت نوع "الكاثود المشترك" , ويتم توصيل الخطوط A,B,C,D,E,F,G على التوازى مع استخدام طريقة الانتخاب بين كاثودى الوحدتين .
البرنامج عبارة عن عداد تصاعدى / تنازلى من 00 إلى 99 باستخدام 2 مفتاح ضاغط ( تمثل أى نوع من حساسات الدخل الرقمى المناسبة ) أحدهما للتزايد والآخر للتناقص .
شرح خطوات البرنامج :
1- فى البداية يتم استخدام الموجه #define فى تعريف وإنشاء مسميات سهلة ومتعارف عليها بدلا من مسميات خاصة . على سبيل المثال تسمية طرف توصيل مفتاح التزايد PORTA.F0 باسم Up وطرف توصيل مفتاح التناقص PORTA.F1 باسم Down وهكذا كما يلى :

كود:
#defineUpPORTA.F0 // We can write Up instead of PORTA.F0 ... #defineDownPORTA.F1 #definedisp_unit1PORTA.F2 // We can write disp_uinit1 instead of PORTA.F2 ... #definedisp_unit2PORTA.F3
2- إعلان (تعريف) المتغيرات وتخصيص قيم لها عند الرغبة . هنا يتم إعلان متغير العدد الكلى المراد عرضه Number ( يقع بين 00 و 99 ) ومتغير قيمة خانة آحاده Ones ومتغير قيمة خانة عشراته Tens ( تقع بين 0 و 9) من نوع char والتى تعنى ضمنيا (unsigned) char ( بين 0 و 255 ) , مع تخصيص صفر للعدد Number=0 كحالة ابتدائية كما يلى :

كود:
charNumber=0,Ones,Tens ; // Variables
3- من المفضل تقسيم البرنامج إلى دوال منفصلة قدر المستطاع , لتسهيل فهم وتتبع البرنامج . هنا سوف نقوم بإنشاء الدوال التالية :
أ‌- دالة العرض Display() : وهى دالة فارغة void لا تعود بقيمة وليس لها بارامترات مرتبطة بها بل يتم تنفيذ العبارات التى تحتوى عليها فقط , وتكون بالصيغة التالية :

كود:
void Display() // Display function { ….. }
هذه الدالة بدورها تنقسم إلى قسمين هما :
· قسم استخراج خانة العشرات Tens وخانة الآحاد Ones من العدد الكلى Number , وذلك عن طريق استخدام عامل القسمة "/" وعامل باقى القسمة "%" . نتيجة "قسمة عدد صحيح على عدد صحيح أخر" (كما هو الحال هنا) تكون العدد الصحيح ويتم تجاهل الكسر أو باقى القسمة (على سبيل المثال نتيجة قسمة 5 على 3 تكون 5/3 = 1 ) فى حين أن نتيجة " خارج قسمة عدد على عدد صحيح آخر " تكون عدد صحيح هو باقى القسمة ( مثال :نتيجة باقى قسمة 5 على 3 هو 5%3 = 2 ) . وبناء على ذلك نتيجة "قسمة العدد الصحيح Number (المكون من آحاد وعشرات) على العدد الصحيح "10 تكون العدد الصحيح المناظر لخانة العشرات لهذا العدد أى Tens=Number/10 . فى حين أن نتيجة "باقى قسمة العدد الصحيح Number (المكون من آحاد وعشرات) على العدد الصحيح "10 تكون العدد الصحيح المناظر لخانة الآحاد لهذا العدد أى Ones=Number%10 .


كود:
Tens=Number/10; // Extracr : Tens & Ones from Number Ones=Number%10;
· قسم الانتخاب وإرسال (تحميل) البيانات والخاص بوحدات السفن سيجمنت . حيث يتم تفعيل أحد وحدتى السفن سيجمت , (وحدة العشرات disp_unit1=0 , على سبيل المثال " كاثود مشترك" ) وفصل الوحدة الأخرى ( تكون وحدة الآحاد disp_unit2=1 ) مع تحميل بيانات الوحدة الفعالة (العشرات PORTB=Tens ) , ثم يتم العكس . كما يتم إجراء تأخير بسيط للسماح بعدم ظهور تداخل أو ظلال (أشباح) أثناء العرض كما يلى :

كود:
disp_unit2=1; // Ones unit disp_unit2 => off PORTB=Tens; // Load Tens Data disp_unit1=0; // Tens unit disp_unit1 => on delay_ms(3); // Delay
disp_unit1=1; // Tens unit disp_unit1 => off PORTB=Ones; // Load Ones Data disp_unit2=0; // Ones unit disp_unit2 => on delay_ms(3); // Delay
وتكون دالة العرض كما يلى :

كود:
void Display() // Display function { Tens=Number/10; // Extracr : Tens & Ones from Number Ones=Number%10;
disp_unit2=1; //off => ones PORTB=Tens; disp_unit1=0; //on => tens delay_ms(3);
disp_unit1=1; //off => tens PORTB=Ones; disp_unit2=0; //on => ons delay_ms(3); }
ب‌- دالة تهيئة وإعداد أجهزة الميكروكونترولر المستهدف Setup() وهو هنا PIC16F628 كما يلى :

كود:
void Setup() { CMCON=7; //All pins digital I/O TRISA.f0=1; TRISA.f1=1; TRISA.f2=0; TRISA.f3=0;//PORTA setup TRISB=0; //PORTB=0; //PORTB setup //disp_unit1=1; disp_unit2=1; //Initial => off }
4- فى النهاية يتبقى الدالة الرئيسية للبرنامج main() , وفيها نبدأ باستدعاء دالة التهيئة Setup() ثم الدخول فى حلقة غير منتهية while(1) , وفيها ننتظر تحقق شرط الضغط على أى من مفتاح التزايد if(Up) أو مفتاح التناقص if(Down) لتنفيذ تزايد Number++ أو تناقص Number— العدد Number بواحد . فى كل حالة يتم وضع بعض الشروط لتتنفيذ السليم للبرنامج . على سبيل المثال لتجنب تغيير العدد أثناء الضغط يتم وضع شرط استمرار العرض حتى إزالة الضغط بحلقة while(Up) و حلقة while(Down) . كما أنه فى حالة التزايد ووصول العدد الكلى Number إلى القيمة 100 يتم استبدالها بالقيمة 0 بالعبارة if(Number==100)Number=0 , وفى حالة التناقص وصول العدد الكلى Number إلى القيمة 0 يتم استبدالها بالقيمة 100 بالعبارة if(Number==0)Number=100 .


البرنامج :


كود:
#define disp_unit1 PORTA.F2 // We can write disp_uinit1 instead of PORTA.F2 ... #define disp_unit2 PORTA.F3 #define Up PORTA.F0 #define Down PORTA.F1
char Number=0,Ones,Tens; // Variables
void Display() // Display function { Tens=Number/10; // Extracr : Tens & Ones from Number Ones=Number%10;
disp_unit2=1; //off => ones PORTB=Tens; disp_unit1=0; //on => tens delay_ms(3);
disp_unit1=1; //off => tens PORTB=Ones; disp_unit2=0; //on => ons delay_ms(3);
}
//*****************************************************************
void Setup() { CMCON=7; //All pins digital I/O TRISA.f0=1; TRISA.f1=1; TRISA.f2=0; TRISA.f3=0;//PORTA setup TRISB=0; //PORTB=0; //PORTB setup //disp_unit1=1; disp_unit2=1; //Initial => off }
//*****************************************************************
void main() { Setup(); while(1) { if(Up) // Press Up => PORTA.f0 high { Number++; if(Number==100)Number=0; while(Up) // To avoid an increase in number wait until release => PORTA.f0 low. { Display(); } }
if(Down) //Press Up => PORTA.f1 high { if(Number==0)Number=100; Number--; while(Down) // To avoid an increase in number wait until release => PORTA.f1 low. { Display(); } }
Display(); } }
void Display() // Display function { Tens=Number/10; // Extract : Tens & Ones from Number Ones=Number%10;
disp_unit2=1; // Active => Tens unit PORTB=Tens;//Load Tens Data disp_unit1=0;// delay_ms(3); disp_unit1=1;//Active => Ones unit PORTB=Ones;//Load Ones Data disp_unit2=0; delay_ms(3); }
النتائج :

[/url][/IMG]


عداد تصاعدى / تنازلى من 0000 إلى 9999 بأربع وحدات سفن سيحمنت ومفسر شفرة 7448 :
شكرا لتعليقك

فهرس




    اندرويد