Parsi Coders
آموزش کامل بسکام به همراه مثال - نسخه قابل چاپ

+- 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 :
فرم کلي دستورات FOR .. NEXT بصورت زير مي باشد .
For Var = Start To End [Step Value]
برنامه
Next Var
Var بعنوان يک کانتر عمل مي کند که Start مقداراوليه آن و End مقدار پاياني است و هر دو مي توانند يک ثابت عددي يا متغير عددي باشند . Value مقدار عددي Step را نشان مي دهد که مي تواند مثبت يا منفي باشد . وجود نام Var بعد از Next الزامي نيست .
مثال :
$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
Dim C As Integer
For A = 1 To 10 Step 2
Locate 1 , 1
Lcd A
Next A
For C = 9 To -5 Step -1
Locate 1 , 6
Lcd C
Next
For B = 1 To 10
Locate 2 , 1
Lcd B
Next
End

While - Wend :
فرم کلي اين دستور به شکل زير است:
While Condition
برنامه
Wend
دستورالعمل While - Wend تشکيل يک حلقه تکرار مي دهد که تکرار اين حلقه تا زماني ادامه مي يابد که عبارت بکاربرده شده نتيجه را FALSE کند و يا مقدار صفر بگيرد . دستورالعمل While بصورت ورود به حلقه به شرط مي باشد , بنابراين While ممکن است در حالتهايي اصلا اجرا نشود .
برنامه تا وقتي که حاصل Condition صفر يا False نشده است تکرار خواهد شد .
مثال :
$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 = 1
While A < 10
Locate 1 , 1
Lcd A
Incr A
Waitms 600
Wend
End
if :
فرم کلي اين دستور به شکل زير است:
If A = 1 Then :
...
Elseif A = 2 Then :
..
Elseif B1 > A Then :
...
Else :
...
End If
در صورتي که شرط اول برقرار باشد (A=1) دستورات زير If A = 1 Then تا Elseif A = 2 Then اجرا مي شود ، در صورتي که شرط اول برقرار نباشد و شرط دوم برقرار باشد (A=2) دستورات بين Elseif A = 2 Then تا Elseif B1 > A Then اجرا مي شود ،در صورتي که .... و اگر هيچ کدام از شرط ها برقرار نباشد ؛ دستورات بين Else تا End If اجرا مي شود. اين دستور ميتواند هر پيزي را چک کند ( متغير ها ، واحد هاي حافظه ، پين ها ، پورت ها و...) .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.2 , Db5 = PORTD.3 , Db6 = PORTD.4 _
, Db7 = PORTD.5 , E = PORTD.1 , Rs = PORTD.0
Dim A As Byte
Do
Incr A
Wait 1
If A = 1 Then :
Locate 1 , 1
Lcd "CLAUSE1 true"
Locate 2 , 1
Lcd "a=1"
Elseif A = 2 Then :
Locate 1 , 1
Lcd "CLAUSE2 true"
Locate 2 , 1
Lcd "a=2"
Elseif A = 3 Then :
Locate 1 , 1
Lcd "CLAUSE3 true"
Locate 2 , 1
Lcd "a=3"
Elseif A = 4 Then :
Locate 1 , 1
Lcd "CLAUSE4 true"
Locate 2 , 1
Lcd "a=4"
Elseif A = 5 Then :
Locate 1 , 1
Lcd "CLAUSE5 true"
Locate 2 , 1
Lcd "a=5"
Elseif A = 6 Then :
Locate 1 , 1
Lcd "CLAUSE6 true"
Locate 2 , 1
Lcd "a=6"
Else :
Locate 1 , 1
Lcd "CLAUSE4 false"
Locate 2 , 1
Lcd "a>6"
End If
Loop
End
در مثال بالا ، هر يک ثانيه يک واحد به متغير A افزوده مي شود ، هنگاميکه مقدار آن 1 است روي سطر اول LCD عبارت "CLAUSE1 true" و روي سطر دوم LCD مقدار A نوشته مي شود ، هنگامي که مقدار آن 2 است روي سطر اول LCD عبارت "CLAUSE2 true" و روي سطر دوم LCD مقدار A نوشته مي شود ،.... هنگامي مقدار آن بزرگتر از 6 شد ، چون مقدار Aدر هيچ کدام از شرط ها صدق نمي کند ، دستور بين Else وEnd If اجرا مي شود . شما ميتوانيد از اين دستور به فرم هاي مختلف ، يک شرطي يا چند شرطي استفاده کنيد با اين دستوردر ادامه بيشتر آشنا مي شويم .

