آموزش کامل بسکام به همراه مثال - نسخه قابل چاپ +- Parsi Coders (http://parsicoders.com) +-- انجمن: Electronics and Robotics (http://parsicoders.com/forumdisplay.php?fid=149) +--- انجمن: micro (http://parsicoders.com/forumdisplay.php?fid=154) +---- انجمن: AVR (http://parsicoders.com/forumdisplay.php?fid=155) +---- موضوع: آموزش کامل بسکام به همراه مثال (/showthread.php?tid=3685) صفحات
1
2
|
آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 سلام! این آموزش توسط کاربر کد پیاچپی: omidvarshoei ----------------------------- صل اول : آشنايي مختصر با محيط بسکام کار با نرم فزار بسکام بسيار ساده است ، کافي است کد خود را در اديتور موجود تايپ کنيد و از منوي Program گزينه ي Compile را انتخاب نماييد . در زير به بيان برخي از ويزگي هاي اين کامپايلر پرداخته ايم : - امکان شبيه سازي برنامه نوشته شده . - امکان پروگرام کردن مستقيم ميکرو (بدون نياز به نرم افزار جانبي ) - داراي کليه ابزار ها و برنامه هاي مورد نياز براي کار با امکانات جانبي (برنامه هاي براي ايجاد کد LCD کاکتري و گرافيکي و رنگي ، ترمينال براي پورت سريال و...) - اديتور قدرتمند با قابليت شناسايي دستور - امکان ايجاد گزارش از برنامه نوشته شده . - نمايش تصوير ميکرو کنترلر موجود در برنامه . - و.... در اين فصل قصد نداريم تا با توضيحات اضافه شما را خسته کنيم ، به همين دليل فقط موارد اصلي را بررسي نموده و موارد ديگر را به ضمائم انتقال داده ايم . در صورتي که مايليد از شبيه ساز نرمِ افزار استفاده کنيد ، بعد از خواندن اين فصل به بخش ضمائم برويد . در صورتي که به نرم افزار قدرتمند پروتوس دسترسي داريد ، آموزش هاي پروتئوس در مسير زير را نگاه کنيد . قطعا پروتوس امکانات بيشتري را در اختيار شما ميگزارد : \Ebook\Proteus نحوه تهيه و نصب نرم افزار بسکام در بخش ضمائم آورده شده است . آشنايي مختصر با محيط بسكام File : 1- New : با زدن اين گزينه يك صفحه جديد براي نوشتن برنامه جديد باز مي شود . اين صفحه مجهز به ويرايشگر دستورات مي باشد ، يعني در صورتي كه دستوري درست وارد شود به رنگ آبي در ميايد ولي اگر دستور اشتباه باشد به رنگ معمولي (مشكي ) است (اين مورد براي تعداد كمي از دستورات اجرا نمي شود) . 2- Open : با زدن اين گزينه مي توانيد برنامه اي را كه از قبل ذخيره كرده ايد باز كنيد (برنامه ها با پسوند .BAS ذخيره ميشوند ، شما همچنين ميتوانيد برنامه خود را در داخل برنامه هاي ويرايشگر ديگر مانند Notepad بنويسيد و از اين پنجره آن را باز کنيد ). 3-Close : با انتخاب اين گزينه پنجره اي كه براي نوشتن برنامه باز شده ؛ بسته مي شود. در صورتي که شما صفحه برنامه را که در پنجره جديد نوشته ايد ذخيره نکرده باشيد ، از شما در مورد ذخيره کردن برنامه سوال مي شود. 4-Save و Save as : اين دو گزينه براي ذخيره كردن پروژه به كار ميروند. 5-Print Preview وPrint : اين دو گزينه براي چاپ كردن برنامه استفاده ميشوند با زدن گزينه Print Preview مي توانيد نسخه قابل چاپ را قبل از چاپ مشاهده كنيد. 6- Exit : با زدن اين گزينه برنامه بسكام به طور كامل بسته مي شود ؛ اما اگر برنامه شما ذخيره نشده باشد ؛در مورد ذخيره برنامه از شما پرسيده مي شود. 7- زير گزينه Exit : چند گزينه ديگر وجود دارد كه اين گزينه ها براي دسترسي سريع به آخرين فايل هاي كه باز بوده اند مي باشد. Edit : 1- UndoوRedo : اين دو گزينه براي دست يابي به اخرين تغييرات انجام شده مي باشد. 2- Copyو CutوPaste : اين سه گزينه براي برداشتن يا كپي كردن قسمتي از متن به جاي ديگر ميباشد. 3- Find next وFind : اين دو گزينه براي پيدا كردن قسمتي از متن در برنامه مي باشد. نحوه كار به اين صورت است كه بعد از انتخاب گزينه Find ، پنجره جديدي باز مي شود كه بايد در قسمت Text to find متن مورد نظر را تايپ كنيد. بعد روي Ok كليك كنيد تا متن مورد نظر در برنامه انتخاب شود . Findnext متن هاي كه در خط هاي بعدي برنامه وجود دارد پيدا مي كند . 4- Replace : با اين گزينه شما مي توانيد متني را جايگزين متن موجود در برنامه نماييد ، يعني در قسمت Text To Find متن يا کلمه مورد جستجو که بايد توسط متن يا کلمه ديگري جايگزين شود را تايپ کنيد و در قسمت Replace Wath متني را که بايد جايگزين شود تايپ مي کنيم . 5- دو گزينه بعدي براي گذاشتن علامت در خطوط مختلف و پرش به آنها مي باشد . 6- IndentBlock و UnindentBlock : اين دو گزينه متن انتخاب شده را به اندازه يك Tab به چپ يا راست منتقل ميكند . 7- Remark/Unremark Block : با اين گزينه ميتوانيد بخشي از برنامه نوشته شده را علامت گزاري کنيد . 8- insert ascii : با انتخاب اين گزينه ي پنجره اي باز مي شود که در آن کد اسکي کارکتر هاي مختلف وجود دارد ، با کليک کردن روي هر مورد ، کد مذکور به برنامه اضافه مي شود . View : 1- Pin Layout: با انتخاب اين گزينه پنجره اي باز مي شود ، که در آن پايه هاي ميکرو مورد استفاده و شکل آن آورده شده است ، با بردن موس روي هر پايه نقش آن در زير تصوير نوشته مي شود . 2- Pdf Veiwer: با انتخاب اين گزينه شما ميتوانيد مشخصات ميکرو مورد استفاده را ببينيد . 3- Error Panel: با انتخاب اين گزينه پنجره ي خطاها باز مي شود ، اين پنجره بعد از کامپايل کردن برنامه ، در صورت و جود خطا خودکار باز مي شود . 4-Tip : با انتخاب اين گزينه ي پنجره Tip باز مي شود ، در اين پنجره نکاتي در مورد برنامه نويسي و ... وجود دارد . Program : 1- Compile : با انتخاب اين گزينه برنامه نوشته شده به زبان ماشين ترجمه مي شود وفايل هاي از قبيل هگز و گزارش و...ساخته مي شود .اگر در اين مرحله برنامه داراي خطا باشد پنجره اي باز مي شود كه در آن خطاها نمايش داده مي شوند ؛ با كليك كردن روي هر خطا ، خط مربوط كه داراي خطا است قرمز مي شود . 2- Syntax check : با انتخاب اين گزينه برنامه از نظر غلط املايي چك مي شود (با زدن گزينه Compile ديگر نيازي به زدن اين گزينه نمي باشد). 3- Show result : با انتخاب اين گزينه پنجرهاي باز مي شود كه در آن گزارش كلي از برنامه وجود دارد. 4-Simulate : با انتخاب اين گزينه پنجره شبيه سازي باز مي شود و شما در اين پنجره كه داراي LCD و كيبرد و مبدل انالوگ به ديجتال و...ميباشد مي توانيد برنامه خود را شبيه سازي كنيد (براي دريافت اطلاعات بيشتر به ضمائم مراجعه کنيد). 5-Send To Chip : با انتخاب اين گزينه وارد محيط پروگرام كردن ميكرو مي شويد كه در قسمت ضمائم مفصلا توضيح داده شده است . Tools و Options : در اين دو منو ابزاري براي کار برنامه و ساير قطعات جانبي وجود دارد ، با زير منو هاي موجود در اين منوها در طول برنامه آشنا خواهيم شد . مفهوم برخي از عبارتي که از اين به بعد ميبينيم : 1- VCC وGND : منظور از اين دو کلمه پايه هاي تغذيه مي باشد که معمولا VCC ، 5 ولت وGND صفر ولت است ، شما مي توانيد اين تغذيه را از پورت USB کامپيوتر خود بگيريد . 2- پورت (PORT) : هرميکرو داراي چندين پورت مي باشد و هر پورت داراي چندين پايه است (معمولا 8 پايه) براي مثال ميکرو مگا 32 (ATmega32) داراي 4 پورت A,B,C,D مي باشد که هر پورت 8 پايه دارد و پورت A (PORTA) از پايه 33 تا 40 ميکرو و پايه شماره 40 پين A.0 (PINA.0) و پايه 39 پين (PINA.1) A.1 ... و پايه 33 پين (PINA.7) A.7 مي باشد )براي ديدن ساير اطلاعات ميکروها به ديتاشيت آنها مراجعه کنيد) . 3- پين (PIN): به هر پايه هاي ميکرو پين نيز گفته مي شود . مثلا پين A.1 ، يعني پايه شماره يک پورت A ، که در ميکرو مگا 16 پايه شماره 39 ميباشد . 4- کريستال : ميکرو براي تنظيم زمان براي انجام کارها به يک نوسان ساز نياز دارد که به اين نوسان ساز کريستال گفته مي شود حداکثر کريستال مورد استفاده برايAVR هاي معمولي 16 مگاهرتز مي باشد . همچنين ميکرو هاي AVR داراي نوسان ساز داخلي مي باشد ،که در صورت نياز مي توانيد از آن استفاده کنيد. کريستال به دو پايه Xtal 1 و Xtal2 متصل مي شود ، اين پايه ها براي ميکرو ATmega32 پايه هاي 12 و 13 مي باشد . 5- پين هايAVR داراي چندين نقش ميباشد ، مثلا پين A.0 (PINA.0) (پايه شماره 40 ) در ATmega32 علاوه براينکه ميتواند به عنوان ورودي يا خروجي استفاده شود ميتواند به عنوان ورودي مبدل انالوگ به ديجتال استفاده گردد . شما نميتوانيد در يک زمان از دونقش يک پين يا پورت استفاده کنيد . براي فهميدن نقش ديگر پين ها به ديتاشيت آنها مراجعه نماييد . 6- رجيستر حافظه : مکان هاي از حافظه ي ميکرو ميباشد که اعداد و متغير ها در آنجا ذخيره ميشوند . 7- آدرس حافظه : براي سادگي کار با حافظه ها ، آن ها را به بخش هاي کوچکي تقسيم ميکنند ، شما ميتوانيد اين خانه ها را آدرس دهي کنيد و متغير يا ثابت هاي مورد نظر را ذخيره کنيد . 8- پروگرامر : پروگرامر دستگاهي است که کد هگز ايجاد شده توسط کامپايلر را از کامپيوتر به ميکرو منتقل ميکند ، پروگرامر ها از يک طرف به ميکرو و از طرف ديگر به يکي از پورت هاي کامپيوتر متصل ميشوند . RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 فصل دوم : دستورات اولیه بسکام در اين فصل قبل از هر کاري ، اقدام به بررسي نحوه نوشتن برنامه و دستورات اوليه نموده ايم . بعد از اينکه با دستورات اوليه آشنا شديد ، نحوه کار با پورت ها وLCD کارکتري را خواهيد آموخت ، يادگيري نحوه کار با اين دو مورد شما را در درک ادامه اموزش و تست کردن مثال ها و پروژه ها ياري مي دهد . براي درک بهتر مثال ها و پروژه ها ، آنها را در بسکام کپي کنيد و بعد از کامپايل کردن آنها ، عملکردشان را در عمل يا با نرم افزار پروتوس مشاهده کنيد ، مشاهده نحوه عملکرد دستورات ، شما را در يادگيري ياري ميدهد . مراحل نوشتن يک برنامه جديد (بدنه يک برنامه) : بعد از باز کردن برنامه بسکام گزينه New را از منوي File انتخاب کنيد صفحه جديدي که باز مي شود محل نوشتن برنامه مي باشد . در زبان بيسيک هميشه اولين خط برنامه مربوط به معرفي ميکرو مي باشد: $regfile = "micro name" که گزينه micro neme کتابخانه ميکرو مورد استفاده را مشخص مي کند : اگر در محل نصب بسکام دقت کرده باشين فايل هاي زيادي (در بسکام 1.11.9.8 تعداد 72 تاست) را با پسوند dat مشاهده مي کنيدکه داراي اسامي زير مي باشند هر فايل مربوط به يک شماره ميکرو بوده و حاوي اطلاعات مورد نياز براي شناسايي ميکرو به بسکام مي باشد . شما مي توانيد با نرم افزار ويرايشگر متن مثل NotePad فايل هاي فوق رو باز کرده و اطلاعاتش رو مشاهده و حتی ویرایش کنيد . مثال : $regfile = "1200def.dat" 'for AT90S1200 $regfile = "2313def.dat" 'for AT90S2313 $regfile = "2323def.dat" 'for AT90S2323 $regfile = "2333def.dat" 'for AT90S2333 $regfile = "2343def.dat" 'for AT90S2343 $regfile = "4414def.dat" 'for AT90S4414 $regfile = "4433def.dat" 'for AT90S4433 $regfile = "4434def.dat" 'for AT90S4434 $regfile = "8515def.dat" 'for AT90S8515 $regfile = "8535def.dat" 'for AT90S8535 $regfile = "86rf401.dat" 'for AT86RF401 $regfile = "attiny12.dat" 'for ATtiny12 $regfile = "attiny13.dat" 'for ATtiny13 $regfile = "attiny15.dat" 'for ATtiny15 $regfile = "attiny22.dat" 'for ATtiny22 $regfile = "attiny24.dat" 'for ATtiny24 $regfile = "attiny25.dat" 'for ATtiny25 $regfile = "attiny26.dat" 'for ATtiny26 $regfile = "attiny44.dat" 'for ATtiny44 $regfile = "attiny45.dat" 'for ATtiny45 $regfile = "attiny84.dat" 'for ATtiny84 $regfile = "attiny85.dat" 'for ATtiny85 $regfile = "attiny88.dat" 'for ATtiny88 $regfile = "attiny261.dat" 'for ATtiny261 $regfile = "attiny461.dat" 'for ATtiny461 $regfile = "attiny861.dat" 'for ATtiny861 $regfile = "attiny2313.dat" 'for ATtiny2313 $regfile = "m103def.dat" 'for ATMega103 $regfile = "m1280def.dat" 'for ATMega1280 $regfile = "m128103.dat" 'for ATMega128 $regfile = "m128can.dat" 'for AT90CAN128 $regfile = "m128def.dat" 'for ATMega128 $regfile = "m161def.dat" 'for ATMEGA161 $regfile = "m162def.dat" 'for ATmega162 $regfile = "m163def.dat" 'for ATMEGA163 $regfile = "m164pdef.dat" 'for ATMEGA164P $regfile = "m165def.dat" 'for ATMega165 $regfile = "m168def.dat" 'for ATmega168 $regfile = "m169def.dat" 'for ATmega169 $regfile = "m16def.dat" 'for ATmega16 $regfile = "m2560def.dat" 'for ATMega2560 $regfile = "m2561def.dat" 'for ATMega2561 $regfile = "m323def.dat" 'for ATMEGA323 $regfile = "m324pdef.dat" 'for ATMEGA324P $regfile = "m325def.dat" 'for ATMEGA325 $regfile = "m329def.dat" 'for ATmega329 $regfile = "m32def.dat" 'for ATMEGA32 $regfile = "m48def.dat" 'for ATmega48 $regfile = "m406def.dat" 'for ATmega406 $regfile = "m603def.dat" 'for ATmega603 $regfile = "m640def.dat" 'for ATMega640 $regfile = "m644def.dat" 'for ATMEGA644 $regfile = "m64def.dat" 'for ATMEGA64 $regfile = "m649def.dat" 'for ATmega649 $regfile = "m645def.dat" 'for ATMEGA645 $regfile = "m8515.dat" 'for ATmega8515 $regfile = "m8535.dat" 'for ATmega8535 $regfile = "m88def.dat" 'for ATmega88 $regfile = "m8def.dat" 'for ATmega8 $regfile = "m1281def.dat" 'for ATMega1281 $regfile = "usb1287.dat" 'for AT90USB1287 $regfile = "usb162.dat" 'for AT90USB162 $regfile = "m644pdef.dat" 'for ATMEGA644P $regfile = "m88pdef.dat" 'for ATmega88P $regfile = "m168pdef.dat" 'for ATmega168P $regfile = "m328pdef.dat" 'for ATmega328P $regfile = "m1284pdef.dat" 'for ATMEGA1284P $regfile = "usb646.dat" 'for AT90USB646 $regfile = "m32can.dat" 'for AT90CAN32 $regfile = "m32U4def.dat" 'for ATMEGA32U4 $regfile = "xm128A1def.dat" 'for ATXMega128A1 خط بعدي معرفي کريستال مي باشد : $crystal=x که x کريستال مورد استفاده بر حسب هرتز است . مانند : (در اينجا کريستال 8 مگا هرتز است) . $crystal = 8000000 اکثر AVR ها به صورت پيش فرض نوسان ساز RC داخلي 1MHz فعال است . در صورت تغيير بايد در فيوزبيت ها هم لحاظ شود . ( در بخش ضمايم نحوه کار با فيوزبيت ها موجود است ) معرفي کريستال به صورت دقيق براي زمان بندي هاي ميکرو لازم است . در صورت تعریف اشتباه کریستال زمان بندی های میکرو تاخیر ها و ... هم عوض می شود . فرضا اگر کریستال 1MHz داخلی استفاده شود و در برنامه 2MHz معرفی شود , تاخیرها نصف مقدار معمول طول می کشد . توجه شود که اکثر دستورات ( همچون پورت سریال و ارتباطات دیگر - LCD و ... ) زمان پارمتر مهمی محسوب می شود و بسکام با توجه به کریستال زمان مورد نظر را ایجاد می کند و در صورت تعریف اشتباه دستور مورد اجرا نشده و یا دیتای اشتباه ارسال می کند ! شما همچنين ميتوانيد مقدار کريستال را بر يک عدد تقسيم کنيد ( اين کار براي مواردي که به يک کريستال دسترسي نداريد است می تواند مفید واقع شود ) Config Clockdiv = Constant که Constant برابر اين مقادير است : 1 , 2 , 4 , 8 ,16 , 32 ,64 , 128 , 256. مثال : $regfile = "m8def.dat" $crystal = 8000000 Config Clockdiv = 8 از اين به بعد ميکرو با فرکانس 1 مگا هرتز کار ميکند بعد از معرفي کريستال نوبت به معرفي امکانات مي باشد (امکانات شامل تايمر ها و ADC (مبدل انالوگ به ديجتال) و ورودي يا خروجي قرار دادن پورت ها و .... مي باشد ) . معرفي امکانات با دستور زير شروع مي شود مي باشد : Config مانند : Config Lcd = 16 * 2 بعد از معرفي يا پيکر بندي امکانات جانبي نوبت به استفاده از آنها مي باشد معمولا براي استفاده از امکانات بايد آن را درون يک حلقه قرار ميدهند . ودر نهايت برنامه با end به پايان مي رسد . پس هميشه يک برنامه در بسکام داراي قالب زير است : معرفي ميکرو تعيين مقدار کريستال پيکربندي امکانات جانبي معرفي متغير ها و.... (در صورت وجود ) شروع حلقه ( در صورت وجود ) برنامه اصلي پايان حلقه ( در صورت وجود ) پايان برنامه زير برنامه ها ( در صورت وجود ) در ادامه و با مثال هاي مختلف با نحوه برنامه نويسي آشنا خواهيم شد . دستور ات مربوط به ورودي وخروجي ها : در بسکام براي استفاده از يک پورت بايد آن را به صورت ورودي يا خروجي قرار داد : يک پورت هنگامي به عنوان خروجي تعريف مي شود که بخواهيم از آن ولتاژ بگيريم و يک پورت هنگامي به عنوان ورودي قرار ميگيرد که بخواهيم به آن ولتاژ بدهيم . (دادن ولتاژ را به منزله کليدي که يک سر آن به 5 ولت است و گرفتن ولتاژ را به منزله LED که يک سر آن به گراند متصل است در نظر بگيريد) براي قرار دادن يک پورت به عنوان ورودي از دستور زير استفاده ميکنيم: Config PORTX = Input که پورت x يکي از پورت هاي ميکرو مي باشد . و براي قرار دادن يک پورت به عنوان خروجي از دستور زير استفاده ميکنيم : Config PORTX = Output که پورت x يکي از پورت هاي ميکرو مي باشد. مانند: Config PORTA = Output پورت A به عنوان خروجي تعريف شده است . Config PORTB = Input پورت B به عنوان ورودي تعريف شده است. همچنين شما مي توانيد يکي از پايه هاي پورت را به عنوان ورودي يا خروجي معرفي کنيد . مانند : Config PORTA.1 = Input پايه شماره 1 از پورت A به عنوان ورودي تعريف شده است. Config PORTB.7 = Input پايه شماره 7 از پورت B به عنوان ورودي تعريف شده است . Config PORTC.5 = Output پايه شماره 5 از پورت C به عنوان خروجي تعريف شده است . نکته : در صورتی که پورت یا پایه ای تعریف نشود ورودی می باشد ! دستورات مربوط به پورت ها : Toggle : اين دستور يک بايت يا بيت را برعکس ميکند، بايت ميتواند يک پورت يا هر چيز ديگر باشد. Set : اين دستور يک بيت يا بايت را يک ميکند، بيت ميتواند يک پين از پورت يا هر چيز ديگر باشد. Reset : اين دستور يک بيت يا بايت را صفر ميکند، بيت ميتواند يک پين از پورت يا هر چيز ديگر باشد. Alias : از اين دستور براي تغير نام متغير استفاده مي شود . مانند: Config PORTB.1 = Output Led Alias PORTB.1 Set Led حال شما مي توانيد در برنامه، بجاي PORTB.1 از نام LED استفاده نماييد . Bitwait : با اين دستور ميکرو مدام يک پين را چک مي کند ، هنگامي برنامه به خط بعدي مي رود که پايه 1 يا 0 شد ( صفر يا يک بودن در برنامه مشخص مي شود) اين دستور به فرم کلي زير است : Bitwait X , Set/Reset X : نام پايه است که قرار است چک شود ،مثل PINA.0 يا PINB.7 يا... SET/RESET : شرط دستور ميتواند SET يا ريست شدن پايه مورد نظر باشد ، مثلا با دستور : Bitwait PORTA.0 , Set هنگامي که PORTA.0 يک شد ، دستورات ادامه اجرا مي شود . هنگامي که PORTA.0 يک شد ، دستورات ادامه اجرا مي شود . مثال : ( در مسير Example\1 - Bitwait موجود است .) $regfile = "m16def.dat" $crystal = 1000000 Config PORTB.7 = Input Config PORTB.6 = Output Bitwait PINB.7 , Reset Set PORTB.6 Bitwait PINB.7 , Set Reset PORTB.6 End در مثال بالا همانگونه که مشاهده مي کنيد از ميکرو مگا 16 (ATmega16) ، کليد و LED استفاده شده است . دوخط اول برنامه معرفي ميکرو و کريستال ميباشد ، ميکرو مگا 16 و کريستال 1 مگا هرتز است ( از کريستال داخلي ميکرو استفاده شده است) . در خط سوم پورت B.7 (پايه 8 ميکرو) به عنوان ورودي تعريف شده است و کليد به آن متصل گرديده . در خط چهارم پايه B.6 ( پايه 7 ميکرو ) به عنوان خروجي تعريف شده است و LED به آن متصل گرديده ، در خط پنجم توسط دستور Bitwait پايه B.7 چک مي شود و هنگامي که اين پايه ريست شده (به زمين متصل شد يا صفر شد) CPU ميکرو به خط بعدي ميرود ( توجه داشته باشيد که برنامه روي دستور Bitwait قفل مي شود و تا زماني که شرط (0 يا يک شدن پايه) بر قرار نباشد اين قفل شدن ادامه دارد و برنامه به خط بعدی نمی رود ) در خط بعدي يا خط ششم ، پايه B.6 يک مي شود و LED روشن مي شود ، در خط بعدي دو باره پايهB.7 چک مي شود ، اين بار شرط برعکس حالت قبل است ، يعني اگر پايه 1 شود CPU ميکرو به خط بعدي پرش ميکند و LED را خاموش ميکند. برنامه با دستور End پايان ميابد. وظيفه مقاومت در اينجا بالا نگه داشتن ( پول آپ ) پايه B.7 ميباشد ( سطح يک را تصحيح ميکند ، مثال را بدون مقاومت اجرا کنيد تا ... ) دستورات تاخير : براي ايجاد تاخير در برنامه از دستور wait استفاده مي شود. دستور wait به سه شکل زير است: Waitus X : اين دستور براي ايجاد تاخير ميکرو ثانيه اي مي باشد. X مقدار تاخير ميباشد که بين 1تا 65535 ميکرو ثانيه مي باشد. مانند : Waitus 500 تاخير به مدت 500 ميکرو ثانيه . Waitms X : اين دستور براي ايجاد تاخير ميلي ثانيه اي مي باشد .X مقدار تاخير ميباشد که بين 1تا 65535 ميلي ثانيه مي باشد. مانند : Waitms 720 تاخير به مدت 720 ميلي ثانيه . Wait X : اين دستور براي ايجاد تاخير ثانيه اي مي باشد .X مقدار تاخير ميباشد که عددي بيشتر از يک ثانيه مي باشد. مانند : Wait 1000 تاخير به مدت 1000 ثانيه Delay : اين دستور در هر جا که استفاده شود يک تاخير 1ميلي ثانيه ايجاد مي شود . توجه کنيد که هر جا دستور wait به کار رود برنامه در آنجا به اندازه زمان مورد نظر متوقف مي شود و دستورات تاخيري دقيق نبوده و در صورت استفاده از وقفه ها و فعال شدن وقفه در زمان تاخير مدت زمان اجراي برنامه وقفه هم به زمان تاخير اضافه مي شود . ( کار با وقفه ها در فصل هاي بعدي موجود است ) در تاخیر میکرو ثانیه نمی توان متغیری در نظر گرفت و فقط باید عدد وارد کرد RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 سلام ----------- دستورات حلقه وپرش : گاهي اوقات نياز است برنامه مدام اجرا شود يا در هنگام اجراي برنامه از يک خط به خط ديگري پرش شود. براي اين کار از حلقه ها و دستورات پرش استفاده مي شود ، دراينجا به معرفي حلقه Do – Loop را پرداخته و بقيه حلقه ها در بخش بعدي موجود است . شروع اين حلقه با Do و پايان آن با Loop است : Do برنامه Loop در اين حلقه ، هنگامي که CPU به دستور Loop مي رسد ، به ابتداي حلقه يا دستور DO پرش مي کند . براي پرش از يک قسمت برنامه به قسمت ديگر مي توان از دستور Jmp يا Goto استفاده کرد (از دستورات فوق به عنوان حلقه نيز مي توان استفاده کرد) . مانند : Q: برنامه نوشته شده Jmp Q مثال دوم : W: برنامه نوشته شده Goto W حال با توجه به توضيحات بالا برنامه يک مدار چشمک زن را با هم مي نويسيم : (ميکرو مورد استفاده مگا 16 (ATmega16 ) و کريستال 8 مگا هرتز است و 8 عدد LED با مقاومت 330 اهم به پورت (PORTA) A متصل است) مر حله اول معرفي ميکرو مي باشد $regfile = "m16def.dat" مرحله بعد معرفي کريستال مي باشد $crystal = 1000000 (دو مرحله بالا در همه برنامه ها ثابت مي باشد(وجود دارد)) مرحله بعد قرار دادن پورت A به عنوان خروجي مي باشد (چون ما ميخواهيم از آن ولتاژ بگيريم بايد آن را به عنوان خروجي قرار دهيم) Config PORTA = Output مرحله بعد ايجاد يک حلقه مي باشد (در اينجا براي ايجاد حلقه مي توانيد ، از تمام موارد گفته شده در بالا استفاده کنيد) Do مرحله بعد روشن کردن Led ها مي باشد(ما در اينجا آنها را يک در ميان روشن ميکنيم) Set PORTA.0 (روشن کردن LED متصل شده به پايه 40 ميکرو (PORTA.0)) Reset PORTA.1 (خاموش کردن LED متصل شده به پايه 39 ميکرو (PORTA.1)) Set PORTA.2 (روشن کردن LED متصل شده به پايه 38 ميکرو (PORTA.2)) Reset PORTA.3 (خاموش کردن LED متصل شده به پايه 37 ميکرو (PORTA.3)) Set PORTA.4 (روشن کردن LED متصل شده به پايه 36 ميکرو (PORTA.4)) Reset PORTA.5 (خاموش کردن LED متصل شده به پايه 35 ميکرو (PORTA.5)) Set PORTA.6 (روشن کردن LEDمتصل شده به پايه 34 ميکرو (PORTA.6)) Reset PORTA.7 (خاموش کردن LED متصل شده به پايه 33 ميکرو (PORTA.7)) مرحله بعد ايجاد يک تاخير زماني است Waitms 300 (تاخير به مدت 300 ميلي ثانيه (براي اينکه روشن بودن LED ها ديده شود)) مرحله بعد برعکس کردن وضعيت پايه هاي موجود است (براي اينکه LED هاي روشن ، خاموش شود و LED هاي خا موش ، روشن شود) . Toggle PORTA (اين دستور همانگونه که قبلا گفته شد يک بايت را برعکس ميکند که در اينجا بايت مورد نظر 8 پايه پورت A است) . مرحله بعد ايجاد تاخير زماني است : Waitms 300 مرحله بعد نوشتن پايان حلقه مي باشد : Loop (هنگامي که ميکرو اين خط را ميخواند به خط Do پرش ميکند) و در نهايت برنامه با دستور زير پايان مي يابد : End چون برنامه هیچگاه پایان نمی یاد و پیوسته دستورات موجود در حلقه تکرار می شود پس می توان از دستور فوق چشم پوشی کرد ! برنامه بالا را به دو شکل زير مي توان نوشت : برنامه اول : (در مسير Example\2 - Flasher موجود است .) $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Do Set PORTA.0 Reset PORTA.1 Set PORTA.2 Reset PORTA.3 Set PORTA.4 Reset PORTA.5 Set PORTA.6 Reset PORTA.7 Waitms 300 Toggle PORTA Waitms 300 Loop End برنامه دوم : ( در مسير Example\2 - Flasher موجود است ) $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Do Set PORTA.1 Reset PORTA.0 Set PORTA.3 Reset PORTA.2 Set PORTA.5 Reset PORTA.4 Set PORTA.7 Reset PORTA.6 Waitms 300 Set PORTA.0 Reset PORTA.1 Set PORTA.2 Reset PORTA.3 Set PORTA.4 Reset PORTA.5 Set PORTA.6 Reset PORTA.7 Waitms 300 Loop End مدار به کار رفته اين برنامه در شکل مقابل مشاهده مي شود : روش هاي ديگر هم براي نوشتن برنامه بالا وجود دارد که به عهده شما گذاشته مي شود . LCD کاراکتري : اين نوع LCD در چندين نوع ساخته ميشوند و داراي چند سطر و ستون مي باشند که نام گذاري آنها برمبناي سطر وستون مي باشد . در زير نام اين LCD آورده شده است : 16*1: که داراي يک سطر و 16 ستون مي باشد. 16*1a: که داراي يک سطر و 16 ستون مي باشد و مي توان ستون هشتم به بعد آن را در خط دوم آدرس دهي کرد . 16*2: که داراي 2 سطر و 16 ستون مي باشد. 16*4 : که داراي 4 سطر و 16 ستون مي باشد . 20*2 : که داراي 2 سطر و 20 ستون مي باشد. 20*4 : که داراي 4 سطر و 20 ستون مي باشد. 40*2 : که داراي 2 سطر و 40 ستون مي باشد. 40*4: که داراي 4 سطر و40 ستون مي باشد. تمام LCD هاي کاراکتري داراي 16 پايه مي باشد که در زير آورده شده است : پايه شماره 1 : Vss ، اين پايه ،پايه گراند LCD است و بايد به زمين مدار وصل شود. پايه شماره 2 : VDD اين پايه VCC، LCD است که بايد به 5 ولت وصل شود. پايه شماره 3 : VEE اين پايه روشنايي کنتراست پيکسل هاي LCD را تعيين ميکند واتصال آن طبق مدار روبرو است : پايه شماره 4 : Rs در LCD دو رجيستر به نام دستورالعمل وداده وجود دارد اگر RS=0 باشد LCD براي گرفتن دستورالعمل اماده مي شود در غير اين صورت براي داده . مثلا دستور CLS يک دستورالعمل است و "ANT" که بايد روي LCD نوشته شود يک داده است . پايه شماره 5 : RW اين پايه دو وضعيت دارد ، RW=1 براي خواندن از LCD و RW=0 براي نوشتن در LCD . پايه شماره 6 : E با اين پايه مي توان LCD را انتخاب کرد. پايه شماره 7 : DB0 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي صفر) . پايه شماره 8 : DB1 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي يک). پايه شماره 9 : DB2 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي دو). پايه شماره 10 : DB3 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي سه). پايه شماره 11 : DB4 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي چهار). پايه شماره 12 : DB5 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي پنج). پايه شماره 13 : DB6 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي شش). پايه شماره 14 : DB7 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي هفت). پايه شماره 15 : اين پايه و پايه شماره 16 تغذيه LED پشت LCD مي باشد که به 5 ولت متصل مي شود. پايه شماره 16 : اين پايه و پايه شماره 15 تغذيه LED پشت LCD مي باشد که به زمين متصل مي شود. راه اندازي LCD : LCD مي تواند از دو طريق 8 سيمه و 4 سيمه به ميکرو متصل شود. Config Lcdbus = Constant Constant مي تواند 4 به معناي استفاده از مد 4 سيمه يا 8 به معناي مد هشت سيمه باشد (در صورتي که اين دستور نوشته نشود ، مد 4 سيمه در نظر گرفته مي شود .) در مد چهار سيمه فقط ميتوان روي LCD نوشت ولي در مد هشت سيمه ميتوان اطلاعاتي را که قبلا روي LCD نوشته شده است را خواند و به ميکرو ارسال کرد . به طور کلي از خطوط ديتاي 0 تا 3 براي خوانده از LCD و از خطوط 4 تا 7 براي نوشتن در LCD نوشته مي شود . در حالت نوشتن در LCD بايد پايه RW (پايه 5) پايين نگه داشته شود (صفر شود) ودر حالت خواندن از LCD بايد پايه RW يک شود ) 5 ولت وصل شود) . از آنجا که با وجود حافظه ميکرو و راحت شدن کار برنامه نويسي نيازي به خواندن از LCD نمي باشد ، از پايه DB0 تا DB3 استفاده نمي شود و پايه RW نيز به GND (صفر ولت) متصل مي شود . دومين مرحله براي راه اندازي LCD معرفي کردن نام آن است : براي اين کار بعد از معرفي ميکرو وکريستال با استفاده از دستور زير مي توان LCD را معرفي کرد: Config Lcd = Lcdname که Lcdname يکي از نام هاي بالا ميباشد. مثلا معرفي LCD 2*16 : Config Lcd = 16 * 2 مرحله بعد معرفي پايه هاي از ميکرو است که LCD به آنها وصل مي شود . مد 4 سيمه : Config Lcdpin = Pin , Db4 = Pinx.y , Db5 = Pinx.y , Db6 = Pinx.y , Db7 = Pinx.y , Rs = Pinx.y , E = Pinx.y x نام پورت است که يکي از پورت هاي A يا B يا C يا D يا ... مي باشد و y شماره پايه هست که از 0 تا 7 مي باشد . ( دقت شود دستور فوق در يک خط نوشه شود يا براي خط دوم از _ استفاده شود ). براي مثال در زير LCD کاراکتري 16*2 به پورت C ((PORTC متصل است . $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = PINC.0 , Db5 = PINC.1 , Db6 = PINC.2 _ , Db7 = PINC.3 , Rs = PINC.4 , E = PINC.5 در اين مثال که از ميکرو مگا16 (ATmega16) استفاده شده ، اتصال ميکرو وLCD به قرار زير است : پايه شماره 1 : VSS اين پايه بايد به زمين مدار وصل شود . پايه شماره 2 : VDDاين پايه بايد به 5 ولت وصل شود . پايه شماره 3 : VEE اين پايه با يک مقاومت ( مقدار مقاومت بستگي به روشنايي مورد نظر شما دارد) به زمين وصل مي شود. پايه شماره 4 : RS اين پايه به پورت C پين شماره 4 يا پين C.4 متصل مي شود (پايه 26) . پايه شماره 5 :RW اين پايه به GND یا زمین متصل مي شود . پايه شماره 6 : E اين پايه به پورت C پين شماره 5 يا پين C.5 متصل مي شود (پايه 27) . پايه شماره 7 : DB0 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) . پايه شماره 8 : DB1 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) . پايه شماره 9 : DB2 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) . پايه شماره 10 : DB3 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) . پايه شماره 11 : DB4 اين پايه به پورت C پين شماره 0 يا پين C.0 متصل مي شود (پايه 22) . پايه شماره 12 : DB5 اين پايه به پورت C پين شماره 1 يا پين C.1 متصل مي شود (پايه 23) . پايه شماره 13 : DB6 اين پايه به پورت C پين شماره 2 يا پين C.2 متصل مي شود (پايه 24) . پايه شماره 14 : DB7 اين پايه به پورت C پين شماره 3 يا پين C.3 متصل مي شود (پايه 25) . پايه شماره 15 : اين پايه تغذيه مثبت LED پشت LCD مي باشد که به 5 ولت متصل مي شود . پايه شماره 16 : اين پايه تغذيه زمين LED پشت LCD مي باشد که به زمين متصل مي شود . توجه کنيد که اگر پايه VEE به زمين متصل شود پيکسل هاي LCD داراي بيشترين کنتراست و اگر به 5 ولت وصل شود داراي کمترين کنتراست مي باشند . اتصال پايه هاي 15 و16 اختياري است . ( در پروتئوس اين پايه ها وجود ندارند ) مد 8 سيمه : در مثال زیر پايه DB0 به پورت D.0 و پايه DB1 به پورت D.1 و ... پايه DB7 به پايه D.7 و پايه Rs به پايه C.5 و پايه E به پايه C.6 و پايه Rw به پايه C.7 متصل مي گردد ، در اين حالت يازده پايه از LCD اشغال مي شود . Config Lcdpin = PORTD , Rs = PINC.5 , E = PINC.6 , Rw = PINC.7 دستورات LCD : بعد از راه اندازي LCD نوبت کار کردن با آن است . براي نوشتن روي LCD از دستور زير استفاده مي شود : Lcd "x" که X مي تواند هر چيز ي باشد (البته در محدوده کارکتر هاي اسکي ) . مانند: Lcd "A.N.T" Lcd "1nafar" براي پاک کردن LCD از دستور Cls استفاده مي شود . مانند : Lcd "DSA@GJK!?" Wait 1 Cls Lcd "asdfgfghk" با دستور زير مي توان در سطرها و ستون هاي ديگر LCD نوشت. Locate x,y که x آدرس سطر و y آدرس ستون مي باشد . مثال : Locate 1 , 2 Lcd "qwert" Locate 2 , 8 Lcd "mnbv" توجه کنيد براي يک LCD ، مثلا 16*2 حداکثر x برابر2 و حداکثرy برابر 16 است . البته این مدل LCD دارای حافظه 40*2 می باشد که فقط 16*2 تای اول آن نمایش داده می شود و می توان در بقیه حافظه نوشت و با دستورات انتقال متن فوق را نمایش داد . با دستورات زير ميتوان به سطر هاي مختلف LCD پرش کرد و در آنجا متن را نوشت : Upperline با اين دستور به خط بالاي پرش مي شود Lowerline با اين دستور به خط پاييني پرش مي شود Home با اين دستور به سطر اول ، ستون اول پرش مي شود Thirdline Fourthline با دو دستور بالا مي توان به ترتيب به خط سوم و چهارم پرش کرد (اين دستور براي LCD هاي است که 4 سطر دارند) . مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 4 Config Lcdpin = Pin , Db4 = PINC.0 , Db5 = PINC.1 , Db6 = PINC.2 , Db7 = PINC.3 , Rs = PINC.4 , E = PINC.5 Lowerline Lcd "qwert" Thirdline Lcd "vcxz" Fourthline Lcd "erff" Wait 2 Home Lcd "123654" End متن نمایش داده شده بر روی LCD در شکل بالا مشاهده می شود : با دستور زير مي توان تعداد فضاي خالي دلخواه را بر روي LCD ايجاد کرد : Lcd Spc(X) تعداد X ستون خالي بوده ، و بعد از ستون X نوشتن ادامه مي یابد. با استفاده از دستور زير ميتوانيد LCD را روشن يا خاموش کنيد: Display On / Off On : LCD روشن مي شود Off : LCD خاموش مي شود. با استفاده از دستور زير ميتوانيد کنتراست (ميزان نور (کم رنگي وپر رنگي) متن ) متن را تغيير دهيد : Lcdcontrast x X ميزان کنتراست است که ميتوانيد بين 0 تا 3 باشد ، به ازاي 0 کمترين کنتراست و به ازاي 3 بيشترين کنتراست مشاهده مي شود. (توجه شود فقط بعضي از LCD ها داراي قابليت فوق مي باشند) LCD داراي يک مکان نما مي باشد که با دستور زير ميتوان آن را روشن يا خاموش يا چشمک زن يا ثابت قرارداد . Cursor On با اين دستور مکان نما روشن مي شود (در حالت عادي مکان نما روشن است ). Cursor Off با اين دستور مکان نما خاموش مي شود. Cursor Blink با اين دستور مکان نما چشمک مي زند . Cursor Noblink با اين دستور مکان نما ديگر چشمک نمي زند . با دستور زير مي توانيد کاراکتر هاي روي lcd را به چپ يا راست شيفت دهيد. Shiftlcd Left اين دستور کارکترها را به اندازه يک ستون به چپ منتقل ميکند. Shiftlcd Right اين دستور کارکترها را به اندازه يک ستون به راست منتقل ميکند . با دستور زير ميتوانيد مکان نما را به راست يا چپ منتقل کنيد: Shiftcursor Left | Right Left اين دستور مکان نما را به اندازه يک ستون به چپ منتقل مي کند . Right اين دستور مکان نما را به اندازه يک ستون به راست منتقل مي کند. مثال : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 4 Config Lcdpin = Pin , Db4 = PIND.2 , Db5 = PIND.3 , Db6 = PIND.4 , _ Db7 = PIND.3 , Rs = PIND.0 , E = PIND.1 Lcdcontrast 1 Locate 2 , 1 Lcd "12356" Shiftcursor Right Wait 1 Display Off Wait 1 Display On Lcdcontrast 2 Locate 4 , 1 Lcd Spc(5) Lcd "qwer" Shiftcursor Left End نمایش کارکتر دلخواه روي LCD : Lcd هاي کاراکتري داراي يک حافظه دائم مي باشد که درون آن فقط کد ، کارکترهاي اسکي وجود دارد (کد کارکترهاي فارسي در آن وجود ندارد) . در LCD حافظه موقتي وجود دارد که در آن مي توان تا 8 کاراکتر دلخواه را قرار داد . براي ساخت کاراکتر دلخواه مراحل زير را دنبال کنيد: از منوي Tools گزينه Lcd Designer را انتخاب کنيد ، پنجره جديدي باز مي شود که شما مي توانيد در آن کاراکتر دلخوا ه خود را ايجاد کنيد. بعد از ايجاد کاراکتر دلخواه روي Ok کليک کنيد ،پنجره بسته مي شود و يک خط به برنامه شما اضافه مي شود. مانند زير : Deflcdchar ?,32,32,7,5,31,16,16,16 به جاي علامت سوال ؟ بايد يکي از اعداد 0 تا 7 گذاشته شود . بعد از ساخت کاراکتر جديد بادستور زير مي توانيد آن را روي LCD نشان دهيد: Lcd chr(?) به جاي علامت سوال بايد شماره کاراکتر که يکي از اعداد 0تا 7 مي باشد گذاشته شود . مانند: $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = PIND.2 , Db5 = PIND.3 , Db6 = PIND.4 , _ Db7 = PIND.3 , Rs = PIND.0 , E = PIND.1 Deflcdchar 0 , 32 , 32 , 7 , 5 , 31 , 16 , 16 , 16 Lcd Chr(0) End RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 فصل سوم : معرفي ساير دستورات بسکام در اين فصل دستورات به 7 دسته زير تقسم شده اند : 1- اعداد و متغيير ها در بسکام 2- دستورات مربوط به کار با رشته ها 3- دستورات حلقه و پرش و شرط 4- دستورات اجرايي (اين دستورات ، دستورات خاص براي کامپايلر هستند که براي اجراي بهتر برنامه استفاده ميشوند) 5- زير برنامه ها و فراخواني توابع 6- توابع رياضي و محاسباتي 7- توابع تبديل 55 کدها و متغيير ها به يکديگر در اين فصل نيازي به حفظ کردن دستورات نيست ، براي يادگيري آنها کافيست آنها را اجرا کنيد و چند بار ورودي را تغيير دهيد . در ادامه و در بخش راه اندازي سخت افزار هاي جانبي ، با کاربرد هاي عملي اين دستورات بيشتر آشنا خواهيم شد . اعداد و متغيير ها در بسکام : دستور زير معرفی يک متغير را نشان ميدهد . با اين دستور مي توانيد متغيرهايي که در برنامه به کار برده مي شوند تعريف کنيد . Dim X As Data Type X نام متغيري است، که در برنامه بکار برده مي شود و Data Type نوع داده است که مي تواند طبق موارد STRING يا WORD ياLONG يا INTEGER يا BYTEيا BITيا SINGLE يا Double باشد . ( Xهمچنين ميتواند XRAM يا SRAM يا ERAM يا OVERLAY يا location باشد که همگي متغير هاي از انواع حافظه ها هستند باشد ، که در بخشهاي بعدي توضيح داده مي شود.) در صورت استفاده از متغير STRING بيشترين طول آن نيز بايد نوشته شود . Bit : اين متغيير ميتواند صفر يا يک باشد . Byte : اين متغيير مي تواند از0 تا 255 تغيير کند و فقط شامل اعداد صحيح مثبت مي شود . Word : اين متغيير مي تواند از0 ت65535 تغيير کند و فقط شامل اعداد صحيح مثبت مي شود. Integer : اين متغيير مي تواند از32767- تا 32767+ تغيير کند و فقط شامل اعداد صحيح مثبت و منفي مي شود. Long : اين متغيير مي تواند از214783648- تا 214783647+ تغيير کند و فقط شامل اعداد صحيح مثبت و منفي مي شود. Single : اين متغيير ميتواند از 45-^10×5/1 تا 38^10×4/3 تغيير کند و فقط شامل اعداد صحيح واعشاري صحيح مثبت و منفي مي شود. Double : اين متغير مي تواند از324-^10×5 تا 308^10×7/1 تغيير کند و فقط شامل اعداد صحيح واعشاري مثبت و منفي مي شود. String : اين متغيير مي تواند از1 تا 255 بايت تغيير کند تغيير کند و براي حروف وعلائم استفاده مي شود. در صورت استفاده از متغير String بيشترين طول آن نيز بايد نوشته شود . مثال : Dim B As Bit Dim A As Byte Dim K As Integer Dim Micro As Word Dim Hasan As String * 16 شما همچنين ميتوانيد يک متغير آرايه اي (با يک نام چندين متغيير) بسازيد . مانند : Dim A(10) As Word در اين حالت شما ميتوانيد از 10 متغير A یعنی A(1) تا A(10) در برنامه استفاده کنيد . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim A(4) As Byte Dim Ali As Word Dim Wqew As Byte A(1) = 10 A(2) = 11 Wqew = 5 Locate 1 , 1 A(2) = A(3) + A(4) Ali = A(2) + Wqew Lcd Ali Locate 2 , 1 Ali = A(1) * Wqew Lcd Ali End متن نمایش داده شده برنامه بالا در شکل بالا مشاهد می شود : اين شکل سخت افزار استفاده شده در کليه مثال هاي اين فصل است . نکته : در صورتي که در يک متغير بيشتر از اندازه اش مقدار قرار دهيد با خطا مواجه مي شويد مانند: Dim A As Byte A = 300 مورد بالا غلط مي باشد ، چون بايت مي تواند از 0 تا 255 تغيير کند ومقدار 300 بيشتر از اندازه (بعد) بايت است . RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 Const : براي تعريف يک ثبات از اين دستور استفاده مي شود : Const Symbol= Numconst Const Symbol= Stringconst Const Symbol= Expression Symbol نام ثابت و Numconst مقدار عددي انتساب يافته به Symbol و Stringconst رشته انتساب يافته به Symbol و Expression مي تواند عبارتي باشد که نتيجه آن به Symbol انتساب يابد . مانند: Const S = "TEST" Const A = 5 Const B1 = &B1001 Const X =(b1 * 3 ) + 2 Incr و Decr : دستور Incr يک واحد به متغيير عددي X مي افزايد و دستور Decr يک واحد از آن کم مي کند . Incr X Decr X مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim A As Byte Dim B As Long Dim Bp As Byte Do Incr A Decr B Locate 1 , 1 Lcd B Locate 2 , 1 Lcd A Waitms 500 Loop End Swap: با اجراي اين دستور محتواي متغير Var1 در متغير Var2 و محتواي متغير Var2 در متغير Var1 قرار مي گيرد . Swap Var1 , Var2 دو متغير Var1 وVar2 بايستي از يک نوع باشند . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim A As Byte Dim B As Byte Cls A = 10 B = 20 Swap A , B 'swap them Locate 1 , 1 Lcd 'A=20 Locate 2 , 1 Lcd B 'B=10 End با مشاهده متن نمایش داده شده می توان به جابجایی داده دو متغیر پی برد : Config Single : با اين دستور ميتوان تعداد رقم اعشار متغير از جنس Singleرا معين کرد ، اين دستور به فرم کلي زير است: Config Single = Scientific , Digits = x X : عددي بين 1 تا 7 است که تعداد رقم اعشار را نشان ميدهد ، درصورت که از اين دستور استفاده کنيد ، کليه متغير هاي Singleموجود در برنامه تحت پوشش قرار مي گيرند . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Single = Scientific , Digits = 1 Cls Dim A As Single A = 10 A = A / 9 Lcd A End و نمایش اطلاعات برنامه فوق در شکل بالا مشاهده می شود . Format : اين دستور يک متغير عددي را شکل دهي مي کند . X = Format (Var , "Form") Var رشته اي است که شکل دهي شود و نتايج در X قرار مي گيرد .Form نوع شکل دهي است . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 10 , I As Integer S = " 123" S = Format(s , " ") Locate 1 , 1 '5 Space Lcd S ' S = " 123"Two Space First , Then 123 S = "12345" S = Format(s , "000.000") Locate 1 , 8 Lcd S ' S = "012.345" S = Format(s , "+") Locate 2 , 1 Lcd S ' S = "+12345" End Fusing : از اين دستور براي روند کردن يک متغير عددي استفاده مي شود . Target = Fusing (Source , "Mask") Source رشته موردنظر براي شکل دهي و نتايج در Target قرار مي گيرد .Mask نوع شکل دهي است . عمل Mask حتما بايد با علامت # شروع شود و حداقل بايد يکي از علامات # يا & را بعد از مميز داشته باشد. با استفاده از # عدد روند مي شود و در صورت استفاده از & روندي صورت نمي گيرد . مثال : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 4 Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim S As Single Dim A As Byte Cls S = 10 A = 6 S = S / A Locate 1 , 1 Lcd S 'lcd 1.66666666666666 Locate 2 , 1 Lcd Fusing(s , "#.##") 'lcd 1.67 Locate 3 , 1 Lcd Fusing(s , "#.####") 'lcd 1.6667 Locate 4 , 1 Lcd Fusing(s , "#.&&&") 'lcd 1.666 End با مشاهده متن نمایش داده شده می توان بیشتر به چگونگی روند کردن پی برد : Shift : با اين دستور ميتوان تمام بيت ها را يک بيت به سمت راست يا چپ منتقل کرد ، اين دستور به فرم کلي زير است : Shift Var , Left/Right Var : نام متغير يا عدد ثابتي است که ميخواهيم آن را شيفت دهيم (منتقل کنيم) Left/Rightجهت شيفت را مشخص ميکند ، که ميتواند راست يا چپ باشد . مانند: $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output PORTA = 128 Do Shift PORTA , Right Wait 1 Loop End مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim A As Byte A = 5 Locate 1 , 1 lcd a Shift A , Left Locate 2 , 1 Lcd A End در مثال بالا مقدار اوليه 5 (0101 باينري) براي A در نظر گرفته شده است ، اين مقدار بر روي سطر وستون اول LCD به نمايش در ميايد ، سپس با دستور Shift A , Left تمام بيت هاي متغير A به سمت چپ منتقل ميشوند ، پس مقدار A برابر با 10 (1010 باينري ) مي شود . Rotate: اين دستور تقريبا مانند دستور Shift ميباشد و تمام بيت هاي يک متغير را به سمت راست يا چپ جابجا مي کند با این تفاوت که بیتی بیرون نمی رود و چرخش داده می شود ، شما همنچنين با اين دستور ميتوانيد پين هاي روشن يک پورت را جابجا کنيد وبه فرم کلي زير است: Rotate Var , Left/Right Var : نام متغير يا عدد ثابتي يا پورتي است که ميخواهيم آن را شيفت دهيم (منتقل کنيم) Left/Right : جهت انتقال را مشخص مي کند ، که ميتواند را ست يا چپ باشد . مثال : ( در پوشه Example\3 - Flasher Rotate موجود است ) $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Dim B As Byte B = 1 Do Rotate B , Right PORTA = B Waitms 250 Loop End براي نشان دادن اعداد به فرم باينري از &B و براي نشان دادن اعداد به فرم هگز از &H استفاده مي شود . مانند : &B01010111 &Hf6 در اينجا تمامي دستورات مر بوط به اعداد ومتغيير ها که در زبان بيسيک براي ميکرو AVR است گفته شد. در درسهاي بعدي با اين دستورات به صورت کاربردي آشنا مي شويد. (مثال ها را در بسکام کپي کنيد و طرز کار دستورات را ببينيد ) دستورات مربوط به کار با رشته ها : Asc : اين دستور اولين کاراکتر يک متغير از نوع داده String را به مقدار اسکي آن تبديل مي کند . Var = Asc (String) براي ديدن کارکترهاي اسکي و کد متناظر با آنها از منوي Edit گزينه ي Insrt Ascii را انتخاب کنيد . Instr : اين دستورمحل و موقعيت يک زير رشته را در رشته ديگر مشخص مي کند . Var =Instr (start , String ,Subset) Var =Instr (String ,Subset) Var عددي است که مشخص کننده محل Substr در رشته اصلي String مي باشد و زمانيکه زير رشته مشخص شده در رشته اصلي نباشد صفر برگردانده مي شود .Start نيز عددي دلخواه است که مکان شروع جستجو زير رشته در رشته اصلي را مشخص مي کند . در صورتيکه Start قيد نشود تمام رشته از ابتدا جستجو مي شود . رشته اصلي تنها بايد از نوع رشته باشد ولي زير رشته (substr ) مي تواند رشته و عدد ثابت هم باشد . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 15 Dim Z As String * 5 Dim Bp As Byte Cls S = "This is a test" Z = "is" Bp = Instr(s , Z) Lcd Bp Bp = Instr(4 , S , Z) Home L Lcd Bp End با مشاهده اعدا نمایش داده شده بیشتر می توان به عدد برگشتی تابع فوق پی برد : : CHECKSUM اين دستور مجموع کد دسيمال اسکي رشته X را برمي گرداند که البته اگر مجموع کد اسکي رشته از عدد 255 بيشتر شود مقدار 256 از مجموع کم مي شود . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 10 ' Dim Variable S = "test" Locate 1 , 1 ' Assign Variable Lcd Checksum(s) ' print value (192) S = "testNext" Locate 2 , 1 ' assign variable Lcd Checksum(s) ' lcd value 95 End RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 High و Low و Highw : : Low اين دستور (LSB (Least Significant Byte يک متغير را برمي گرداند . (LSB بايد کمتر از 8 بيت باشد) High : اين دستور( MSB (Most Significant Byte يک متغير را برمي گرداند . (MSB بايد کمتر از 8 بيت باشد) Highw : اين دستور( MSB (Most Significant Byte يک متغير را برمي گرداند . (MSB بايد کمتر از 16 بيت باشد) Var = High (s) MSB متغير S در Var قرار مي گيرد . (Var بايد از جنس Byte باشد) Var = Low (s) LSB متغير S در Var قرار مي گيرد . (Var بايد از جنس Byte باشد) X = Highw )s( MSB متغير S در Var قرار مي گيرد . (Var بايد از جنس Word باشد) مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim I As Integer Dim Z As Byte Dim Q As Byte Cls I = &H1001 Z = Low(i) '1 Locate 1 , 1 Lcd Z Q = High(i) '16 Locate 2 , 1 Lcd Q End و اعدا نمایش داده شده در شکل بالا مشاهده می شود . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim X As Word , L As Long L = &H12345678 X = Highw(l) ' 4660(des)=1238(hex) Locate 2 , 1 Lcd X End Lcase و Ucase : دستور Lcase : اين دستور تمام حروف رشته مورد نظر را تبديل به حروف کوچک مي کند . Target = Lcase (source) تمام حروف رشته source کوچک شده و در رشته Target جاي داده مي شود . دستور Ucase : اين دستور تمام حروف رشته مورد نظر را تبديل به حروف بزرگ مي کند . Target = Ucase (source) تمام حروف رشته source بزرگ شده و در رشته Target جاي داده مي شود . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 12 Dim Z As String * 12 Dim Q As String * 12 S = "Hello World" Q = "QWERTGFDD" Z = Ucase(s) 'Z = "HELLO WORLD" Locate 1 , 1 Lcd Z Z = Lcase(q) 'Z = "qwertgfdd" Locate 2 , 1 Lcd Z End Right و Left : دستور Right: با اين دستورقسمتي از يک رشته را جدا مي کنيم . Var = Right (Var1 , N) از سمت راست رشته Var1 به تعداد کاراکتر N , رشته اي جدا شده و در رشته Var قرار مي گيرد . دستور Left: با اين دستور کاراکترهاي سمت چپ يک رشته را به تعداد تعيين شده جدا مي کند . Var = Left (Var1 , N) از سمت چپ رشته Var1 به تعداد کاراکتر N , رشته اي جدا شده و در رشته Var قرار مي گيرد . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 15 , Z As String * 15 Cls S = "abcdefg" Z = Left(s , 5) 'Z = abcde Locate 1 , 1 Lcd Z Z = Left(s , 1) 'Z = a Locate 1 , 8 Lcd Z Z = Right(s , 5) 'Z = CDEFG Locate 2 , 1 Lcd Z Z = Right(s , 2) 'Z = FG Locate 2 , 8 Lcd Z End و مشاهده متن اصلی و متن جدا شده : Mid : با اين دستور مي توان قسمتي از يک رشته را برداشت و يا قسمتي از يک رشته را با قسمتي از يک رشته ديگر عوض کرد . Var = Mid (Var1 , St [,L]) 1- قسمتي از رشته Var1 با شروع از کاراکتر Stام و طول L برداشته شده و در متغير Var قرار مي گيرد. Mid (Var , St [,L]) = Var1 2- رشته Var1 در رشته Var با شروع از کاراکتر St ام و طول L قرار مي گيرد . در صورت قيد نکردن گزينه اختياري L بيشترين طول در نظر گرفته مي شود . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 10 Dim Z As String * 10 Cls S = "adswer" Z = Mid(s , 2 , 3) Locate 1 , 1 Lcd Z 'lcd "dsw" Z = "5685" Mid(s , 2 , 3) = Z Locate 2 , 1 Lcd S 'lcd "a568er" End Len : اين دستور طول، يا به عبارتي تعداد کاراکترهاي يک رشته را برميگرداند . Var = Len (String) طول رشته String در متغير عددي Var قرار مي گيرد . رشته String نهايتا مي تواند 255 بايت طول داشته باشد . توجه داشته باشيد که فضاي خالي (Space Bar) خود يک کاراکتر به حساب مي آيد . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 12 Dim A As Byte Cls S = "test" A = Len(s) Locate 1 , 1 '4 Lcd Len(s) S = "test " A = Len(s) Locate 2 , 1 Lcd A '6 End Ltrim: اين دستور فضاي خالي يک رشته را حذف مي کند . Var = Ltrim (Q) فضاي خالي رشته Q برداشته مي شود و رشته بدون فضاي خالي در متغير رشته اي Var قرار مي گيرد . مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 10 Dim A As String * 10 Cls S = "1 2 3 4" S = Ltrim(s) Locate 1 , 1 A = S Lcd A '1234 S = "Q Q Q" Locate 2 , 1 Lcd Ltrim(s) 'QQQ End Space : براي ايجاد فضاي خالي در ميان يک رشته ، ازاين دستور استفاده مي شود . Var = space (X) X تعداد فضاي خاليست که بعنوان رشته در متغير رشته اي var جاي مي گيرد. مثال : $regfile = "m16def.dat" $crystal = 1000000 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 Dim S As String * 10 Dim Z As String * 10 Cls S = Space(5) Z = "qwer" Locate 1 , 1 Lcd "(" ; S ; Z ; ")" End ديگر دستور ات حلقه و پرش و شرط : گاهي نياز است که يک قسمت از برنامه چندين بار اجرا شود يا در حين اجراي برنامه در يک خط به خط ديگري رجوع شود ، براي اين کار از دستورات حلقه و پرش که چندين نوع است ، استفاده مي شود . Goto : با اين دستورات مي توان به برچسب Label پرش کرد . برچسب Label بايد با علامت : (colon) پايان يابد و مي تواند تا 32 کارکتر طول داشته باشد . Label: برنامه Goto Label مثال : $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Q: Set PORTA.0 Waitms 200 Reset PORTA.0 Waitms 200 Goto Q End Gosub : با اين دستور ميتوان به يک زیرروال پرش کرد ، باز گشت ار زیرروال با دستور Return انجام مي شود ، اين دستور به فرم کلي زير است : Gosub Label Label: برنامه Return مثال: $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Do Gosub Q Set PORTA.0 Waitms 600 Loop End Q: Reset PORTA.0 Waitms 600 Return On Var: اين دستور به فرم کلي زير است: On Var [Goto] [Gosub] Label1 [, Label2 ] [,Check] در اين دستور به ازاي متغير Var به برچسب nم پرش مي شود ، مثلا اگر Var=2 باشد به پرچسب سوم پرش مي شود ( تعداد برچسب ها نامحدود است ( بستگي به حافظه ميکرو دارد) . در صورتي که از دستور Gosub استفاده کنيد باز گشت از زير برنامه (برچسب) با دستورReturn انجام مي شود و در صورت استفده از Goto بايد به حلقه اصلي پرش کرد که شما ميتوانيد از دستور Goto يا ديگر دستورات استفاده کنيد . مثال با دستور Gosub: $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Dim S As Byte Do On S Gosub Q , W , E Incr S Wait 1 Loop End Q: Set PORTA.0 Return W: Set PORTA.1 Return E: Set PORTA.2 Return مثال با دستور Goto: $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Dim S As Byte A: Wait 1 On S Goto Q , W End Q: Incr S Goto A W: Set PORTA.1 Goto A در مثال هاي بالا ، در اول کار مقدار S صفر است پس به پرچسب اول پرش شده و پورت PORTA.0 يک مي شود مي شود و به S يک واحد افزوده مي شود ، بعد از اين عمل دوباره به حلقه اصلي پرش ، S برابر با 1 مي شود ، پس به پرچسب دوم پرش مي شود در آنجا پورت ... Do - Loop : فرم کلي دستورات DO … LOOP بصورت زير مي باشد . Do برنامه Loop اين حلقه يک حلقه بينهايت است ، که با Exit Do مي توان از درون حلقه خارج شد و اجراي برنامه در خط بعد از Loop ادامه يابد. همچنان می توان شرطی تعریف کرد که با بر قرار شدن شرط از حلقه خارج شویم : Do برنامه Loop Until A = X هر گاه متغیر A برابر X شد از حلقه خارج می شویم , تست شرط در آخر حلقه انجام می شود پس حلقه فوق حداقل یک بار اجرا می شود . در مثال زير در هر بار تکرار حلقه يک واحد به A اضافه مي گردد و هرگاه مقدار A به 10 رسيد خط بعد از حلقه اجرا مي گردد. مثال : $regfile = "m16def.dat" $crystal = 1000000 Config PORTA = Output Dim A As Byte Do Incr A Set PORTA.0 Waitms 600 Reset PORTA.0 Waitms 600 Loop Until A = 10 Toggle PORTA End RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 نقل قول: For - Next : RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 نقل قول: $map : RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 Log10 : اين دستور لگاريتم Source که از نوع Single يا Double ميباشد را در مبناي 10 محاسبه کرده ونتيجه را در متغيير Target که از نوع جنس Single يا Double ميباشد مي باشد قرار مي دهد. Target = Log10 (Source) مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single X = Log10(100) Locate 1 , 1 Lcd X 'X = 2 X = Log10(100000) Locate 2 , 1 Lcd X 'X = 5 End Rnd : اين دستور يک عدد را تصادفي برمي گرداند . Var= Rnd (Limit) عدد تصادفي بين 0 و 1 - Limit بدست آمده و در متغير Var قرار مي گيرد . با هربار استفاده از اين دستور عدد مثبت تصادفي ديگري بدست خواهد آمد . مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Byte Do X = Rnd(100) Lcd X 'get random number (0-99) Waitms 500 Loop End Frac: اين دستور مقدار اعشاري يک متغير از جنس Single را جدا مي کند و در يک متغير Single ديگر (Var) مي ريزد . Var = frac (Single) مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single , A As Single X = 57.35456 Locate 1 , 1 Lcd Frac(x) 'X = 0.35456 X = 123.000456789 A = Frac(x) Locate 2 , 1 Lcd A 'A = 0.000456789 End Int: اين دستور مقدار صحيح يک متغير از جنسSingle يا Doubleرا محاسبه مي کند و حاصل را در متغير Var قرار مي دهد ( محدوده متغير Var بايد با محدوده جواب مناسب باشد) . Var = Int (Source) مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single , A As Byte Cls X = 57.35456 Locate 1 , 1 Lcd Int(x) 'X =57 X = X * 3 A = Int(x) Locate 2 , 1 Lcd A 'A = 172 End Sin و Cos و Tan : اين دستور سينوس يا کسينوس يا تانژانت ثابت يا متغير Source را در متغير Var از نوع Single قرار مي دهد . Var = Sin | Cos | Tan (Source) تمام دستورات مثلثاتي با راديان کار مي کنند و ورودي اين دستور بايستي راديان باشد . مثال : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single X = Cos(3.14159) Locate 1 , 1 Lcd Fusing(x , "#.#") X = Sin(3.14159) Locate 1 , 9 Lcd Fusing(x , "#.#") X = Tan(3.14159) Locate 2 , 1 Lcd Fusing(x , "#.#") X = cos(0.78539) Locate 2 , 9 Lcd Fusing(x , "#.#") End SinH و CosH و TanH : اين دستور کسينوس هايپربوليک يا سينوس هايپربوليک يا تانژانت هايپربوليک ثابت يا متغير Source را در متغير Var از نوع Single قرار مي دهد . Var = Cosh | Sinh | Tanh (Source) تمام دستورات مثلثاتي با راديان کار مي کنند و ورودي اين دستور بايستي راديان باشد . مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single Dim Q As Single Q = .512 X = Cosh(q) Locate 1 , 1 Lcd Fusing(x , "#.#####") X = Sinh(q) Locate 1 , 10 Lcd Fusing(x , "#.#####") X = Tanh(q) Locate 2 , 1 Lcd Fusing(x , "#.#####") End Asin و Acos و Atan : اين دستور آرک سينوس يا آرک کسينوس يا آرک تانژانت ثابت يا متغير Source را در متغير Var از نوع Single قرار مي دهد . Var = Asin | Acos | Atn (source) تمام دستورات مثلثاتي با راديان کار مي کنند و ورودي اين دستور بايستي راديان باشد . مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single Dim Q As Single Q = .512 X = Acos(q) Locate 1 , 1 : Lcd Fusing(x , "#.#####") X = Asin(q) Locate 1 , 10 : Lcd Fusing(x , "#.#####") X = Atn(q) Locate 2 , 1 : Lcd Fusing(x , "#.#####") Q = -1 : X = Acos(q) Locate 2 , 10 : Lcd Fusing(x , "#.#####") End : Rad2deg براي تبديل راديان به درجه از اين دستوراستفاده مي شود . Var = Rad2deg (Single) راديان Single به درجه تبديل مي شود و در متغير Var از نوع داده Single قرار مي گيرد . Deg2rad : براي تبديل درجه به راديان از اين دستوراستفاده مي شود . Var = Deg2rad (single) زاويه Single به راديان تبديل مي شود و در متغير Var از نوع داده Single قرار مي گيرد . مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single Dim Q As Single Q = 180 X = Deg2rad(q) Locate 1 , 1 Lcd X Q = Rad2deg(x) Locate 2 , 1 Lcd Q End : Round متغير يا داده X از نوع Single روند شده و در متغير Var از نوع داده Single قرار مي گيرد . VAR = Round (X) مثال : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim X As Single Dim Q As Single X = 2.8 Q = 5.2 Locate 1 , 1 Lcd Round(x) Locate 2 , 1 Lcd Round(q) End Max و Min: با اين دو دستور مي توان کمترين و بيشتر مقدار يک متغير آرايه اي از جنس Word يا Byte را بدست آورد ، اين دو دستور به فرم کلي زير هستند : Var1 = Min (Var2) Var1 = Max (Var2) Var2 : نام متغير آرايه است و Var يک متغير ديگري است که نتيجه در آن ريخته مي شود . مانند : $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim A(10) As Byte , B(3) As Byte , C As Byte A(5) = 10 : B(1) = 100 : B(2) = 25 : B(3) = 6 Do Locate 1 , 1 : Lcd Max(a(1)) C = Min(b(1)) Locate 2 , 1 : Lcd C Loop End FIX : با اين دستور کوچکترين عدد صحيح نزديک به داده اعشاري از نوع بدست ميايد ( جزء صحيح) . اين دستور به فرم کلي زير است : Var = Fix (X) X ميتواند يک عدد اعشاري يا يک داده از نوع Single باشد ، با اجراي دستور کوچکترين عدد نزديک به داده در متغير Var ريخته مي شود ، مثلا کوچکترين عدد صحيح نزديک به 2/2 عدد 2 است . مثال: $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 16 * 2 : Cls Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_ , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 Dim A As Single , S As Single A = -45.56 S = Fix(25.9) A = Fix(a) Locate 1 , 1: Lcd S Locate 2 , 1: Lcd A End توابع تبديل کدها و متغيير ها به يکديگر Hex : اين دستور يک داده از نوع Byte , Integer , Word , Long را به مقدار هگزادسيمال تبديل مي کند . Var = Hex (X) مقدار HEX متغير يا ثابت X در متغير VAR جاي مي گيرد . : Bin اين دستور يک داده از نوع BYTE,INTEGER , WORD , LONG را به مقدار باينري تبديل مي کند . Var = Bin (X) مقدار باينري متغير يا ثابت X در متغير Var جاي مي گيرد . Str : با اين دستور مي توان يک متغير عددي ( X) را به رشته (Var) تبديل کرد . Var = Str (X) Val : با اين دستور مي توان يک رشته (S) را به متغير عددي (Var) تبديل کرد . Var = Val (S) Hexval : اين دستور يک داده هگزدسيمال را به مقدار عددي تبديل مي کند . Var = Hexval (X) مقدار عددي داده هگزدسيمال X که مي تواند Long , Word , Integer , Byte باشد در متغير Var جاي مي گيرد . Binval : اين دستور يک داده باينري را به مقدار عددي تبديل مي کند . Var = Binval (X) مقدار عددي داده باينري X که مي تواند Long , Word , Integer , Byte باشد در متغير Var جاي مي گيرد . Bcdو Makebcd : اين دستور متغير يا ثابت var2 را تبديل به مقدار BCD اش مي کند و در متغير var1 جاي مي دهد . Var1 = Makebcd (Var2) مثال : Print Bcd(var) lcd bcd( var) با دو دستور بالا ميتوان مقدار BCD يک متغيير را مستقيما روي Lcd نمايش داد يا آن را به پورت سريال فرستاد (کار پورت سريال در بخش هاي بعدي امده است) Makedec : براي تبديل يک داده BCD نوع Integer , Word , Byte به مقدار Decimal از اين دستور استفاده مي شود . مقدار دسيمال متغير يا ثابت VAR2 در متغير VAR1 جاي مي گيرد . Var1 = Makedec (Var2) Makeint : اين دستور دو بايت را به هم متصل مي کند و يک داده نوع Word يا Integer مي سازد که Lsb بايت کم ارزش و Msb بايت پر ارزش متغير دو بايتي Varn را تشکيل مي دهد . Varn = Makeint (Lsb , Msb) یعنی : Varn = (256 * Msb) + Lsb String : اين دستور کد اسکي M را با تعداد تکرار N تبديل به رشته کرده و در متغير Var قرار مي دهد Var = String (M , N) در صورت قرار دادن M =0 يک رشته بطول 255 کاراکتر توليد مي شود و قرار دادن n = 0 قابل قبول نيست . Bin2grey : متغير Var2 که مي تواند داده اي از نوع Word , Integer , Byte , Long باشد به کد گري تبديل شده و در متغير Var1 قرار مي گيرد . Var1 = Bin2grey (Var2) Grey2bin : کد گري Var2 به مقدار باينري تبديل شده و در متغير Var1 که مي تواند داده اي از نوعWord , Integer , Byte , Long باشد قرار مي گيرد . Var1 = Grey2bin (Var2) مثال براي موارد بالا : $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 Dim A As Byte Dim S As String * 10 S = "ABC" A = Asc(s) Locate 1 , 1 Lcd A S = Hex(a) Locate 1 , 8 Lcd S A = Hexval(a) Locate 2 , 1 Lcd S A = 50 A = Makebcd(a) Locate 2 , 8 Lcd A End RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 نقل قول: کار با حافظه داخلي ميکرو (EEPROM) : |