اينم از كتاب اقاي
يك نفر
'گاهی نیاز از که چندین کلید را به میکرو متصل کنیم ، برای این کار دو راه وجود دارد که روش اول اتصال هر کلید به یک پایه وروش دوم استفاده از صفحه کلید ماتریسی است .
روش اول، چون تعداد زیادی از پایه های میکرو اشغال میشود،کمتر مورد استفاده قرار میگیرد .دستور بسکام برای استفاده از صفحه کلید ماتریسی که از این به بعد به ان kbd میگوییم به شرح زیر است :
کد:
CONFIG KBD = PORTx , DEBOUNCE = value
که portx ، پورتی است که kbd به ان متصل میشود وDEBOUNCE تاخیر کلید است که بین20 تا 255 میلی ثانیه است (هنگامی که کلید فشرده میشود ،براثر لرزش دست چندین با دو کنتاکت ان به هم برخورد میکنند و در نهایت ثابت میشوند اگر از دستور DEBOUNCE استفاده نشوند لرزش به منزله فشردن کلید است )
بعد از تعریف kbd در برنامه نوبت به استفاده از ان است برای این کار از دستور زیر استفاده می شود
که a یک متغییر از جنس بایت است که عدد گرفته شده از kbd در ان گذاشته میشود و در صورتی که کلیدی فشرده نشود عدد 16 در داخل ان گذاشته می شود ، برای حذف عدد 16 می توان از دستور شرطی if استفاده کرد. مانند:
کد:
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb,DEBOUNCE = 50
Dim A As Byte
Q:
A = Getkbd()
If A > 15 Then
Goto Q
End If
Locate 1 , 1
Lcd A
Goto Q
End
تحلیل برنامه :
دو خط اول برنامه مثل همیشه معرفی میکرو و کریستال است (که در اینجا از میکرو مگا 16 و کریستا ل8مگاهرتز استفاده شده است) .
در خط سوم و چهارم و پنجم lcd راه اندازی شده است ( که در اینجا از lcd 16*2 استفاده شده وlcd به پورتd متصل است) .
در خط ششم kbd معرفی شده(که در اینجا kbd به پورت b متصل شده وDEBOUNCE پنجاه میلی ثانیه گرفته شده است ) .
در خط هفتم یک متغییر از جنس بایت معرفی گردیده .
در خط هشتم یک برجسب به نام q قرار داده شده است .
در خط نهم عدد گرفته شده از kbd در متغییر a قرار میگیرد (در صورتی که هیچ کلیدی فشرده نشود مقدار 16 (a=16) در a ریخته میشود ) .
در خط ده ویازده و دوازده یک دستور شرطی قرار گرفته که این دستور شرطی میگوید :اگر a بزرگتر از 15 شد به برچسب q برش کن(در صورتی که شرط درست باشد دستورات بین if و endif اجرا میشود و اگر شرط درست نباشد برنامه از خط بعد از endif ادامه مییابد ).
در خط سیزده و چهارده مقدار a در سطر اول و ستون اول lcd نمایش داده میشود .
و در خط پانزده برنامه به برچسب q پرش میکند و مراحل قبل دوباره تکرار میگردد .
خط اخر برنامه همیشه end است .
در این مثال به ازای هر کلید در lcd یک نام نوشته میشود :
کد php:
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20
Dim A As Byte
Q:
A = Getkbd()
If A > 15 Then : Goto Q : End If
If A = 0 Then : Locate 1 , 1 : Lcd "qwer" : End If
If A = 1 Then : Locate 1 , 1 : Lcd "asdf" : End If
If A = 3 Then : Locate 1 , 1 : Lcd "FDFD" : End If
If A = 4 Then : Locate 1 , 1 : Lcd "aFDf" : End If
If A = 5 Then : Locate 1 , 1 : Lcd "SAKr" : End If
If A = 6 Then : Locate 1 , 1 : Lcd "1234" : End If
If A = 7 Then : Locate 1 , 1 : Lcd "5687" : End If
If A = 8 Then : Locate 1 , 1 : Lcd "7541" : End If
If A = 9 Then : Locate 1 , 1 : Lcd "IO12" : End If
If A = 10 Then : Locate 1 , 1 : Lcd "wqsf" : End If
If A = 11 Then : Locate 1 , 1 : Lcd "1l2k" : End If
If A = 12 Then : Locate 1 , 1 : Lcd "3,m5" : End If
If A = 13 Then : Locate 1 , 1 : Lcd ")(*(" : End If
If A = 14 Then : Locate 1 , 1 : Lcd "****" : End If
If A = 15 Then : Locate 1 , 1 : Lcd "++++" : End If
Locate 2 , 1 : Lcd A : Goto Q
End
در برنامه بالا برای اینکه حجم کمتری اشغال شود دستورات به صورت سطری نوشته شدهاند ، شما میتوانید با قرار دادن علامت دونقطه
) در بین دو دستور انها را در یک خط بنویسید ، هعمچنین با قرار دادن علامت ویرگول
) چندین علامت را روی lcd در یک خط نمایش دهید ، همچنین با دستور کما (,) چندین متغییر را در یک خط معرفی کنید
برنامه بالا را با استفاده از جدول lookupstr مینویسیم:
کد:
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20
Dim A As Byte
Dim B As String * 5
Q:
A = Getkbd()
If A > 15 Then
Goto Q
End If
B = Lookupstr(a , W)
Locate 1 , 1: Lcd B
Locate 2 , 1: Lcd A
Goto Q
End
W:
Data "qwer" , "asdf" , "gdfh" , "jlhl" , "hkn," , "yryh" , "bmn4" , "2452" , "jkym" , "jytj" , "njhf" , "uyjn" , "dyr4" , "e5yh" , "9768" , "hnbh”
جدول lookupstr نیز مانند جدول lookup است اما جدول lookup برای باز گردانی اعداد و جدول lookupstr برای بازگردانی حروف به کار میرود .
شما جای پایه های kbd که به پایه میکرو متصل است را تغییر دهید ونتیجه راببینید.همیشه نیاز نیست که ورودی یک کلید باشد بعضی وقت ها می توان صفر یا یک شدن یک پین را هم چک کرد.
بعضی وقت ها به کیپد با تعداد کلید بیشتر نیاز است شما با دستور زیر 2 سطر دیگر به تعدا سطر های کیپد اضافه کنید (در مجموع 24 کلید)
نقل قول: Config Kbd = Portx , Debounce = Value , Rows = 6 , Row5 = Pina.b, Row6 = Pina.b
X نام پورتی است که کیپد به ان متصل شده است ( 4سطر و4ستون اصلی).
Value مقدار تاخیر در فشردن کلید برای گرفتن لرزش است.
a.b نام پورت و پینی است که دوسطر دیگر به ان متصل شده اند.
کد php:
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20 , Rows = 6 , Row5 = Pina.0 , Row6 = Pina.1
Dim A As Byte
Q:
A = Getkbd()
If A > 16 Then : Goto Q : End If
Locate 1 , 1 : Lcd A : Goto Q
End