#if :
اين دستور مانند دستورIf است با اين تفاوت که در با اين دستور ميتوان شروط مربوط به کارکترها را اجرا کرد ، اين دستور به فرم کلي زير است:
#if Condition
Case 1
#else
Case 2
#Endif
در صورتي که شرط درست باشد Case 1 اجرا مي شود و در صورت نا درست بودن Case 2 اجرا مي شود .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
#if Varexist( "S")
Dim A As Byte
#else
Dim S As Byte
#endif
End

Select Case :
اين دستور تقريبا مانند دستور if است و به فرم زير ميباشد :
Select Case Var
Case Test1 : Statements1
[Case Test2 : Statements2 ]
.
.
.
Case Else : Statements3
End Select
در اين دستور يک متغيير چک مي شود ، در صورتي که مقدار آن با شرط Test1 برابر باشد Statements1 اجرا مي شود، در صورتيکه مقدار آن با Test2 برابر باشد Statements2 اجرا مي شود و در صورتي که مقدار آن با هيچ يک از شروط برابر نباشد Statements3 اجرا مي شود .
نکته : برعکس دستور If که در صورتی برقراری شرط اول بقیه شرطها چک نمی شد در Select Case تمام مقادیر چک می شوند .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , _
Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Dim A As Byte
Do
Incr A
Wait 1
Select Case A
Case 1:
Locate 1 , 1
Lcd "CLAUSE true"
Locate 2 , 1
Lcd "a=1"
Case 2:
Locate 1 , 1
Lcd "CLAUSE true"
Locate 2 , 1
Lcd "a=2"
Case 3 To 5:
Locate 1 , 1
Lcd "CLAUSE true"
Locate 2 , 1
Lcd "a=3-5"
Case Else:
Locate 1 , 1
Lcd "CLAUSE false"
Locate 2 , 1
Lcd "a>6"
End Select
Loop
End
در مثال بالا هر يک ثانيه يک واحد به متغير A افزوده مي شود ،در صورتي که مقدار آن يک باشد شرط اول اجرا شده و بر روي lcd عبارات "CLAUSE true" و "A=1" نمايش داده مي شود ، در صورتي که مقدار آن دو باشد عبارت هاي "CLAUSE true" و "A=2" بر روي LCD نمايش داده مي شود ، در صورتي که مقدار آن بين 3 تا 5 (3 و 4 و 5) باشد عبارت هاي "CLAUSE true" و "A=3-5" بر روي LCD نمايش داده مي شود ،... در صورتي که هيچ کدام از شرط ها بر قرار نباشد دستورات بين Case Else و End Select اجرا مي شود.

