سلام
این برنامه :
کد:
$regfile = "m32def.dat"
$crystal = 8000000
Config Porta = Input
Config Portc = Output
Dim A As Byte , B As Byte
Config Int0= RISING
Config Int1 = Rising
Config Int2 = Rising
On Int0 Q
On Int1 W
On Int2 E
On Ovf1 R
Enable Int0
Enable Int1
Enable Int2
Config Timer1 = Timer , Prescale = 64
Enable Ovf1
Enable Interrupts
Do
A = 5
Set Porta.0
Waitms A
Reset Porta.0
Set Porta.1
Waitms A
Reset Porta.1
Set Porta.2
Waitms A
Reset Porta.2
Set Porta.3
Waitms A
Reset Porta.3
Portc = B
Loop
Q:
If Porta.0 = 1 Then : B = 0 : End If
If Porta.1 = 1 Then : B = 1 : End If
If Porta.2 = 1 Then : B = 2 : End If
If Porta.3 = 1 Then : B = 3 : End If
Return
W:
If Porta.0 = 1 Then : B = 4 : End If
If Porta.1 = 1 Then : B = 5 : End If
If Porta.2 = 1 Then : B = 6 : End If
If Porta.3 = 1 Then : B = 7 : End If
Return
E:
If Porta.0 = 1 Then : B = 8 : End If
If Porta.1 = 1 Then : B = 9 : End If
If Porta.2 = 1 Then : B = 10 : End If
If Porta.3 = 1 Then : B = 11 : End If
Return
R:
Incr B
Return
برنامه از چند تا قسمت تشکیل شده :
1- معرفی و راه اندازی امکانات :
معرفی میکرو و مقدار کریستال :
$regfile = "m32def.dat"
$crystal = 8000000
قرار دادن پروت c به عنوان خروجی برای اتصال به ایسی 7447 و 7 سگمنت ، قرار دادن پروت a به عنوان ورودی برای اتصال سطر های کیبرد و معرفی دو عدد متغییر :
Config Porta = Input
Config Portc = Output
Dim A As Byte , B As Byte
پیکر بندی پایه های وقفه :
Config Int0= RISING
Config Int1 = Rising
Config Int2 = Rising
On Int0 Q
On Int1 W
On Int2 E
Enable Int0
Enable Int1
Enable Int2
پایه های وقفه به لبه بالا رونده حساس هشتند و با تحریک cpu به برچسب مشخص شده میرود .
Config Timer1 = Timer , Prescale = 64
Enable Ovf1
On Ovf1 R
توسط تایمر 1 زمان .5 ثانیه ایجاد شده است تا شمارش ، شمارند نمایان شود (تاخیر در شمردن )
و حلقه اصلی :
Do
A = 5
Set Porta.0
Waitms A
Reset Porta.0
Set Porta.1
Waitms A
Reset Porta.1
Set Porta.2
Waitms A
Reset Porta.2
Set Porta.3
Waitms A
Reset Porta.3
Portc = B
Loop
در این حلقه ، پین 4 پایه اول پورت a که به ستون کیپد متصل میشود ، سطح منطقی 1 مدام میچرخد ، به این صورت 0001 >>> 0010 >>>> 0100 >>>1000>>> >0001>>......
Waitms A تاخیر در فشرده شدن کلید یا همو دیبانس خودمون هست ، و میتونی مقدار اون رو تغییر بدی .
برچسب های تحریک پایه های وقفه هست :
Q:
If Porta.0 = 1 Then : B = 0 : End If
If Porta.1 = 1 Then : B = 1 : End If
If Porta.2 = 1 Then : B = 2 : End If
If Porta.3 = 1 Then : B = 3 : End If
Return
W:
If Porta.0 = 1 Then : B = 4 : End If
If Porta.1 = 1 Then : B = 5 : End If
If Porta.2 = 1 Then : B = 6 : End If
If Porta.3 = 1 Then : B = 7 : End If
Return
E:
If Porta.0 = 1 Then : B = 8 : End If
If Porta.1 = 1 Then : B = 9 : End If
If Porta.2 = 1 Then : B = 10 : End If
If Porta.3 = 1 Then : B = 11 : End If
Return
و در نهایت برچسب سرریزی تایمر :
R:
Incr B
Return
فرض کن cpu میکرو خط 21 برناه رو میخونه (Set Porta.0 ) در این حالت شما یکی از کلید ها رو که به ستون متصل به این پایه هست رو فشار میدید ، با فشرده شدن کلید این پایه به یکی از پایه های وقفه (مثلا وقفه شماره یک ) متصل میشه ، cpu به برچسب تحریک وقفه ( w ) مراجعه میکنه ، در اونجا ما چند تا شرط داریم ، شرط ها چک میشن ، شرط If Porta.0 = 1 Then : B = 0 : End If درست هست (بقه غلط هستند ، چون پایه های صفر هست ) بنابراین مقدار b برابر 0 میشه با دستور return پردازنده میکرو به حلقه اصلی هدایت میشه و با دستور Portc = B مقدار b به پروت c ارسال میشه و در اونجا به نمایش در می یاد .