۰۷-دى-۱۳۸۷, ۲۱:۲۳:۴۰
۰۸-دى-۱۳۸۷, ۰۳:۳۴:۴۲
اينم از كتاب اقاي يك نفر
'گاهی نیاز از که چندین کلید را به میکرو متصل کنیم ، برای این کار دو راه وجود دارد که روش اول اتصال هر کلید به یک پایه وروش دوم استفاده از صفحه کلید ماتریسی است .
روش اول، چون تعداد زیادی از پایه های میکرو اشغال میشود،کمتر مورد استفاده قرار میگیرد .دستور بسکام برای استفاده از صفحه کلید ماتریسی که از این به بعد به ان kbd میگوییم به شرح زیر است :
که portx ، پورتی است که kbd به ان متصل میشود وDEBOUNCE تاخیر کلید است که بین20 تا 255 میلی ثانیه است (هنگامی که کلید فشرده میشود ،براثر لرزش دست چندین با دو کنتاکت ان به هم برخورد میکنند و در نهایت ثابت میشوند اگر از دستور DEBOUNCE استفاده نشوند لرزش به منزله فشردن کلید است )
بعد از تعریف kbd در برنامه نوبت به استفاده از ان است برای این کار از دستور زیر استفاده می شود
که a یک متغییر از جنس بایت است که عدد گرفته شده از kbd در ان گذاشته میشود و در صورتی که کلیدی فشرده نشود عدد 16 در داخل ان گذاشته می شود ، برای حذف عدد 16 می توان از دستور شرطی if استفاده کرد. مانند:
تحلیل برنامه :
دو خط اول برنامه مثل همیشه معرفی میکرو و کریستال است (که در اینجا از میکرو مگا 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 یک نام نوشته میشود :
در برنامه بالا برای اینکه حجم کمتری اشغال شود دستورات به صورت سطری نوشته شدهاند ، شما میتوانید با قرار دادن علامت دونقطه
) در بین دو دستور انها را در یک خط بنویسید ، هعمچنین با قرار دادن علامت ویرگول
) چندین علامت را روی lcd در یک خط نمایش دهید ، همچنین با دستور کما (,) چندین متغییر را در یک خط معرفی کنید
برنامه بالا را با استفاده از جدول lookupstr مینویسیم:
جدول lookupstr نیز مانند جدول lookup است اما جدول lookup برای باز گردانی اعداد و جدول lookupstr برای بازگردانی حروف به کار میرود .
شما جای پایه های kbd که به پایه میکرو متصل است را تغییر دهید ونتیجه راببینید.همیشه نیاز نیست که ورودی یک کلید باشد بعضی وقت ها می توان صفر یا یک شدن یک پین را هم چک کرد.
بعضی وقت ها به کیپد با تعداد کلید بیشتر نیاز است شما با دستور زیر 2 سطر دیگر به تعدا سطر های کیپد اضافه کنید (در مجموع 24 کلید)
X نام پورتی است که کیپد به ان متصل شده است ( 4سطر و4ستون اصلی).
Value مقدار تاخیر در فشردن کلید برای گرفتن لرزش است.
a.b نام پورت و پینی است که دوسطر دیگر به ان متصل شده اند.
'گاهی نیاز از که چندین کلید را به میکرو متصل کنیم ، برای این کار دو راه وجود دارد که روش اول اتصال هر کلید به یک پایه وروش دوم استفاده از صفحه کلید ماتریسی است .
روش اول، چون تعداد زیادی از پایه های میکرو اشغال میشود،کمتر مورد استفاده قرار میگیرد .دستور بسکام برای استفاده از صفحه کلید ماتریسی که از این به بعد به ان kbd میگوییم به شرح زیر است :
کد:
CONFIG KBD = PORTx , DEBOUNCE = value
که portx ، پورتی است که kbd به ان متصل میشود وDEBOUNCE تاخیر کلید است که بین20 تا 255 میلی ثانیه است (هنگامی که کلید فشرده میشود ،براثر لرزش دست چندین با دو کنتاکت ان به هم برخورد میکنند و در نهایت ثابت میشوند اگر از دستور DEBOUNCE استفاده نشوند لرزش به منزله فشردن کلید است )
بعد از تعریف kbd در برنامه نوبت به استفاده از ان است برای این کار از دستور زیر استفاده می شود
کد:
A = Getkbd()
که 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
در برنامه بالا برای اینکه حجم کمتری اشغال شود دستورات به صورت سطری نوشته شدهاند ، شما میتوانید با قرار دادن علامت دونقطه