Exit :
با دستور Exit ميتوان از تمام حلقه هاي بالا خارج شد ، فرم دستور براي هر حلقه در زير آورده شده است:
Exit For
Exit Do
Exit While
Exit Sub
Exit Function
مورد اول براي خروج از حلقه ي For - Next و مورد دوم براي خروج از حلقه ي Do - Loop و مورد سوم براي خروج از حلقه ي While- Wend و مورد چهارم براي خروج از زير برنامه و مورد آخر براي خروج از تابع است ( دو مورد آخر در بخش هاي بعدي مورد بررسي قرار مي گيرند)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , _
Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Dim A As Byte
For A = 1 To 100
Locate 1 , 1
Lcd "Exit FOR-NEXT"
Locate 2 , 1
Lcd "when A=4 a is "
Lcd A
If A = 4 Then :
Exit For
End If
Wait 1
Next
A = 1
Do
Locate 1 , 1
Lcd "Exit do-loop"
Locate 2 , 1
Lcd "when A=5 a is "
Lcd A
Wait 1
If A = 5 Then :
Exit Do
End If
Incr A
Loop
A = 1
While A < 6
Locate 1 , 1
Lcd "Exit While-Wend"
Locate 2 , 1
Lcd "when A=6 a is "
Lcd A
Incr A
Wait 1
If A = 6 Then :
Exit While
End If
Wend
End
دستورات اجرايي :
براي اينکه بتوانيد با کامپايلر بسکام راحت تر کار کنيد تعدادي دستور به دستورات بيسيک براي AVR اضافه شده است ، اين دستورات کدي را براي ريختن روي ميکرو توليد نمي کند و فقط جايگزين يک دستور مي شود يا آن را خلاصه ميکند ، استفاده از اين دستورات کاملا اختياري است ، مثلا شما مي توانيد با دستور $prog که در زير توضيح داده مي شود ، فيوز بيت دلخواه خود را پروگرام کنيد ، ميتوانيد اين کار را از طريق پروگرامر انجام دهيد و.... اين دستورات با علامت $ شروع مي شوند در زير آنها را توضيح ميدهيم : ( بعضي از دستورات مانند دستور baud$ يا .. در بخش مربوطه گفته مي شود)
دستورات : (دونقطه) (شيفت + ک) , (کما) (شيفت +و) ; (ويرگول)(حرف ک) _ (خط فاصله) (شيفت + منفي) ’ ( نقل قول تکي)

:
(شيفت +گ) (البته در حالت کيبرد انگيسي) : (دونقطه) (شيفت + ک) : با استفاده از اين دستور شما ميتوانيد چندين دستور را پشت سر هم بنويسيد .
مانند :
Incr A : Wait 1 : Lcd A : Locate 2 , 1 : Lcd B : Wait 2 : Cls : Incr B
,
(کما) (شيفت + و) : با اين دستور ميتوانيد چندين متغير را در يک خط معرفي کنيد ( Dim فقط براي متغير اول آورده مي شود)
مانند :
Dim A As Byte , B As Integer , C As Word , Q As Bit
;
(ويرگول) (حرف ک) : با اين دستور ميتوانيد چندين متغير يا کارکتر را در يک خط بنويسيد ، کارکتري بعدي از اولين فضاي خالي بعد از کارکتر قبلي نمايش داده مي شود مانند:
Lcd "a" ; A ; "b" ; B
_
(خط فاصله) (شيفت + منفي) با اين دستور ميتوان يک خط طولاني را نصف کرد .
مانند:
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5

( نقل قول تکي) (شيفت +گ) : با گذاشتن اين دستور در برنامه ، کليه حروف واعدادي که بعد از اين دستور ميايند ،کامپايل نمي شوند ، شما ميتوانيد بعد از اين دستور توضيحاتي را به برنامه اضافه کنيد ، (يادشتها به رنگ سبز در مي آيد.) شما همچنين ميتوانيد به جاي اين علامت کلمه Rem را به کار ببريد
مانند :
Start Adc 'roshan shodan adc
براي درک مطالب مثال زير را شبيه سازي کنيد :
$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 ' rah andazi lcd
Dim A As Byte , B As Integer , C As Word , D As Byte
A = 1 : B = 2 : C = 5 : D = 7
Locate 1 , 1 : Lcd A ; " " ; B ; " " ; C ; " " ; D
Locate 2 , 1 : Lcd "a" ; A ; "b" ; B
End rem payan brname




$asm :
با اين دستور شما ميتوانيد دربين دستورات بيسيک ،دستورات اسمبلي به کار ببريد دستورات اسمبلي بين $asm و $end Asm قرار ميگيرند . ( براي ديدن دستورات اسمبلي که براي AVR مورد استفاده قرار ميگيرد در HELP بسکام گزينه Assembler mnemonics را جستجو کنيد).
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
$asm
Ldi R24,1 ; load register R24 with the constant 1
St X,R24 ; store 1 into variable c
$end Asm
End

