اتصال کي پد
ابتدا در مورد چگونگي کار کي پد بحث کنيم .
در زير شکل اين وسيله را مشاهده مي کنيد .
'گاهي به تعداد زيادي کليد نياز داريم ، ما بايد اين کليد ها را به ميکرو متصل کنيم و مدام آنها را چک نماييم . براي اين کار دو راه وجود دارد که روش اول اتصال هر کليد به يک پايه و روش دوم استفاده از صفحه کليد ماتريسي است .
روش اول، چون تعداد زيادي از پايه هاي ميکرو اشغال مي شود،کمتر مورد استفاده قرار مي گيرد .
دستور بسکام براي استفاده از صفحه کليد ماتريسي که از اين به بعد به آن KBD مي گوييم به شرح زير است :
کد php:
Config Kbd = PORTX [, Debounce = Value , Delay = Value]
که PORTX ، پورتي است که KBD به آن متصل مي شود .
Debounce تاخير کليد است که بين 1 تا 255 ميلي ثانيه است . (اگر تعریف نشود 20 میلی ثانیه در نظر گرفته می شود )
Delay هم تاخیر بین هر فشردن کلید است که در بین 1 تا 255 میلی ثانیه قابل تنظیم است . (اگر تعریف نشود 100 میلی ثانیه در نظر گرفته می شود )
بعد از تعريف KBD در برنامه نوبت به استفاده از آن است براي اين کار از دستور زير استفاده مي شود
که Var يک متغيير از جنس بايت است که عدد گرفته شده از KBD در آن گذاشته مي شود و در صورتي که کليدي فشرده نشود عدد 16 در داخل آن گذاشته مي شود ، براي حذف عدد 16 مي توان از دستور شرطي If استفاده کرد.
مانند :
کد 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 = 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 6*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 مي نويسيم :
کد 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
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 کليد)
کد php:
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
منبع :
http://www.iranled.com/forum/showthread.php?tid=10869