برنامه بالا را با استفاده از جدول 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
۰۸-دى-۱۳۸۷, ۱۷:۲۷:۳۰
با تشکر فراوان از شما واقعا مثالها و توضیحاتتون کامل بود.
۱۵-دى-۱۳۸۷, ۰۹:۰۳:۲۳
سلام میخوام بدونم که چه جوری میشه وقتی که یه شرطی برقرار شد ولتاژ یکی از پایه های میکرو +5v یا gnd بشه.
با تشکر.
با تشکر.
۱۵-دى-۱۳۸۷, ۱۶:۳۰:۵۳
کد php:
Reset PortX.Y
Set PortX.Y
کد php:
PortX.Y=1
PortX.Y=0
۱۵-دى-۱۳۸۷, ۱۷:۵۴:۰۷
سلام
این که کاری نداره
اینم برنامش برای بسکام
به همین راحتی
اگه پورت a.0به پورتa.1بخره پورتa.2روشن میشه و اگه دوباره بخوره خاموش میشه
تشکر یادت نره
این که کاری نداره
اینم برنامش برای بسکام
کد:
'regfile = "m32def.dat"
$crystal = 1000000
Config Pina.0 = Output
Config Pina.1 = Input
Config Pina.2 = Output
Ddra.1 = 0 : Porta.1 = 1
Reset Porta.0
Do
If Pina.1 = 0 Then Toggle Pina.2
Waitms 50
loop
اگه پورت a.0به پورتa.1بخره پورتa.2روشن میشه و اگه دوباره بخوره خاموش میشه
تشکر یادت نره
۱۲-بهمن-۱۳۸۷, ۲۰:۱۱:۵۶
ممنونم از این که جواب دادید. یه شوال دیگه هم هست:
با این کد میشه پورت های که توی این کد نوشته شده رو GND و VCC کرد؟
Sub Cout(row As Integer , Index As Integer , Model As Byte)
Portb.0 = Lookup(row , Dta1)
Portb.1 = Lookup(row , Dta2)
Portb.2 = Lookup(row , Dta3)
Portb.3 = Lookup(row , Dta4)
End Sub
Dta1:
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
Dta2:
Data 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1
Dta3:
Data 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1
Dta4:
Data 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1
این برنامه با توجه به ورودی row خروجی رو انتخاب میکنه و در port های مشخص شده قرار میده.
اگه این برنامه غلطه درستش چیه؟
با تشکر.
با این کد میشه پورت های که توی این کد نوشته شده رو GND و VCC کرد؟
Sub Cout(row As Integer , Index As Integer , Model As Byte)
Portb.0 = Lookup(row , Dta1)
Portb.1 = Lookup(row , Dta2)
Portb.2 = Lookup(row , Dta3)
Portb.3 = Lookup(row , Dta4)
End Sub
Dta1:
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
Dta2:
Data 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1
Dta3:
Data 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1
Dta4:
Data 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1
این برنامه با توجه به ورودی row خروجی رو انتخاب میکنه و در port های مشخص شده قرار میده.
اگه این برنامه غلطه درستش چیه؟
با تشکر.
۱۲-بهمن-۱۳۸۷, ۲۰:۵۲:۳۳
چرا متغير هات از نوع Integer هستند .
bit و byte هم جواب مي ده !
الكي حافظه ميكرو رو پر نكنيم .
bit و byte هم جواب مي ده !
الكي حافظه ميكرو رو پر نكنيم .
۱۲-بهمن-۱۳۸۷, ۲۱:۲۰:۳۹
با عرض پوزش متغیر ها که ربطی به سوال من ندارن میشه به من بگید کد من درسته یا نه؟
اگه غلطه درستش چیه؟
سلام شرمنده میشه به این لینک یه نگاهی بندازید؟ من یه سوال اونجا کردم . اون رو اگه جواب بدید ممنون میشم
http://circuit.ir/1387/09/05/%d8%b3%d8%a...comment-42
با تشکر.
اگه غلطه درستش چیه؟
سلام شرمنده میشه به این لینک یه نگاهی بندازید؟ من یه سوال اونجا کردم . اون رو اگه جواب بدید ممنون میشم
http://circuit.ir/1387/09/05/%d8%b3%d8%a...comment-42
با تشکر.
۱۴-بهمن-۱۳۸۷, ۱۴:۵۹:۳۶
(۰۳-دى-۱۳۸۷, ۲۱:۵۵:۲۸)terip2008 نوشته است: [ -> ]واسه خودم هم سواله كه چجوري مي شه .
با ولتاژ كه نمي شه . دليلشو مي دونيد .
بگيم يه كد بفرستيم و ببينيم اگه همون اومد يعني وصله .
مشكله اينجاست هم زمان نمي تونيم بفرستيم و بگيريم .
سلام
مهندس تریپ اگه از دو میکرو استفاده کنیم این روش جواب می ده؟( اگه میکروهای دو هسته ای باشن شاید با یه میکرو هم بشه!)
۱۴-بهمن-۱۳۸۷, ۲۲:۴۷:۱۱
اون برنامه که به نظر درسته .!
از خنده مردم ..
دو تا میکرو که خوب می شه . میکرو دوهسته ای هم من ندیدم .
با یه میکرو و بافر سریال هم می شه .
نقل قول: مهندس تریپ!!!!
از خنده مردم ..
دو تا میکرو که خوب می شه . میکرو دوهسته ای هم من ندیدم .
با یه میکرو و بافر سریال هم می شه .