$dbg :
با نوشتن اين دستور و کامپايل و پروگرام کردن آن در ميکرو ، شما ميتوانيد توسط پروگرامر سريال برنامه داخل ميکرو را اشکال زدايي کنيد . تنها کافي است اين دستور را در برنامه خود به کار ببريد.
$dbg
Debug :
اين دستور به فرم کلي زير است:
Debug On|Off|Var
با اين دستور ميتوان تغييرات متغير Var را مشاهده کرد ، هنگامي که از اين دستور استفاده مي کنيد ، متغير var توسط پروگرامر سريال به پورت کام فرستاده مي شود و شما مي توانيد آن را در محيط شبيه ساز مشاهده کنيد ، On و Off براي شروع و پايان ارسال متغير هستند .
مانند:
$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
Do
Incr A : Wait 1 : Locate 1 , 1 : Lcd A
Debug On A
Loop
End
در مثال بالا متغيرA بهد از هر باز افزوده شدن به پورت کام فرستاده مي شود .

$default:
با اين دستور ميتوانيد متغير هاي تعريف شده را در حافظه هاي مختلف به صورت خود کار ذخيره کنيد (ذخيره سازي از اولين خانه خالي حافظه شروع مي شود) ، اين دستور به فرم کلي زير است:
$default = Var
Var : ميتواند يکي از گزينه هاي Sram , Xram , Eram باشد .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
$default Eram
Dim A As Byte , B As Byte
$default Sram
Dim D As Byte
A = 1 : B = 1
D = A * B
End
در مثال بالا متغيير هاي A و B در حافظه ي Eeprom و متغيير D در حافظه Sram ذخيره مي شود . (توجه داشته باشيد که ميکرو شما بايد داراي حافظه هاي انتخاب شده باشد)

$external :
با اين دستور شما ميتوانيد از کتابخانه های اسمبلي در بسکام استفاده کنيد ، با دستور $asm شما به تعدادي از دستورات دسترسي داريد ، با اين دستور ميتوانيد لايبري هاي زبان اسمبلي را در پوشه lib موجود در محل نصب بسکام کپي کرده و در برنامه فراخواني کنيد .
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
$external Test
Declare Sub Test(byval X As Byte , Y As Byte)
Dim Z As Byte
Call Test(1 , Z)
End

$map :
با نوشتن اين دستور در برنامه ، گزارشي به نام Map به انتهاي فايل Report افزوده مي شود ، اين متن شماره خط هاي که در آنها کد توليد شده است را نمايش مي دهد (براي ديدن فايل گزارش به آدرس : Program > Show Result برويد)

$include:
با اين دستور شما ميتوانيد برنامه ديگري را وارد برنامه خود کنيد ، برنامه ديگر بايد در محل ذخيره برنامه اصلي موجود باشد ، اين دستور به فرم کلي زير است:
$include "file"
File: نام برنامه اي است که ميخواهيد آن را وارد کنيد ، نام بايد کامل و با پسوند باشد مانند:
$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
$include "123.bas"
End
برنامه اي که به نام 123 ذخيره شده در زير آورده شده است :
Locate 1 , 1
Lcd "12365"
Locate 2 , 1
Lcd "qwert"


$programmer :
با اين دستور شما ميتوانيد نوع پروگرامر مورد استفاده را ، در برنامه تعيين کنيد ، اين دستور به فرم کلي زيراست:
$programmer = Number
Number : يکي از اعداد جدول صفحه بعد است :
همچنين ميتوانيد از مسير زير در برنامه بسکام نوع پروگرامر را تغيير دهيد :
Options > Programmer
براي اطلاعات بيشتر در مورد پروگرامر ها به قسمت ضميمه ها مراجعه کنيد .

$sim:
هنگامي که اين دستور را در برنامه به کار ببريد،کليه دستورات تاخير غير فعال ميشوند ، اين دستور هنگامي که از شبيه ساز داخلي بسکام استفاده مي کنيد کاربرد دارد ، هنگامي که مي خواهيد برنامه را روي ميکرو بريزيد يا آن را با پروتوس شبيه سازي کنيد اين دستور را پاک کنيد.

