شرح البرنامج :
1- جزء المقدمة وفيها يتم :
· اختيار الميكروكونترولر المستخدم Device = 16F628A ، وتردد الكريستال المستخدم Xtal 4 ، مع إعداد جميع أطراف الدخل / الخرج كمداخل / مخارج رقمية All_Digital true .
· إعداد منافذ الدخل والخرج PORTA=0:TRISA=%00010000 و PORTB=0:TRISB=%10000000 .
· الإعداد الابتدائى لسجل الخيارات OPTION_REG=%00000100 وسجل التحكم فى المقاطعة INTCON=%00100000 .
· إعلان المتغيرات المطلوبة للبرنامج :
كود:
Dim Counting As Word 'Variable, which will hold the values to be counted
Dim Digit_NO As Byt 'Display unit number
Dim Ones As Byte 'Ones digit of the number
Dim Tens As Byte 'Tens digit of the number
Dim Hundreds As Byte 'Hundreds digit of the number
Dim Thousands As Byte 'Thousands digit of the number
Dim I As Byte 'Loop variable,
Dim Convert As Byte 'Convert variable
Dim X As Byte 'Intervening variable
· إعلان أسماء مستعارة لتسهيل فهم وتتبع البرنامج :
كود:
Symbol Disp0=PORTA.0 ' ones digit of the common anode
Symbol Disp1=PORTA.1 ' Tens digit of the common anode
Symbol Disp2=PORTA.2 ' hundreds digit
Symbol Disp3=PORTA.3 ' Thousands digit
Symbol P_Button =PORTB.7 'Count up push button
Symbol Resetting =PORTA.4 'Clear counter
· الانتظار 100 ملى ثانية لاستقرار النظام PAUSE 100 .
· الإعداد النهائى لسجل التحكم فى المقاطعة ، وتحميل سجل المؤقت TMR0 بقيمة ابتدائية :
كود:
INTCON.7=1 'Enable all(Global) interrupt (GIE)
TMR0=99 'Start value
· إعلان وجود مقاطعة تبعا للأمر On Interrupt GoTo ISR .
2- حلقة البرنامج الرئيسى وتبدأ بالعنوان "Start:" وتحتوى على :
أ- اختبار الضغط على المفتاح الضاغط If P_Button=0 Then ، إذا كان مضغوط يتم القفز إلى الروتين الفرعى لعلاج الارتداد فى المفتاح GoSub DELAY والعودة ، حيث يتم تنفيذ التأخير الزمنى بشكل يسمح بفاعلية المقاطعة فى أقصر زمن ممكن فبدلا من استخدام الأمر Pause 20 للحصول على تأخير 20 ملى ثانية يتم الحصول على نفس النتيجة ولكن بشكل متقطع على هيئة حلقة تتكرر 2000 مرة فى كل مرة يتم تنفيذ تأخير قصير جدا (5 ميكروثانية) وهذا يسمح بالإحساس بحدوث المقاطعات فى أقصر وقت :
كود:
DELAY:
For I=0 To 20000
PAUSEUS 5
Next
Return
ب- بعد تنفيذ التأخير الزمنى والعودة يتم تزايد متغير العداد بواحد Counting=Counting+1 ثم اختبار محتويات متغير العداد فإن كانت أكبر من الحد الأقصى "9999" يتم تصفير متغير العداد :
If Counting>9999 Then Counting=0 ، مع التحقق من أن المفتاح الضاغط مازال مضغوطا لمنع أى تزايد غير صحيح While P_Button=0:Wend :
كود:
If P_Button=0 Then ' pressed
GoSub DELAY ' Execute and return
Counting=Counting+1
If Counting>9999 Then Counting=0
While P_Button=0:Wend
EndIf
ت- ثم يتم اختبار الضغط على مفتاح تصفير العداد وتنفيذ التصفير عند الضغط عليه :
If Resetting=0 Then Counting=0
ث- عرض محتويات متغير العداد Counting:
متغير العداد Counting بحجم 2 بايت word ليسع العدد من "0000" إلى "9999" . هذا العدد له أربع ارقام أو خانات :
· خانة الآحاد Ones وتوجد قيمتها فى الخانة الأولى Dig 0 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 0 .
· خانة العشرات Tens وتوجد قيمتها فى الخانة الثانية Dig 1 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 1 .
· خانة المئات وتوجد قيمتها فى الخانة الثالثة Dig 2 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 2 .
· خانة الآلاف وتوجد قيمتها فى الخانة الرابعة Dig 3 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 3 .
يتم استخلاص الخانة ثم الذهاب إلى الروتين الفرعى GoSub Decoding لتحويلها إلى كود السفن سيجمنت المقابل والعودة والتكرار لباقى الخانات كما يلى :
كود:
X=Counting Dig 0 :GoSub Decoding:Ones=Convert ' Execute to get number and return
X=Counting Dig 1 :GoSub Decoding:Tens=Convert
X=Counting Dig 2 :GoSub Decoding:Hundreds=Convert
X=Counting Dig 3 :GoSub Decoding:Thousands=Convert
GoTo Start
Decoding: Convert = LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57] :Return