ايران ويج

نسخه‌ی کامل: تشخیص اتصال دو پایه میکرو به هم
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3
میشه یه نمونه کد برام بزاری؟

با تشکر.
اينم از كتاب اقاي يك نفر


'گاهی نیاز از که چندین کلید را به میکرو متصل کنیم ، برای این کار دو راه وجود دارد که روش اول اتصال هر کلید به یک پایه وروش دوم استفاده از صفحه کلید ماتریسی است .

روش اول، چون تعداد زیادی از پایه های میکرو اشغال میشود،کمتر مورد استفاده قرار میگیرد .دستور بسکام برای استفاده از صفحه کلید ماتریسی که از این به بعد به ان 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 
Config Lcdpin 
Pin Db4 Portd.0 Db5 Portd.1 Db6 Portd.2 Db7 Portd.3 Portd.4 Rs Portd.5
Config Kbd 
Portb Debounce 20
Dim A 
As Byte
Q
:
Getkbd()
If 
15 Then : Goto End If
If 
0 Then Locate 1 Lcd "qwer" End If
If 
1 Then Locate 1 Lcd "asdf" End If
If 
3 Then Locate 1 Lcd "FDFD" End If
If 
4 Then Locate 1 Lcd "aFDf" End If
If 
5 Then Locate 1 Lcd "SAKr" End If
If 
6 Then Locate 1 Lcd "1234" End If
If 
7 Then Locate 1 Lcd "5687" End If
If 
8 Then Locate 1 Lcd "7541" End If
If 
9 Then Locate 1 Lcd "IO12" End If
If 
10 Then Locate 1 Lcd "wqsf" End If
If 
11 Then Locate 1 Lcd "1l2k" End If
If 
12 Then Locate 1 Lcd "3,m5" End If
If 
13 Then Locate 1 Lcd ")(*(" End If
If 
14 Then Locate 1 Lcd "****" End If
If 
15 Then Locate 1 Lcd "++++" End If
Locate 2 Lcd A : Goto Q
End 

در برنامه بالا برای اینکه حجم کمتری اشغال شود دستورات به صورت سطری نوشته شدهاند ، شما میتوانید با قرار دادن علامت دونقطهShy ) در بین دو دستور انها را در یک خط بنویسید ، هعمچنین با قرار دادن علامت ویرگولWink) چندین علامت را روی 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 Portd.4 Rs Portd.5
Config Kbd 
Portb Debounce 20 Rows Row5 Pina.0 Row6 Pina.1
Dim A 
As Byte
Q
:
Getkbd()
If 
16 Then : Goto End If
Locate 1 Lcd A : Goto Q
End 
با تشکر فراوان از شما واقعا مثالها و توضیحاتتون کامل بود.
سلام میخوام بدونم که چه جوری میشه وقتی که یه شرطی برقرار شد ولتاژ یکی از پایه های میکرو +5v یا gnd بشه.

با تشکر.
کد php:
Reset PortX.Y
Set PortX
.
کد php:
PortX.Y=1
PortX
.Y=
سلام
این که کاری نداره
اینم برنامش برای بسکام
کد:
'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 های مشخص شده قرار میده.

اگه این برنامه غلطه درستش چیه؟

با تشکر.
چرا متغير هات از نوع Integer هستند .
bit و byte هم جواب مي ده !
الكي حافظه ميكرو رو پر نكنيم .
با عرض پوزش متغیر ها که ربطی به سوال من ندارن میشه به من بگید کد من درسته یا نه؟

اگه غلطه درستش چیه؟
سلام شرمنده میشه به این لینک یه نگاهی بندازید؟ من یه سوال اونجا کردم . اون رو اگه جواب بدید ممنون میشم

http://circuit.ir/1387/09/05/%d8%b3%d8%a...comment-42

با تشکر.
(۰۳-دى-۱۳۸۷, ۲۱:۵۵:۲۸)terip2008 نوشته است: [ -> ]واسه خودم هم سواله كه چجوري مي شه .

با ولتاژ كه نمي شه . دليلشو مي دونيد .

بگيم يه كد بفرستيم و ببينيم اگه همون اومد يعني وصله .
مشكله اينجاست هم زمان نمي تونيم بفرستيم و بگيريم .

سلام
مهندس تریپ اگه از دو میکرو استفاده کنیم این روش جواب می ده؟( اگه میکروهای دو هسته ای باشن شاید با یه میکرو هم بشه!)
اون برنامه که به نظر درسته .!


نقل قول: مهندس تریپ
!!!!
از خنده مردم ..


دو تا میکرو که خوب می شه . میکرو دوهسته ای هم من ندیدم .

با یه میکرو و بافر سریال هم می شه .
صفحه‌ها: 1 2 3