$lib :
با اين دستور شما ميتوانيداز ديگر لايبري هاي که براي بسکام نوشته شده است استفاده کنيد (مثلا لايبري lcd گرافيکي) اين دستور به فرم کلي زير است :
$LIB "Libname"
Libname1: نام لايبري ميباشد که در محل ذخيره برنامه وجود دارد ، شما همچنين ميتوانيد آن را در پوشه lib موجود در محل نصب بسکام کپي کنيد ، در اين صورت ديگر به اين دستور نيازي نيست ، مانند :
$lib "glcdSED1520.lbx"
nocompile$ :
با نوشتن اين دستور در برنامه ، برنامه کامپايل نشده و کد هگزي توليد نمي شود همچنین برنامه چک نشده و اتوماتيک ذخيره نمي شود :
$nocompile
Pushall و Popall :
دستور Popall باعث مي شود که بعد از ريست شدن ميکرو همه ريجستر هاي حافظه به حالت پيشفرض برگردند و استفاده از دستور Pushall باعث مي شود تا ريجستر ها ذخيره شود . ( در حالت عادي بعد از ريست شدن ميکرو کليه ريجستر ها به حالت پيش فرض برمي گردند.) براي استفاده از اين دستورات آن ها را در برنامه خود تايپ کنيد.



RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014

نقل قول: $map :
با نوشتن اين دستور در برنامه ، گزارشي به نام Map به انتهاي فايل Report افزوده مي شود ، اين متن شماره خط هاي که در آنها کد توليد شده است را نمايش مي دهد (براي ديدن فايل گزارش به آدرس : Program > Show Result برويد)

$include:
با اين دستور شما ميتوانيد برنامه ديگري را وارد برنامه خود کنيد ، برنامه ديگر بايد در محل ذخيره برنامه اصلي موجود باشد ، اين دستور به فرم کلي زير است:
$include "file"
File: نام برنامه اي است که ميخواهيد آن را وارد کنيد ، نام بايد کامل و با پسوند باشد مانند:
$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
$include "123.bas"
End
برنامه اي که به نام 123 ذخيره شده در زير آورده شده است :
Locate 1 , 1
Lcd "12365"
Locate 2 , 1
Lcd "qwert"


$programmer :
با اين دستور شما ميتوانيد نوع پروگرامر مورد استفاده را ، در برنامه تعيين کنيد ، اين دستور به فرم کلي زيراست:
$programmer = Number
Number : يکي از اعداد جدول صفحه بعد است :
همچنين ميتوانيد از مسير زير در برنامه بسکام نوع پروگرامر را تغيير دهيد :
Options > Programmer
براي اطلاعات بيشتر در مورد پروگرامر ها به قسمت ضميمه ها مراجعه کنيد .

$sim:
هنگامي که اين دستور را در برنامه به کار ببريد،کليه دستورات تاخير غير فعال ميشوند ، اين دستور هنگامي که از شبيه ساز داخلي بسکام استفاده مي کنيد کاربرد دارد ، هنگامي که مي خواهيد برنامه را روي ميکرو بريزيد يا آن را با پروتوس شبيه سازي کنيد اين دستور را پاک کنيد.

$lib :
با اين دستور شما ميتوانيداز ديگر لايبري هاي که براي بسکام نوشته شده است استفاده کنيد (مثلا لايبري lcd گرافيکي) اين دستور به فرم کلي زير است :
$LIB "Libname"
Libname1: نام لايبري ميباشد که در محل ذخيره برنامه وجود دارد ، شما همچنين ميتوانيد آن را در پوشه lib موجود در محل نصب بسکام کپي کنيد ، در اين صورت ديگر به اين دستور نيازي نيست ، مانند :
$lib "glcdSED1520.lbx"
nocompile$ :
با نوشتن اين دستور در برنامه ، برنامه کامپايل نشده و کد هگزي توليد نمي شود همچنین برنامه چک نشده و اتوماتيک ذخيره نمي شود :
$nocompile
Pushall و Popall :
دستور Popall باعث مي شود که بعد از ريست شدن ميکرو همه ريجستر هاي حافظه به حالت پيشفرض برگردند و استفاده از دستور Pushall باعث مي شود تا ريجستر ها ذخيره شود . ( در حالت عادي بعد از ريست شدن ميکرو کليه ريجستر ها به حالت پيش فرض برمي گردند.) براي استفاده از اين دستورات آن ها را در برنامه خود تايپ کنيد.

