قسمت هشتم
1- سلام خوبي
2- سلام خوبم تو چطوري
1- عالي راستي امروز چي مي خاي بگي
2- امروز بايد دستور حلقه و پرش رو كه قبلا بهت نگفتم بهت بگم كه خيلي راحت هست
1- اماده ام بگو
2- اولين دستور GOSUB هستش توسط اين دستورشما مي توني بپري توي يك زير برنامه و دستورات داخل اون زيربرنامه رو انجام بدي دقيقا همان كاري كه دستور GOTO براي ما انجام مي داد اين دستور GOSUB هم براي ما انجام مي ده با يك تفاوت و اون هم اينكه در دستور GOSUB ما با دستور RETURN مي توانيم دوباره برگرديم GOSUB رو بخونيم كاري كه با دستور GOTO نمي تونستيم انجام بديم
1- يك مثال بزن كه نفهميدم
2- باشه اينم مثال :
CONFIG PINB.0 = INPUT
CONFIG PORTA = OUTPUT
DO
IF PINB.0 = 1 THEN GOSUB BENZ
LOOP
END
BENZ:
TOGGLE PORTA
WAITMS 50
RETURN
توسط برنامه بالا مي تونيم با زدن ميكرو سوييچ پورت A رو TOGGLE كنيم. يعني براي بار اول كه ميكروسوييچ رو ميزنيم پورت A يك مي شه براي بار دوم كه ميزني صفر ميشه براي بار سوم كه مي زني دوباره يك مي شه براي بار چهارم كه ميزني صفر ميشه و الي اخر. در خط اول ما پايه B.0 رو به عنوان ورودي پيكره بندي كرديم . در خط دوم پورت A رو براي خروجي پيكره بندي كرديم . در خط سوم ما اول حلقه رو با نوشتن دستور DO عنوان كرديم. در خط چهارم ما نوشتيم
IF PINB.0 = 1 THEN GOSUB BENZ به معني كه اگر پايه B.0 ميكروكنترلر يك شد بپر برو توي
زيربرنامه BENZ . در خط پنجم با دستور LOOP انتهاي حلقه رو مشخص كرديم . در خط ششم نوشتيم END كه برنامه ما هيچ وقت به اينجا نمي رسه . در خط بعدي ما يك زيربرنامه به اسم BENZ مشخص كرديم . خط هفتم نوشتيم TOGGLE PORTA يعني وضعيت پورت A رو هر چي كه هست معكوسش كن يعني اگه يك هستش بكنش صفر و اگه صفر هستش بكنش يك . در خط هشتم ما يك تاخر 50 ميل ثانيه اي گذاشتيم . در خط نهم نوشتيم RETURN كه در ادامه بهت كه توي اين برنامه وضيفش چيه.
خوب ميكروكنترلر مياد از خط اول برنامه شروع ميكنه به خوندن خط اول خط دوم رو مي خونه . به خط سوم كه مي رسه يعني DO مي فهمه كه يك حلقه سر راهشه و توي اين حلقه يكسره دور ميزنه و خارج نمي شه تا وقتي كه اون شرطي كه گذاشتيم اجرا بشه يعني IF PINB.0 = 1 THEN GOSUB BENZ . حالا فرض مي كنيم كه ما ميكروسوييچ رو فشار داديم و با اين كارمون PINB.0 رو يك كرديم در اينجا ميكرو مياد دستور شرط رو يعني THEN GOSUB BENZ رو اجرا ميكنه يعني ميپره مي ره توي زيربرنامه BENZ و دستورات داخل اين زير برنامه رو اجرا ميكنه. خوب حالا داخل اين زير برنامه ما اين دستورات رو نوشتيم TOGGLE PORTA يعني وضعيت پورت A رو هر چي كه هستش معكوسش كن و در اينجا ميكرو مياد پورت A رو يك ميكنه و اگه شما به پورت A LED وصل كرده باشي مي بيني كه روشن مي شه دستور بعدي كه داخل اين زيربرنامه هست WAITMS 50 كه ميكرو با خوندن اين خط به مدت 50 ميلي ثانيه در اجراي برنامه تاخير ايجاد ميكنه . دستور بعدي كه ما داخل اين زيربرنامه نوشتيم RETURN هستش كه ميكرو بعد از گذشت 50 ميلي ثانيه كه اين دستور رو مي خونه برمي گرده توي حلقه . و دوباره توي اون حلقه دور مي زنه تا وقتي كه دوباره شرط اجرا بشه و دوباره بپره بره توي زيربرنامه.
برنامه بالا رو اينطوري هم ميشه نوشت كه اين روش منطقي تره :
3-
CONFIG PINB.0 = INPUT
CONFIG PORTA = OUTPUT
DO
DEBOUNCE PINB.0 , 1 , BENZ , SUB
LOOP
END
BENZ:
TOGGLE PORTA
RETURN
برنامه بالا رو فقط تاخير 50 ميلي ثانيه اي شو حذف كردم . برنامه بالا رو تنها تغييري كه توش انجام دادم خط چهارمش هستش يعني DEBOUNCE PINB.0 , 1 , BENZ , SUB كه ما با نوشتن اين خط اين رو به ميكرو فهمونيدم كه اگر يك موقع PINB.0 ما يك شد بپر برو توي زيربرنامه BENZ . اون SUB هم نوشتيم كه به ميكرو بفهمونيم كه ما دستور GOSUB مي خايم كه اين پرش صورت بگيره و اگه ننويسيم ميكرو خودش پيش فرض با دستور GOTO ميپره توي زيربرنامه . خوب حالا فرض كن كه اين شرط يعني پايه B.0 يك شده در اينجا ميكرو ميپره ميره توي زيربرنامه BENZ و دستورات داخل اين زيربرنامه رو اجرا مي كنه و وقتي كه به دستور RETURN ميرسه مفهمه كه بايد بپره بره توي حلقه و خط
DEBOUNCE PINB.0 , 1 , BENZ , SUB
رو دوباره بخونه و داخل اين حلقه دوباره گير ميكنه تا وقتي كه پايه B.0 دوباره يك بشه و دوباره بپره بره توي زيربرنامه و روز از نو روزي از نو.
دستور بعدي حلقه FOR –NEXT هستش كه با اين دستور مي توني يك حلقه شمارشي ايجاد كني اگه توجه كني تا حالا من يك حلقه DO-LOOP بهت گفتم كه يك حلقه نا محدود بود ولي اين حلقه FOR-NEXT يك حلقه محدود هستش يعني مياد توي يك حلقه ايجاد ميكنه البته تايك زمان مشخصي اين كار رو ميكنه كه اين زمان دست خودمون هستش كه چقدر باشه به مثال زير توجه كن :
DIM A AS BYTE
FOR A = 1 TO 10 STEP 1
CLS
LCD A
WAITMS 30
NEXT A
END
خوب بريم سر تحليل برنامه . خط اول كه ما يك متغيير به اسم A و از نوع بايت تعريف كرديم . در خط دوم ما نوشتيم كه
FOR A = 1 TO 10 STEP 2 به اين معني كه متغيير A رو افزايش بده از عدد 1 تا عدد 10 . و دستور STEP 1 كه نوشتيم به اين معني هستش كه يكي يكي بشمار يا به عبارتي يك پله يك پله بشمار
1- ببين نفهميدم اين STEP 1 رو دوباره توضيح بده
2- يعني اين كه يكي يكي بشمار 1 و 2 و3 و4 و5 و6 تا عدد 10 . اگه ما به جاي STEP 1 مي داديم STEP 2 دو تا دوتا ميشمرد اينطوري 1 و 3 و5 و7 و9
خوب بريم سر ادامه وقتي كه ميكرو خط FOR A = 1 TO 10 STEP 2 رو مي خونه شروع مي كنه به افزايش متغيير A . بعد مياد خط بعدي كه نوشته CLS رو مي خونه و در اين جا LCD رو پاك ميكنه . بعد مياد خط LCD A رو ميخونه و مي فهمه كه بايد مقداري كه داره افزايش پيدا ميكنه رو نشون بده . خط بعدي نوشتيم WAITMS 30 كه يك تاخير 30 ميلي ثانيه اي در اجراي برنامه انجام ميده و كارش اين هستش كه بياد مدت زمان افزايش رو تند يا كند كنه يا به عبارتي اهسته يا سريع كنه . خط بعدي نوشتيم NEXT A كه ميكرو با خوندن اين خط دوباره برميگرده و خط دوم رو يعني خط
FOR A = 1 TO 10 STEP 2 رو مي خونه . خط بعدي نوشتيم END كه برنامه ما فعلا به اين قسمت نمي رسه تا وقتي كه شمارش تموم بشه
1- من كه چيزي نفهميدم
2- بزار تحليلش كنم مي فهمي
خوب حالا تحليل برنامه : ميكرو مياد از خط اول شروع ميكنه به خوندن و مي فهمه كه ما يك متغيير به اسم a و از نوع بايت تعريف كرديم . در خط دوم كه ما نوشتيم FOR A = 1 TO 10 STEP 1 ميكرو مياد شروع ميكنه به شمارش يا همون افزايش متغيير يك نكته رو بزار هميجا بگم كه فرقي نداره كه عددها چقدر باشه حتي مي تونيم بگيم كه از 10 شروع به شمارش كن تا مثال 110 هيچي محدوديتي وجود نداره البته حداكثر تا 255 ميتوني بدي . خوب بري سر دستوري كه نوشتيم . خوب بعد ميكرو مياد دفعه اول خود مقدار 1 رو ميزاره توي متغيير A بعد مياد با فرمان CLS ال سي دي رو پاك ميكنه و با دستور LCD A مياد مقدار متغيير A رو كه الان هست 1 رو روي ال سي دي نمايش مي ده بعد بادستور WAITMS 30 مياد يك تاخير 30 ميلي ثانيه اي در اجراي برنامه ايجاد مي كنه و در خط بعد تا كه دستور NEXT A رو مي خونه برمي گرده توي اون خط FOR A = 1 TO 10 STEP 1 و دوباره كه اين دستور رو خوند مقدار متغيير A رو يك واحد بيشتر مي كنه يعني 2 و دوباره با دستور CLS ال سي دي رو پاك مي كنه و با دستور LCD A مياد مقدار متغيير A رو كه الان هست 2 رو روي ال سي دي نمايش مي ده . اين روال همينطور ادامه داره تا اين كه مقدار متغيير A بشه 10 يا به عبارتي مساوي بشه با مقداري كه در پايان شمارش بهش داديم ( كه در اينجا عدد 10 رو داديم) و وقتي كه اين اتفاق افتاد ميكرو مياد خط زيري NEXT A رو مي خونه كه ما در اينجا دستور END رو گذاشتيم كه برنامه به پايان برسه ولي شما اگه حال كردي كه شمارش دوباره اغاز بشه و دوباره بشماره مي توني قبل از دستور FOR يك زيربرنامه تعريف كني و در بعد دستور NEXT A هم يك دستور پرش به اين زيربرنامه رو بزاري كه هر وقت كه شمارش به پايان رسيد ميكرو بپره بره توي اين زيربرنامه و شمارش رو از دوباره اغاز كنه مثل مثال زير
DIM A AS BYTE
MAIN:
FOR A = 1 TO 10 STEP 1
CLS
LCD A
WAITMS 30
NEXT A
GOTO MAIN
END
دستور بعدي WHILE – WEND هستش اين دستور همون كاري رو مي كنه كه دستور DO – LOOP انجام مي داد ولي با يك تفاوت اون هم اينكه براي داخل شدن به اين حلقه بي نهايت بايد شرط مورد نظري كه جلوي WHILE نوشته ميشه اول اجرا بشه تا اجازه داخل شدن به اين حلقه داده بشه . يك چيز ديگه هم كه هست اينه كه WHILE ابتداي حلقه هستش مثل همان DO كه ابتداي حلقه بود و WEND هم انتهاي حلقه مثل LOOP كه انتهاي حلقه بود به مثال زير توجه كن كه خيلي هم ساده هست.
1- يك سوال فرق بين دستور WHILE – WEND با دستور DO – LOOP چي هستش
2- در دستور DO – LOOP شما براي ورود به حلقه نياز به اجازه نداشتي ولي توي دستور WHILE – WEND نياز به كسب اجازه داري حالا اين اجازه كي صادر ميشه زماني كه شرطي رو كه جلوي WHILE گذاشتيم اجرا بشه . اگه بخاي به يك زبون ديگه حاليت كنم بايد بگم كه فرق اين دوتا دستور مثل ابتدايي و دانشگاه هستش شما توي ابتدايي براي بيرون رفتن از كلاس بايد از معلمتون اجازه مي گرفتي ولي توي دانشگاه اجازه نمي گيري و سرتو ميندازي پايين و مي ري بيرون و اگه يك زماني توي دانشگاه از استاد اجازه بگيري بقيه بهت مي خندن توي ميكرو هم همينطوره ممكنه كه متغييرا بهت بخندن.
خوب بري يك مثال ساده هم برات بزنيم كه حال كني :
DIM K AS BYTE
K = 3
WHILE K = 3
CLS
LCD "OK"
WEND
END
خط اول ما يك متغيير به اسم K و از نوع بايت تعريف كرديم .
خط دوم به متغيير K مقدار داديم . مقدار 3 داديم
خط سوم با دستور WHILE ابتداي حلقه رو مشخط كرديم البته براي ورود به حلقه اين حلقه يك شرط گذاشتيم كه اين شرط هر چيزي ميتونه باشه كه اين شرط رو ما بايد جلوي دستور WHILE با يكم فاصله بنويسيم . شرطي كه نوشتيم K = 3 هستش يعني اگر كه مقدار K عدد 3 بود اجازه ورود به حلقه داده ميشه .
خط چهارم كه داخل حلقه قرار داره CLS هستش كه مي دوني چي كار مي كنه
خط پنجم هم LCD "OK" هستش كه اين دستور هم داخل حلقه قرار داره
خط ششم WEND هسش يعني پايان حلقه
خط هفتم هم END هستش كه تا زماني كه شرط بر قرار باشه برنامه به اين دستور نمي رسه
تحليل اين برنامه هم خيل ساده هسش ميكرو مياد از خط اول شروع مي كنه به خوندن خط اول خط دوم رو مي خونه مي رسه به خط سوم اين جا رو گوش كن كه خيلي مهمه اگه شرط برقرار بود يعني مقدار K = 3 بود كه الان هست اجازه ورود به اين حلقه داده مي شه ولي اگه شرط برقرار نبود ميكرو ميره و خط بعدي WEND رو مي خونه كه ما اينجا حال كرديم كه اگه شرط برقرار نبود برنامه به END برسه وتموم بشه .
دستور بعدي DELAY هستش كه اين دستور يك دستور تاخير در اجراي برنامه هستش همانند دستور هاي WAITMS – WAIT –WAITUS كه دستور DELAY به مدت 1000 ميكروثانيه در اجراي برنامه تاخير ايجاد ميكنه كه نياز هم به مثال نيست.
فعلا همينا رو داشته باش تا بعد .