زير برنامه ها و فراخواني توابع :
: Declare Function
از اين دستور براي معرفي تابع در ابتداي برنامه استفاده مي شود . زماني که بخواهيم تابعي را معرفي کنيم بايستي تابع معرفي شده باشد . در صورت استفاده از تابع مي بايستي يک داده برگردانده شود .
Declare Function Test [([Byref / Byval] Var As Type1)] As Type2
Test نام تابع موردنظر است . انتقال داده بصورت Byval باعث مي شود که يک کپي از متغير به تابع فرستاده شود و در محتواي آن هيچ تغيري ايجاد نشود .ولي در حالت Byref آدرس متغير ارسال و تغيرات در آن اثر مي گذارد و داده برگشتي در صورت انجام عمليات بر روي آن با مقدار اوليه خود برابر نخواهد بود . در صورت عدم استفاده از گزينه [Byref/Byval] بصورت پيش فرض داده بصورت Byref فرستاده مي شود. Type1 نوع داده ارسال شده وType2 نوع داده برگشتي است . که هر دو مي توانند داده نوع Byte , Integer, word , Long ,String باشند .
مثال :
در مثال زير I بصورت Byval فرستاده شده است بنابراين يک کپي از مقدار I به زير تابع فرستاده مي شود و هيچ تغييري در محتواي آن ايجاد نمي شود. S بصورت Byref فرستاده مي شود و تغير در آن صورت مي گيرد . فراخواني تابع Myfunction با K و Z از نوع داده Integer و String است و مقدار برگشتي از نوع Integer است که در متغير T قرار مي گيرد . شما مي توانيد در محدوده تابع يک متغير محلي تعريف کنيد .
مثال :
$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
Declare Function Myfunction(byref I As Word , S As String )as Word
Dim K As Word , Z As String * 10 , T As Word
K = 5 : Z = "123 " : T = Myfunction(k , Z)
Locate 1 , 1
Lcd T '10
Locate 1 , 9
Lcd Z 'Bascom
Locate 2 , 1
Lcd K '24
End

Function Myfunction(byref I As Word , S As String )as Integer
I = 4 * 6
S = "Bascom"
Myfunction = 10
End Function
از اين دستور براي معرفي زير برنامه استفاده مي شود . زير برنامه اي که قصد فراخواني آن را داريم بايستي در ابتداي برنامه يا حداقل قبل از فراخواني آن معرفي شده باشد .
Declare Sub Test [([Byref / Byval] Var As Type)]
زير برنامه برخلاف تابع مقداري برنمي گرداند .در زمان ارسال داده بصورت Byref آدرس داده به زير برنامه فرستاده مي شود و در محتواي آن تغير ايجاد مي شود .ولي در حالت Byval يک کپي از داده فرستاده مي شود و به هيچ وجه در محتواي آن تغيري ايجاد نمي شود . Test نام زيربرنامه و Var نام متغير ارسالي به زير برنامه و Type نوع آن است که مي تواند داده نوع Byte , Integer , Word , String باشند .
براي نوشتن زير برنامه ابتدا نام آنرا توسط دستور زير تعريف کرده و سپس شروع به نوشتن زيربرنامه مي کنيم .
Sub Name [(Var1)]
Name نام زيربرنامه که بايد توسط دستور Declare معرفي شده باشد و با دستور End Subپايان مي يابد .
مثال :
$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
Cls
Dim A As Byte , B1 As Byte , C As Byte
Declare Sub Test(a As Byte)
A = 1 : B1 = 2 : C = 3
Lcd A ; B1 ; C '123
Call Test(b1)
End

Sub Test(a As Byte)
Locate 2 , 1
Lcd A ; B1 ; C '223
End Sub
Call :
توسط اين دستور زير برنامه يا تابعي را فراخ واني مي کنيم .
Call Test (Var1 , Var2 , ....)
Var1 , Var2 متغيرهايي که به زير برنامه انتقال مي يابند , هستند . مي توان زير برنامه را بصورت زير نيز فراخواني کرد .
TEST VAR1 , VAR2
لازم بتذکر است که نام زير برنامه قبل از فراخواني آن , بايد توسط دستور Declare فراخواني شود. اگر بخواهيم عدد ثابت را به زير برنامه انتقال دهيم بايستي حتما با آرگومان BYVAL آن را انتقال دهيم .
مثال :
$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 Byte , B As Byte
Declare Sub Test(b1 As Byte , Byval B2 As Byte)
A = 65
Call Test(a , 5)
Test A , 5
Locate 2 , 1
Lcd A
End

Sub Test(b1 As Byte , Byval B2 As Byte)
B1 = 10
B2 = 15
Locate 1 , 1
Lcd B1
Locate 1 , 9
Lcd B2
End Sub

Local :
از اين دستور براي تعريف و بکارگیری متغير محلي در زيربرنامه استفاده مي کنيم .
Local Var As Type
Var نام متغير و Type نوع داده است که مي توانند String , Word , Integer , Byte , Single , Long باشند .
نوع داده هاي Eram , Sram , Xram و آرايه ها نمي توانند محلي تعريف شوند .
يک متغير محلي يک متغير موقت است که فقط در هنگام فراخواني زير برنامه مربوطه براي آن فضا در نظر گرفته مي شود و با برگشت از زير برنامه عمر متغير (Life Time) به اتمام مي رسد .
تذکر متغيرهاي بيتي نمي توانند بصورت محلي تعريف شوند .
مانند :
$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
Declare Sub Test2
Do
Call Test2
Loop

Sub Test2
Local A As Byte
Incr A
Home : Lcd A
Waitms 200
End Sub
دستورات رياضي و محاسباتي و تبديل متغير هاي رياضي
از عملگرهاي رياضي زير مي توان در محيط BASCOM استفاده کرد و عمليات رياضي را انجام داد.
* علامت ضرب *
/ علامت تقسيم /
+ علامت جمع +
- علامت تفريق -
. علامت مميز .
> علامت بزرگتر از >
< علامت کوچکتر از <
= علامت مساوي =
^ علامت توان ^
<= علامت کچکتر يا مساوي <=
=> علامت بزرگتر يا مساوي =>
<> علامت مخالف <>
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PO RTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim Q As Word
Dim W As Word
Dim E As Word
Dim R As Word
Dim T As Word
Q = 2
W = Q + 3
Home : Lcd W '5
E = W * Q
Locate 1 , 8 : Lcd E '10
R = E ^ Q
Locate 2 , 1 : Lcd R '100
T = R - E
Locate 2 , 8 : Lcd T '90
End

Sqr:
اين دستور جدر (ريشه دوم) متغير يا عدد ثابت Source را محاسبه کرده و نتيجه را در متغير Var قرار مي دهد .
Var = Sqr (Source)
مانند :
$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 Single , A As Byte
Cls
X = Sqr(9)
Locate 1 , 1 'X = 3
Lcd X
X = X * 27
A = Sqr(x)
Locate 2 , 1
Lcd A ' A = 9
End

Sgn :
اين دستور علامت يک متغير شناور را نشان مي دهد ، در صورتي که متغير منفي باشد (X<0) مقدار Var برابر با 1- و در صورت مثبت بودن متغير (X>1) مقدار Var برابر با 1 مي شود .
Var = sgn (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 X As single , A As Single
Cls
X = -9
X = Sgn(x)
Locate 1 , 1
Lcd X 'X =0
A = Sgn(x)
Locate 2 , 1
Lcd A 'A =1
End
Power:
اين دستور فرم ديگر دستور ^ (توان) است و حاصل Source به توان Raise را محاسبه کرده و حاصل را در متغير Var قرار ميدهد .
Var = Power (Source , Raise)
مانند :
$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 , B As Single
Cls
A = 2.3
X = 10
B = A ^ X
Locate 1 , 1
Lcd B
B = Power(a , X)
Locate 2 , 1
Lcd B
End

Abs :
اين دستور به معناي رياضي |Var = |Var2 (قدرمطلق) است (اعداد منفي را به مثبت تبديل مي کند).
Var = Abs (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 Integer , C As Integer
A = -100
C = Abs(a) 'C = |a|
Lcd C 'C = 100
End

Exp :
Target برابر با e بتوان Source است . Target متغيري از نوع داده Single است .
Target = Exp (Source)
مانند :
$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 X As Single
X = Exp(1.1)
Locate 1 , 1
Lcd X 'X = 3.004166124
X = 5
X = Exp(x)
Locate 2 , 1
Lcd X 'X = 148.413085937
End

Log :
اين دستور لگاريتم طبيعي يک داده از نوع Single را برمي گرداند .
Target = Log (source)
لگاريتم متغير يا ثابت Source از نوع داده Single گرفته مي شود و در متغير Target قرار مي گيرد . مانند :
$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 = Log(100)
Locate 1 , 1
Lcd X 'X = 4.6051
X = Log(1000)
Locate 2 , 1
Lcd X 'X = 6.9077
End



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) :
تعداد زيادي از ميکرو هاي AVR داراي حافظه داخلي مي باشند ، حجم اين حافظه بسته به نوع ميکرو متفاوت است ، اطلاعات اين حافظه بر اثر قطع برق پاک نم يشود و مي تواند تا سالهاي زيادي محفوظ بماند .
EEPROM داخلي ميکرو هميشه اماده به کار است و کافي است شما در آن بنويسيد يا از آن بخوانيد ، نوشتن در EEPROM با دستور زير انجام مي شود :
Writeeeprom Var , Address
Var: متغير يا عدد ثابتي است که قصد ذخيره آن را داريد.
Address: مکاني از حافظه ميباشد که متغير در آن ذخيره مي شود . (در صورتي که آدرسي درج نشود متغير در اولين مکان خالي ذخيره مي شود و پيدا کردن آن با خداست)
ذخيره متغير اتوماتيک است و اخرين آدرس بستگي به نوع ميکرو دارد ( به ديتا شيت ميکرو مراجعه کنيد).
شما همچنين با دستور زير ميتوانيد اطلاعات داخل حافظه را بخوانيد:
Readeeprom Var , Address
Var : يک متغير متناسب با مقدار اطلاعات مي باشد ، که اطلاعات خوانده شده از آدرس درج شده ،در آن ريخته مي شود .
Address : آدرسي است که بايد اطلاعات از آن خوانده شود.
مانند:
$regfile = "m16def.dat"
$crystal = 8000000
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 , C As Byte
C = 12
Writeeeprom C , 1
Wait 1
Readeeprom A , 1
Locate 1 , 1 : Lcd A
End
در اين مثال مقدار 12 در متغير C ريخته شده است ، من اين متغير را در آدرس 1 حافظه داخلي ذخيره کردم ، و بعد از گذشت 1 ثانيه خانه 1 حافظه را خواندم و حاصل را در متغيرA ريختم و آن را روي LCD نمايش دادم . همانگونه که مشاهده خواهيد کرد عدد خوانده شده برابر 12 مي شود .
مثال ديگر:
$regfile = "m16def.dat"
$crystal = 8000000
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 Adc = Single , Prescaler = Auto
Dim A As Word , B As Byte , C As Byte
Start Adc
Do
A = Getadc(0) : A = A / 2
Locate 1 , 1 : Lcd A
Wait 1 : Incr B
If B > 180 Then
Writeeeprom A , C
C = C + 1 : B = 0
End If
If C > 3 Then
Readeeprom A , 0 : Locate 1 , 1 : Lcd A
Readeeprom A , 1 : Locate 1 , 9 : Lcd A
Readeeprom A , 2 : Locate 2 , 1 : Lcd A
Readeeprom A , 3 : Locate 2 , 9 : Lcd A
C = 0 : Else : Loop
End If
End
در برنامه بالا هر سه ساعت يک بار دماي محيط اندازه گرفته مي شود ودر حافظه داخلي ميکرو ذخيره مي شود ، بعد از گذشت 12 ساعت دما هاي ذخيره شده بر روي LCD به نمايش در ميايد .