آردوینو در حال خروج از حلقه حلقه های FOR و WHILE در آردوینو. چگونه می توان از حلقه زمانی یا برای شکستن خارج شد

"، ما یاد گرفتیم که چگونه از یک حلقه "for" برای سازماندهی عملکرد کنترلر استفاده کنیم. این نوع حلقه در همه جا استفاده می شود و بیش از اینکه "نیاز به عملیات حلقه" را پوشش دهد. با این حال، نوع دیگری از حلقه وجود دارد - "در حالی که". این بهتر از یک حلقه for نیست، فقط از اصول مختلفی استفاده می کند.

در بیشتر موارد، می توانید انتخاب کنید که کدام یک از دو نوع حلقه استفاده شود. در ما از "while" برای توقف برنامه تا زمانی که کاربر داده های مورد نیاز را وارد کند استفاده کردیم. در این درس نگاهی دقیق تر به نحوه عملکرد این حلقه با استفاده از پلتفرم آردوینو به عنوان مثال خواهیم انداخت.

بیایید کار را با مدار متشکل از 2 LED ادامه دهیم.

علاوه بر این، با کدی که در درس 14 نهایی کردیم به کار ادامه خواهیم داد.

بازگشت به گذشته: کنترلر از کاربر درخواست داده، منتظر ورودی می ماند و سپس مقادیر حاصل را به متغیرها اختصاص می دهد. blinkNumberGreenو blinkNumberRed. این به کاربر اجازه می دهد تا تعداد دفعات چشمک زدن هر یک از 2 LED را کنترل کند.

برای گسترش جهان بینی یک برنامه نویس، ارزش یادگیری استفاده از دو نوع حلقه برای اجرای وظایف یکسان را دارد و در آینده می توانید همدردی با این یا نوع دیگری را نشان دهید.

بیایید بفهمیم که چگونه کار می کند:

بین المللی z= 1 ; // یک متغیر را اعلام کنید و مقدار 1 را به آن اختصاص دهید

در حالی که (z<=10) { //запускаем цикл در حالی که

سریال. println(z) // خروجی مقدار فعلی متغیرz از طریق پورت سریال

z= z+1 // مقدار متغیر را افزایش دهیدzتوسط 1

) // حلقه را پایان دهید

تا زمانی که "شرط" توضیح داده شده در پرانتز درست باشد، حلقه while به اجرای دستورات ادامه خواهد داد. در مثال بالا، تا زمانی که z کمتر یا مساوی 10 باشد، حلقه به اجرای دستورات ادامه می دهد. بدنه حلقه 2 دستور را اجرا می کند:

  • خروجی مقدار یک متغیر از طریق پورت سریال.
  • افزایش مقدار یک متغیر به اندازه 1 (به طور علمی افزایش نامیده می شود).

با افزایش مقدار متغیر، برنامه در نهایت از حلقه خارج می شود. اگر برای لحظه ای تصور کنیم که فراموش کرده ایم این خط را مشخص کنیم یا نوعی خرابی رخ دهد، برنامه با خوشحالی وارد یک حلقه می شود (به عبارت دیگر، یخ می زند).

حلقه کار خود را با بررسی صحت شرط آغاز می کند. اگر z کمتر یا مساوی 10 باشد، برنامه حلقه را اجرا می کند. سپس وضعیت دوباره بررسی می شود و غیره. هنگامی که مقدار متغیر به z = 11 رسید، شرط دیگر درست نخواهد بود. برنامه حلقه را اجرا نمی کند و بلافاصله بعد از حلقه حلقه به خط بعدی می رود.

تئوری بس است، بیایید به سراغ عمل برویم. بیایید حلقه‌های for را در کد منبع با حلقه‌های while جایگزین کنیم.

فلاشر انجام شده توسط چرخه FOR:

برای (int i = 1; i<= blinkNumberGreen; i++) // راه اندازی چرخهبرای

{

سریال. چاپ("سبز چشمک زد")؛

Serial.println(i);

digitalWrite (greenLed، HIGH); //روشن کن سبز دیود ساطع نور

تاخیر (timeOnGreenLed)؛ //ما منتظریم

digitalWrite (سبز، LOW)؛ //خاموش کردن سبز دیود ساطع نور

تاخیر (timeOffGreenLed)؛ //ما منتظریم

}

فلاشر در چرخه WHILE:

بین المللی من=1; //یک متغیر را اعلام کنید و مقدار 1 را به آن اختصاص دهید

در حالی که (من<= blinkNumberGreen)

{ // راه اندازی چرخهدر حالی که

Serial.print("سبز چشمک زد «);

Serial.println(i);

digitalWrite (سبز، HIGH)؛ //روشن کن سبز دیود ساطع نور

تاخیر (timeOnGreenLed)؛ //ما منتظریم

digitalWrite (سبز، LOW)؛ //خاموش کردن سبز دیود ساطع نور

تاخیر (timeOffGreenLed)؛ //ما منتظریم

من= من+1 //مقدار متغیر را 1 افزایش دهید

}

برنامه را ذخیره کنید و سیستم عامل را در کنترلر بارگذاری کنید. بیایید به نتیجه نگاه کنیم.

حلقه ها با استفاده از دستورات برایو در حالی کهیکی از مهم ترین ساختارهای زبان C++ است که زیربنای آردوینو قرار دارد. آنها کاملاً در هر طرحی یافت می شوند، حتی اگر شما آن را ندانید. در این مقاله نگاهی دقیق‌تر به حلقه‌ها خواهیم داشت، متوجه می‌شویم که تفاوت بین for و while چیست، چگونه می‌توانید نوشتن یک برنامه را با کمک آنها ساده کنید و از چه اشتباهاتی باید اجتناب کرد.

اگر هنوز یک برنامه نویس مبتدی هستید و می خواهید بفهمید که حلقه چیست و چرا به آن نیاز است، به بخش بعدی این مقاله با توضیحات مفصل نگاه کنید.

عملگر WHILE در C++ و Arduino برای تکرار همان دستورات به تعداد دلخواه بارها استفاده می شود. در مقایسه با حلقه FOR، حلقه WHILE ساده‌تر به نظر می‌رسد؛ معمولاً در جایی استفاده می‌شود که نیازی به شمارش تعداد تکرارها در یک متغیر نیست، بلکه فقط باید کد را تکرار کنیم تا چیزی تغییر کند یا رویدادی رخ دهد.

نحو

در حالی که(<условие или список условий>)
{
<программный блок, который будет повторяться>
}

هر ساختار زبانی که مقدار بولی را برمی گرداند می تواند به عنوان شرط استفاده شود. شرایط می تواند عملیات مقایسه، توابع، ثابت ها، متغیرها باشد. مانند هر عملیات منطقی دیگری در آردوینو، هر مقداری غیر از صفر به عنوان درست، صفر – نادرست درک می شود.

// یک حلقه بی پایان while(true)( Serial.println("Waiting..."); ) // حلقه ای که اجرا می شود تا زمانی که مقدار تابع checkSignal() تغییر کند while(!checkSignal())( Serial.println ("در انتظار...")؛

توجه داشته باشید که دستور while را می توان بدون مسدود کردن بلوک با بریس های فرفری استفاده کرد، در این صورت اولین دستوری که بعد از حلقه با آن مواجه می شود، تکرار می شود. استفاده از آن در حالی که بدون بریس مجعد است، به شدت توصیه نمی شود، زیرا در این صورت اشتباه کردن بسیار آسان است. مثال:

while(true) Serial.print("در انتظار وقفه"); تاخیر (1000);

در این حالت، کتیبه در یک حلقه بی پایان و بدون مکث نمایش داده می شود، زیرا دستور delay(1000) تکرار نمی شود. شما می توانید زمان زیادی را صرف تشخیص چنین خطاهایی کنید - استفاده از بریس فرفری بسیار ساده تر است.

مثالی از استفاده از حلقه while

اغلب اوقات، while برای انتظار برای برخی رویدادها استفاده می شود. به عنوان مثال، آماده بودن آبجکت سریال برای کار.

Serial.begin(9600); در حالی که (!Serial) ( ; // برخی از بردهای آردوینو باید منتظر بمانید تا پورت سریال آزاد شود)

نمونه ای از انتظار برای ورود یک کاراکتر از دستگاه های خارجی از طریق UART:

while(Serial.available())( int byteInput = Seria.read(); // برخی اقدامات دیگر)

در این مورد، تا زمانی که Serial.available() یک مقدار غیر صفر برمی گرداند، مقادیر را می خوانیم. هنگامی که تمام داده های بافر تمام شود، حلقه متوقف می شود.

حلقه FOR در آردوینو

در حلقه FOR، ما این فرصت را داریم که نه تنها شرایط مرزی را تعیین کنیم، بلکه بلافاصله یک متغیر برای شمارنده تعریف کنیم و نشان دهیم که مقادیر آن در هر تکرار چگونه تغییر می کند.

برای نحو حلقه

در اینجا طراحی کمی پیچیده تر خواهد بود:
برای (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

ساده ترین مثال:

برای(int i=5;i<10;i++){ // Конструкция «3 в одном» pinMode(i, OUTPUT); }

ما بلافاصله یک متغیر ایجاد کردیم، آن را مقدار دهی اولیه کردیم و نشان دادیم که در پایان هر چرخه مقدار شمارنده باید یک عدد افزایش یابد. و تمام - اکنون می توانید از متغیر داخل حلقه استفاده کنید.

مرحله متغیر ممکن است متفاوت باشد. در اینجا نمونه هایی وجود دارد:

  • برای (int i=0; i<10; i=i+2) // Шаг 2
  • برای (int i=0; i<10; i+=2) // Аналогичен предыдущему
  • for(int i=10; i>0; i–) // بازگشت - از 10 به 1

حلقه while انجام دهید

در برخی موارد، باید حلقه را به گونه ای سازماندهی کنیم که دستورالعمل های بلوک حداقل یک بار اجرا شوند و سپس بررسی انجام شود. برای چنین الگوریتم هایی می توانید از ساخت do while استفاده کنید. مثال:

Do ( Serial.println("Working"); ) while (checkSomething());

این نسخه از حلقه هیچ مشکلی ندارد - ما به سادگی بلوک را با شرایط پایین منتقل کردیم، بنابراین تمام محتویات داخل بریس های فرفری بعد از عملگر do قبل از اولین بررسی اجرا می شود.

جملات را ادامه دهید و بشکنید

شرایطی وجود دارد که شما نیاز دارید که اجرای یک حلقه را در داخل یک بلوک حلقه، بدون اینکه منتظر بمانید تا به بلوک بررسی شرط بروید، فوراً قطع کنید. برای این کار می توانید از اپراتور استفاده کنید زنگ تفريح:

while (true) (اگر (checkSomething()) ( break; ) )

اگر به سادگی بخواهیم پیشرفت تکرار فعلی را متوقف کنیم، اما از حلقه خارج نشویم، بلکه به بلوک بررسی شرط برویم، باید از عملگر استفاده کنیم. ادامه هید:

while (true) (اگر (checkSomething()) (ادامه دهید؛ ))

دستورات continue و break را می توان با همه انواع حلقه های FOR و WHILE استفاده کرد.

حلقه های تو در تو در آردوینو

هر گونه از حلقه ها را می توان به راحتی با یکدیگر ترکیب کرد و ساختارهای تودرتو ایجاد کرد. متغیرهای تعریف شده در بلوک حلقه "پوشاننده" در حلقه داخلی در دسترس خواهند بود. رایج ترین مثال از این نوع حلقه، پیمایش آرایه های دو بعدی است. در مثال زیر، ما از یک حلقه دوتایی استفاده می کنیم: حلقه اول از طریق ردیف ها (متغیر i) تکرار می شود، دومی، تو در تو، از میان ستون ها (متغیر j) آرایه که در متغیر arr تعریف کردیم، حلقه می زند.

Int arr; void setup() ( برای (int i = 0; i< 10; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = i * j; Serial.println(arr[i][j]); } } }

بیشتر در مورد چرخه ها

اگر هرگز با حلقه ها کار نکرده اید، بیایید کمی به دنیای تئوری شیرجه بزنیم و بفهمیم که حلقه ها چیست و چرا به این ساختارهای زبانی مرموز نیاز داریم.

چرا به یک حلقه نیاز داریم؟

در واقع وظیفه اصلی حلقه این است که ساختارهای یک زبان را چندین بار تکرار کند. این نیاز تقریباً در هر برنامه ای ایجاد می شود و مطمئناً هیچ طرح آردوینو نمی تواند بدون حلقه انجام دهد - تابع حلقه () نیز در یک حلقه بی نهایت فراخوانی می شود.

بیایید به مثال زیر نگاه کنیم. شما باید به طور همزمان 5 ال ای دی متصل به برد آردوینو را از پایه های 5 تا 9 تامین کنید. واضح ترین گزینه برای این کار قرار دادن پنج دستورالعمل در یک ردیف است:

digitalWrite (5، HIGH);

digitalWrite (6، HIGH);

digitalWrite (7، HIGH);

digitalWrite (8، HIGH);

digitalWrite (9، HIGH);

بیایید فعلاً مسئله خطرپذیری چنین اقدامی را نادیده بگیریم، زیرا گنجاندن همزمان چنین تعداد LED باعث افزایش بار در مدار برق برد می شود. نکته اصلی در حال حاضر برای ما این است که ما پنج خط کد ایجاد کرده ایم که هر کدام با بقیه فقط یک رقم متفاوت است. این رویکرد دارای معایب زیر است:

  • با هر تغییری باید همزمان در بسیاری از خطوط تغییراتی ایجاد کنید. به عنوان مثال، اگر لازم باشد ال ای دی ها را به پایه های 2 تا 6 تغییر دهیم یا به جای روشن کردن ولتاژ آن را خاموش کنیم، باید 5 تغییر در کد ایجاد کنیم. اگر دستورالعمل ها و تغییرات بیشتری وجود داشته باشد چه؟
  • کد بزرگ با تعداد زیادی دستورالعمل مشابه برای خواندن ناخوشایند و ناخوشایند است. پنج خط یکسان خیلی ترسناک نیستند. اما عادت به کدهای کثیف در نهایت منجر به ده ها و صدها صفحه اضافی در لیست می شود که هم شما و هم همکارانتان را ناامید می کند.
  • در فرآیند "کپی پیست" دستورالعمل های تقریباً یکسان، می توانید به راحتی اشتباه کنید، به عنوان مثال فراموش می کنید شماره پین ​​را تغییر دهید: digitalWrite(5, HIGH); digitalWrite (5، HIGH);
  • شما به راحتی می توانید با نشان دادن این کد به مصاحبه کننده در هر شرکت نرم افزاری معمولی در مصاحبه شکست بخورید.

از همه اینها، می‌توان نتیجه گرفت که تقریباً همیشه باید از استفاده مجدد از رشته‌های مشابه اجتناب شود و حلقه‌ها جایگزین شوند. علاوه بر این، در بسیاری از موقعیت ها انجام بدون چرخه غیرممکن است، هیچ چیز نمی تواند جایگزین آنها شود. شما نمی توانید تعداد دفعات تکرار کد را در حین اجرای برنامه تغییر دهید. به عنوان مثال، شما باید هر عنصر را پردازش کنید آرایه داده، از دستگاه های خارجی دریافت شده است. شما هرگز پیش بینی نمی کنید که چه مقدار داده وجود دارد، چند بار پردازش تکرار می شود و بنابراین نمی توانید تعداد دستورالعمل های لازم را در زمان نوشتن مقاله درج کنید.

و در اینجا چرخه ها به کمک ما می آیند.

قوانین نحوی

در آردوینو حلقه بزنیدیک بلوک برنامه خاص است که در طول اجرای برنامه به تعداد معینی فراخوانی می شود. در این بلوک، ما خود دستوراتی را که فراخوانی می‌شوند و قوانینی که کنترلر تعیین می‌کند چند بار باید فراخوانی شوند را توضیح می‌دهیم.

در مثال بالا، می‌توانیم به کنترلر موارد زیر را بگوییم:

دستور را تکرار کنید دیجیتال 5 بار بنویسید

در دنیای ایده آل با برنامه نویسان ربات، این احتمالا کافی خواهد بود، اما از آنجایی که ما با کامپیوتر در C++ صحبت می کنیم، باید این عبارت را به این زبان ترجمه کنیم:

دستور را تکرار کنید - باید از دستورالعمل های خاصی استفاده کنید که به کنترل کننده می گوید که چیزی جالب با حلقه های while یا for شروع می شود

دیجیتال رایت – آن را به حال خود رها کنید، اما یک بار آن را بنویسید و آن را در پرانتزهای مجعد قرار دهید. با شماره پین ​​ها چه کار کنیم - درست در زیر.

5 بار – برای این کار از یک شمارنده استفاده کنید که با هر تکرار افزایش می یابد. در ابتدا (یا انتهای) یک بلوک، می توانید مقدار این شمارنده را با مقدار حدی (در این مورد 5) با استفاده از عملیات مقایسه مقایسه کنید.

بیایید به مثالی از چنین دستور حلقه "ترجمه شده" با دستور while نگاه کنیم:

شمارنده بین المللی = 0; // متغیری که مقدار شمارنده را ذخیره می‌کند. // در مورد ما، شمارنده شمارنده ما است، 5 مقدار حد است، شرط این است که مقدار شمارنده کمتر از 5 باشد. // اما می توانیم عملگرهای منطقی کاملاً متفاوتی را در حالی که (counter< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

برای کسانی که متوجه خطایی در کد داده شده اند، پنج می دهیم و بلوک حلقه را متفاوت می نویسیم:

در حالی که (کنترل< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

همین نتیجه را می توان با استفاده از یک حلقه FOR به دست آورد:

برای (int counter = 0; counter<5; counter ++){ digitalWrite(counter+5, HIGH); }

همانطور که می بینید، در این مورد، ما بلافاصله تمام عملیات لازم را با شمارنده در یک دستورالعمل FOR قرار می دهیم - در صورت نیاز به شمارش مقدار مورد نیاز، این بسیار راحت تر است.

می توانید اطلاعات دقیقی در مورد قوانین استفاده از حلقه ها در بخش های مربوطه این مقاله به دست آورید.

نتیجه

در این مقاله، ساختارهای بسیار مهم زبان آردوینو را بررسی کردیم: حلقه‌های FOR و WHILE. شما می توانید این عملگرها را تقریباً در هر طرح کم و بیش پیچیده ای پیدا کنید، زیرا بدون حلقه ها، بسیاری از عملیات روی داده ها غیرممکن خواهد بود. هیچ چیز پیچیده ای در نحو حلقه ها وجود ندارد - شما به راحتی می توانید به آنها عادت کنید و می توانید فعالانه از آنها در پروژه های خود استفاده کنید.

هر زبان برنامه نویسی دارای مجموعه ای از دستورالعمل های کنترلی است که امکان اجرای مکرر کد مشابه (یک حلقه)، انتخاب یک قطعه کد مناسب (شرایط) و دستورالعمل هایی برای خروج از قطعه کد فعلی را فراهم می کند.

Arduino IDE اکثر کنترل های لازم را از C/C++ قرض گرفته است. نحو آنها با C یکسان است. در زیر به طور مختصر نحو آنها را توضیح خواهیم داد.

اگر بیانیه

دستور if به شما امکان می دهد بسته به نتیجه بررسی یک شرایط خاص، یک قطعه خاص از یک برنامه را اجرا کنید. اگر شرط برقرار باشد، کد برنامه اجرا می شود، اما اگر شرط برقرار نباشد، کد برنامه حذف می شود. نحو دستور if به صورت زیر است:

اگر (شرط) (دستورالعمل 1؛ دستورالعمل 2؛ )

شرط می تواند هر مقایسه ای از یک متغیر یا مقدار برگردانده شده توسط یک تابع باشد. معیار اصلی برای شرط اگر این است که پاسخ باید همیشه درست یا نادرست باشد. نمونه هایی از شرایط یک دستور if:

If(a!=2) ( ) if(x<10) { } if(znak==’B’) { }

در داخل براکت هایی که داخل شرط نوشته شده است، می توانید کد را اجرا کنید.

افرادی که شروع به یادگیری برنامه نویسی می کنند اغلب اشتباه می کنند که مقدار یک متغیر مشخص شده را با استفاده از یک علامت "=" برابر می کنند. چنین نمادی به وضوح تخصیص یک مقدار متغیر را نشان می دهد، و بنابراین، شرط همیشه "درست" است، یعنی برآورده می شود. آزمایش مساوی بودن یک متغیر با مقدار معینی همیشه با علامت دو برابری (==) نشان داده می شود.

می توانید از حالت تابع به عنوان یک شرط استفاده کنید، به عنوان مثال:

If(init()) (Serial.print("ok");)

مثال بالا به صورت زیر اجرا می شود: در مرحله اول تابع init() فراخوانی می شود. این تابع مقداری را برمی گرداند که به صورت "true" یا "false" تفسیر می شود. بسته به نتیجه مقایسه، یک متن "ok" ارسال می شود یا چیزی ارسال نمی شود.

اگر… بیانیه دیگری

دستور if توسعه یافته عبارت if….else است. این تضمین می کند که زمانی که یک شرط درست است (true) یک قطعه کد اجرا می شود و زمانی که شرط برآورده نمی شود قطعه دوم کد اجرا می شود (false). نحو دستور f if….else به صورت زیر است:

اگر (شرط) ( // دستور A ) دیگری ( // دستور B )

دستورات "A" فقط زمانی اجرا می شوند که شرط برقرار باشد، دستور "B" زمانی اجرا می شود که شرط برقرار نباشد. اجرای همزمان دستور «الف» و «ب» امکان پذیر نیست. مثال زیر نحوه استفاده از نحو if...else را نشان می دهد:

If (init()) (Serial.print("ok")؛ ) else (Serial.print("خطا");)

به این ترتیب می توانید اجرای صحیح تابع را بررسی کرده و به کاربر اطلاع دهید.

یک روش معمول انکار این شرایط است. این به این دلیل است که تابعی که به درستی اجرا شده است مقدار 0 را برمی‌گرداند و تابعی که به دلایلی اشتباه اجرا شده است مقدار غیر صفر را برمی‌گرداند.

توضیح این "عارضه زندگی" ساده است. اگر تابع به درستی اجرا شود، این تنها اطلاعاتی است که ما نیاز داریم. در صورت بروز خطا، گاهی اوقات ارزش دارد که بفهمیم چه چیزی اشتباه بوده و چرا عملکرد به درستی انجام نشده است. و در اینجا اعدادی غیر از صفر به کمک می آیند، یعنی با استفاده از کدهای دیجیتال می توانیم نوع خطا را تعیین کنیم. به عنوان مثال، 1 - مشکل در خواندن مقداری، 2 - فضایی در حافظه یا دیسک وجود ندارد و غیره.

آخرین مثال اصلاح شده نحوه فراخوانی تابعی را نشان می دهد که در صورت اجرای صحیح صفر را برمی گرداند:

If (!init()) (Serial.print("ok"); ) else (Serial.print("خطا"); )

بیانیه مورد سوئیچ

دستور if به شما امکان می دهد فقط یک شرط را آزمایش کنید. گاهی اوقات لازم است یکی از اقدامات بسته به مقدار برگشتی یا خوانده شده انجام شود. اپراتور سوئیچ چند گزینه ای برای این کار ایده آل است. سینتکس دستور switch در زیر نشان داده شده است:

سوئیچ (var) (مورد 1: //دستورالعمل برای var=1 شکست؛ مورد 2: //دستورالعمل برای شکستن var=2؛ پیش‌فرض: //دستورالعمل پیش‌فرض (اگر var با 1 و 2 متفاوت باشد)

بسته به مقدار متغیر var، دستورالعمل ها در بلوک های خاص اجرا می شوند. برچسب case شروع یک بلوک را برای مقدار مشخص شده نشان می دهد. به عنوان مثال مورد 1: به این معنی است که این بلوک برای مقدار var برابر با یک اجرا می شود.

هر بلوک باید با دستور break خاتمه یابد. اجرای بیشتر دستور switch را قطع می کند. اگر دستور break نادیده گرفته شود، دستورالعمل ها در بلوک های بعدی قبل از دستور break اجرا می شوند. برچسب پیش فرض اختیاری است، درست مانند موارد دیگر در دستور if. دستورالعمل های موجود در بلوک پیش فرض تنها زمانی اجرا می شوند که مقدار متغیر var با هیچ الگوی مطابقت نداشته باشد.

اغلب اتفاق می افتد که دستورالعمل های یکسانی باید برای یکی از چندین مقدار اجرا شود. این امر به شرح زیر قابل دستیابی است:

سوئیچ (x) (مورد 1: //دستورالعمل برای شکستن x=1؛ مورد 2: مورد 3: مورد 5: //دستورالعمل برای شکستن x=2 یا 3 یا 4؛ مورد 4: //دستورالعمل برای شکستن x=4 ؛ مورد 6: // دستورالعمل برای شکستن x=6؛ پیش‌فرض: // دستورالعمل پیش‌فرض (اگر x با 1،2،3،4،5،6 متفاوت باشد)

بسته به مقدار متغیر x، بلوک دستورالعمل مربوطه اجرا خواهد شد. تکرار حالت 2: case 3: case 5: به کامپایلر اطلاع می دهد که اگر متغیر x دارای مقدار 2 یا 3 یا 5 باشد، همان قطعه کد اجرا می شود.

برای بیانیه

دستور for برای اجرای دوباره و دوباره همان کد استفاده می شود. اغلب لازم است دستورالعمل های مشابهی اجرا شوند و فقط مقدار یک متغیر تغییر کند. یک حلقه for برای این کار ایده آل است. دستور دستور به صورت زیر است:

Int i; برای (i=0;i<10;i++) { // инструкции для выполнения в цикле }

اولین پارامتری که در دستور for داده می شود، مقدار اولیه متغیر است. عنصر دیگر بررسی شرایط برای ادامه اجرای حلقه است. حلقه تا زمانی اجرا می شود که شرط برقرار باشد. آخرین عنصر تغییر در مقدار متغیر است. اغلب ما ارزش آن را افزایش یا کاهش می دهیم (در صورت لزوم). در این مثال، دستورالعمل های موجود در حلقه در i=0...9 اجرا می شوند.

اغلب یک متغیر مورد استفاده در یک حلقه در آنجا اعلام می شود:

برای(int i=0;i<10;i++) { // инструкции для выполнения в цикле }

متغیری که برای شمارش مراحل بعدی حلقه استفاده می شود می تواند در داخل آن برای فراخوانی یک تابع با پارامترهای مناسب استفاده شود.

برای (int i=10;i>0;i—) (Serial.print(i); // اعداد 10,9,8,7,6,5,4,3,2,1 ارسال خواهند شد)

در حالی که بیانیه

حلقه for برای جایی که می‌خواهیم شمارش انجام دهیم ایده‌آل است. در شرایطی که در نتیجه رویدادی که لزوماً قابل پیش‌بینی نیست، باید اقدامات خاصی را انجام دهیم (مثلاً منتظر فشار دادن یک دکمه هستیم)، می‌توانیم از دستور while استفاده کنیم که بلوک عبارت را به صورت اجرا می‌کند. تا زمانی که شرط برآورده شود. نحو دستور while به صورت زیر است:

while(شرط) (// بلوک دستورالعمل برای اجرا)

مهم است که بررسی وضعیت در ابتدای چرخه انجام شود. ممکن است این اتفاق بیفتد که دستورالعمل های داخل حلقه while هرگز اجرا نشوند. همچنین امکان ایجاد یک حلقه بی نهایت وجود دارد. بیایید به دو مثال نگاه کنیم:

Int x=2; while(x>5) ( Serial.print(x); ) —————————————- int y=5; while(y>0) (Serial.print(y); )

اولین بلوک عباراتی که در داخل while قرار دارد هرگز اجرا نخواهد شد. متغیر x دارای مقدار دو است و از 5 بزرگتر نمی شود. در مثال دوم ما با یک حلقه بی نهایت روبرو هستیم. متغیر "y" دارای مقدار 5، یعنی بزرگتر از صفر است. هیچ تغییری در متغیر "y" در داخل حلقه وجود ندارد، بنابراین حلقه هرگز کامل نخواهد شد.

این یک اشتباه رایج زمانی است که فراموش می کنیم پارامتری را تغییر دهیم که باعث خاتمه حلقه می شود. در زیر دو مثال صحیح از استفاده از حلقه while آورده شده است:

Int x=0; در حالی که (x<10) { //блок инструкций x++; } —————————————- while(true) { if(условие) break; // блок инструкций }

در مثال اول، ما مراقب تغییر مقدار متغیری بودیم که در شرط بررسی می شود. در نتیجه، چرخه در نهایت به پایان می رسد. در مثال دوم، یک حلقه بی نهایت عمدا ایجاد شد. این حلقه معادل تابع loop() در Arduino IDE است. علاوه بر این، یک بررسی شرط در داخل حلقه معرفی شده است که پس از آن حلقه با دستور break به پایان می رسد.

انجام… در حالی که اپراتور

یک تغییر از حلقه while، حلقه do...while است. علاوه بر نحو، در مکانی که شرط بررسی می شود نیز متفاوت است. در مورد do...while، بعد از اجرای بلوک دستورالعمل، شرط بررسی می شود. این بدان معنی است که بلوک دستورالعمل ها در بدنه حلقه حداقل یک بار اجرا می شود. در زیر نحو دستور do...while آمده است:

انجام ( // بلوک دستورالعمل ) while (شرط)

هر آنچه در مورد عملگر while نوشته شده است برای do...while نیز صدق می کند. در زیر نمونه ای از استفاده از حلقه do...while آورده شده است:

Int x=10; do ( // بلوک دستورات x—; ) while(x>0); —————————————- do ( // بلوک دستورالعمل اگر (شرط) شکسته شد؛ ) while(true);

بیانیه شکست

دستور break به شما امکان می دهد از حلقه خارج شوید (do...while, for, while) و از گزینه switch خارج شوید. در مثال زیر اجرای دستور break را در نظر بگیرید:

برای(i=0;i<10;i++) { if(i==5) break; Serial.print(i); }

حلقه باید برای اعداد 0 تا 9 اجرا شود، اما برای عدد 5 شرطی وجود دارد که دستور break را راه‌اندازی می‌کند. این از حلقه خارج می شود. در نتیجه فقط اعداد 0،1،2،3،4 به پورت سریال (Serial.print) ارسال می شود.

اپراتور را ادامه دهید

عملگر ادامه باعث می شود دستورات حلقه (do...while, for, while) برای مقدار فعلی اجرا را متوقف کند و به مرحله حلقه بعدی بروید. مثال زیر نحوه عملکرد عبارت continue را نشان می دهد:

برای(i=0;i<10;i++) { if(i==5) continue; Serial.print(i); }

همانطور که مشاهده آن دشوار نیست، حلقه برای مقادیر از 0 تا 9 اجرا می شود. برای مقدار 5، دستور continue اجرا می شود، در نتیجه دستورالعمل های بعد از این دستور اجرا نمی شوند. در نتیجه اعداد 0,1,2,3,4,6,7,8,9 به پورت سریال (Serial.print) ارسال می شود.

بیانیه بازگشت

دستور return اجرای تابع فراخوانده شده را پایان می دهد و مقداری از نوع خاصی را برمی گرداند. شما می توانید یک عدد، یک نماد یا یک متغیر از یک نوع خاص را به عنوان پارامتر فرمان مشخص کنید. مهم است که مقدار بازگشتی با نوع تابع اعلام شده مطابقت داشته باشد. مثال زیر نحوه استفاده از دستور return را نشان می دهد:

Int checkSensor())( if (analogRead(0) > 400) ( // خواندن ورودی آنالوگ بازگشت 1؛ // برای مقادیر بیشتر از 400، 1 برگردانده می شود دیگری (بازگرداندن 0؛ // برای دیگران، 0 است برگشت))

همانطور که می بینید، می توانید از چندین دستور بازگشت در یک تابع استفاده کنید، اما فقط یکی از آنها همیشه کار می کند. استفاده از عملگر برگشتی بدون پارامتر قابل قبول است. این به شما امکان می دهد تا عملکردی را که هیچ مقداری را بر نمی گرداند، به طور پیش از موعد خاتمه دهید.

Void function_name() (instruction1; if(x==0) return; instruction2; instruction3;)

در مثال بالا، هر زمان که تابع فراخوانی شود، instruction1 اجرا خواهد شد. اجرای instruction2 و instruction3 به نتیجه دستور if بستگی دارد. اگر شرط درست (true) باشد، دستور بازگشت اجرا شده و تابع خارج خواهد شد.

در صورتی که شرط برقرار نباشد، دستور بازگشت نیز اجرا نمی شود، اما دستورات instruction2 و instruction3 اجرا می شوند و پس از آن تابع کار خود را کامل می کند.

بیانیه goto

به دلایل ایدئولوژیک باید از این توضیحات گذشت... دستور goto دستوری است که در برنامه نویسی معمولی نباید از آن استفاده کرد. این باعث پیچیدگی کد می شود و یک عادت بد برنامه نویسی است. اکیدا توصیه می کنیم از این دستور در برنامه های خود استفاده نکنید. از آنجایی که goto در اسناد رسمی در وب سایت arduino.cc گنجانده شده است، در اینجا توضیح مختصری در مورد آن ارائه شده است. دستور دستور goto:

…. نشانه رفتن // به خطی با عنوان "متکا" بروید ..... .... …. metka: // برچسبی که برنامه با آن به کار خود ادامه خواهد داد...

دستور به شما امکان می دهد به علامت تعیین شده، یعنی به مکانی در برنامه بروید.

بیایید ببینیم که چگونه عملگرهای حلقه for، while و do در IDE آردوینو کار می‌کنند، چگونه از حلقه‌ها به درستی در طرح‌ها استفاده کنیم و از چه اشتباهاتی اجتناب کنیم. با استفاده از مثال های ساده، نشان خواهیم داد که چگونه می توانید یک حلقه را متوقف کنید یا از یک حلقه به حلقه دیگر بروید. برای درک درستی چرخه های نوشتن، ابتدا باید انواع و ویژگی های الگوریتم ها را در رباتیک مطالعه کنید.

نحوه کار حلقه ها در Arduino IDE

هر حلقه ای در C++ و زبان برنامه نویسی آردوینو عملی است که بارها یا بی نهایت تکرار می شود. هیچ یک از برنامه های میکروکنترلر آردوینو بدون حلقه کامل نمی شود، به عنوان مثال، یک حلقه خالی در یک حلقه بی نهایت فراخوانی می شود. سه نوع عملگر حلقه وجود دارد: for، while و do while - بیایید به هر عملگر نگاهی بیندازیم و با استفاده از مثال‌ها به نحوه عملکرد آنها نگاه کنیم.

اصل کار for و while را می توان با مثال های ساده زیر توضیح داد. حلقه for تعداد محدودی بار اجرا می شود (که در شرایط عملگر نشان داده شده است)؛ برای مثال زمانی استفاده می شود که برنامه نیاز دارد LED چندین بار چشمک بزند. حلقه while می‌تواند بی‌پایان اجرا شود، برای مثال، زمانی که LED روی آردوینو چشمک می‌زند تا زمانی که داده‌های حسگر تغییر کند.

شرح حلقه for در آردوینو با یک مثال

ساختار for در آردوینو به صورت زیر تعریف می شود:

برای (ابتدایی، شرط، تغییر) ( )

حلقه for برای تکرار دستورات خاص محصور شده در پرانتزهای فر استفاده می شود. این چرخه برای انجام هر گونه عمل تکراری مناسب است.
در مقداردهی اولیهیک متغیر ایجاد می شود و یک مقدار اولیه تخصیص می یابد.
که در وضعیتمقدار متغیری که حلقه در آن اجرا خواهد شد ثبت می شود.
که در تغییر دادننشان می دهد که متغیر در هر مرحله از حلقه چگونه تغییر می کند.

برای (بایت i=0; i<=5; i++){ digitalWrite (13, HIGH ); delay (500); digitalWrite (13, LOW ); delay (500); }

در طرح مثال، یک متغیر با مقدار اولیه تنظیم شده است i=0، شرط بیان می کند که حلقه تا زمانی اجرا می شود که متغیر مساوی یا بزرگتر از پنج باشد من<=5 . تغییر بیان می کند که متغیر در هر مرحله از حلقه یک عدد افزایش می یابد. در نهایت، زمانی که متغیر برابر با 5 باشد، حلقه for خارج می شود، بنابراین قبل از پایان حلقه، LED پنج بار چشمک می زند.

مرحله متغیر (تغییر) می تواند هر چیزی باشد. اگر لازم است یک متغیر را همزمان دو واحد افزایش دهیم، تغییر در شمارنده باید به صورت زیر نوشته شود: i=i+2. حلقه for را می توان در روش تنظیم void استفاده کرد، به عنوان مثال، برای نشان دادن حالت عملکرد چندین پین به طور همزمان. و همچنین در روش حلقه خالی، به عنوان مثال، در برنامه برای روشن کردن متوالی LED ها در آردوینو.



توضیحات برنامه آردوینو با حلقه های for و while

شرح حلقه while آردوینو با مثال

ساختار while در آردوینو به صورت زیر تعریف می شود:

در حالی که (شرط)( // دستوراتی که تکرار خواهند شد }

تا زمانی که شرط داخل پرانتز درست باشد، حلقه while به‌طور پیوسته و بی‌پایان اجرا می‌شود. خروجی حلقه زمانی حاصل می شود که متغیر در شرایط while تغییر کند، بنابراین چیزی باید مقدار خود را تغییر دهد. تغییر یک متغیر می تواند در کد برنامه در داخل یک حلقه یا هنگام خواندن مقادیر از هر سنسور، به عنوان مثال، از فاصله یاب اولتراسونیک HC-SR04 رخ دهد.

بایت i=0; // نیاز به ایجاد یک متغیر قبل از حلقهدر حالی که (من<5){ // حلقه تا زمانی اجرا می شود که i کمتر از 5 باشد digitalWrite (13، HIGH); تاخیر (500); digitalWrite (13، LOW); تاخیر (500); i++; // تغییر متغیر }

هنگام استفاده از تابع while، متغیر باید قبل از شروع حلقه ایجاد شود. در طرح مثال، LED پنج بار قبل از پایان چرخه چشمک می زند. اگر متغیر داخل بریس های فرفری را تغییر ندهید i++، سپس چرخه بی پایان تکرار می شود. راه دوم برای خروج از حلقه while آردوینو Uno خواندن داده ها از حسگر و استفاده از دستور if برای تغییر متغیر است.

حلقه دیگری که می توان در Arduino IDE استفاده کرد حلقه postcondition است. انجام در حالی که. هنگام استفاده از این ساختار، دستورات در یک حلقه، بدون توجه به شرایط، حداقل یک بار اجرا می شوند، زیرا شرایط پس از اجرای بدنه حلقه بررسی می شود. در مثال کد زیر، چراغ LED بدون توجه به قرائت سنسور روشن می شود و تنها پس از آن وضعیت پست را بررسی می کند.

آب داخلی؛ // یک متغیر قبل از حلقه ایجاد کنیدانجام دهید ( digitalWrite (13, HIGH )؛ water = analogRead (AO)؛ ) while (water)<5) // سنسور را بررسی کنید digitalWrite (13، LOW);

چگونه می توان از حلقه زمانی یا برای شکستن خارج شد

در صورت نیاز به خروج از بدنه حلقه، بدون توجه به شرایط مشخص شده، از اپراتور استفاده می شود. زنگ تفريحیا رفتن به. دستور break به شما امکان می دهد از حلقه خارج شوید و برنامه به اجرای دستورات زیر ادامه می دهد. دستور goto به شما این امکان را می دهد که نه تنها از حلقه خارج شوید، بلکه به اجرای برنامه از نقطه مورد نظر در امتداد برچسب نیز ادامه دهید، برای مثال می توانید به حلقه دیگری در آردوینو بروید.

امروز بخش مهمی از زبان برنامه نویسی مانند حلقه ها را مطالعه خواهیم کرد. برای چه چیزی مورد نیاز هستند. مثلاً برای خودمان هدف تعیین کنیم. شما باید شش ال ای دی را به نوبت با بازه زمانی 50 میلی ثانیه روشن کنید و سپس به نوبت با همان فاصله خاموش کنید. خوب، چه چیزی می تواند ساده تر باشد؟ کد زیر را می نویسیم:
void setup() (pinMode(2, OUTPUT)؛ pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT)؛ pinMode(6, OUTPUT)؛ pinMode(7, OUTPUT)؛ ) حلقه خالی () ( digitalWrite (2، HIGH)؛ تاخیر (50)؛ digitalWrite (3، HIGH)؛ تاخیر (50)؛ digitalWrite (4، HIGH)؛ تاخیر (50)؛ digitalWrite (5، HIGH)؛ تاخیر (50) ؛ digitalWrite (6, HIGH)؛ تاخیر (50)؛ digitalWrite (7, HIGH)؛ تاخیر (50)؛ digitalWrite (2، LOW)؛ تاخیر (50)؛ digitalWrite (3، LOW)؛ تاخیر (50) DigitalWrite (4، LOW)؛ تاخیر (50)؛ digitalWrite (5، LOW)، تاخیر (50)؛ digitalWrite (6، LOW)؛ تاخیر (50)؛ digitalWrite (7، LOW)؛ تاخیر (50)؛ ) ابتدا ما شش پین دیجیتال از دوم به هفتم را به عنوان خروجی مقداردهی کردیم و در برنامه اصلی متناوب نوشتیم LED روشن کردن، تاخیر و غیره را شش بار. بعدش هم همینطوره ولی هربار LED خاموش میشد. اکنون آن را در آردوینو آپلود می کنیم و از کار لذت می بریم. اما باز هم اینجا چیزی اشتباه است. اگر به کد برنامه دقت کنید، متوجه خواهید شد که قسمت هایی از کد وجود دارد که در کل برنامه تکرار می شود. به عنوان مثال، تکرار مکث باید بلافاصله نظر شما را جلب کند. و هنگام مقداردهی اولیه یک پین، فقط تعداد آن تغییر می کند. وقتی آن را روشن و خاموش می کنید، فقط عدد تغییر می کند. برای چنین برنامه کوچکی، البته، می توانید آن را به همان شکل رها کنید، کنترلر آن را می خورد و خفه نمی شود، اما اگر نیاز به اجرای کدهای تکراری دارید، مثلاً 1000 بار. فکر می کنم صبر کافی برای پر کردن آن دارم، اما آیا MK حافظه کافی دارد؟ البته می توانید بپرسید چرا ما به 1000 عملیات یکسان نیاز داریم؟ خب، بله، تصورش سخت است.) اما مشکل این نیست، اما اگر آرایه ای از 1000 سلول داشته باشیم. این اغلب اتفاق می افتد، به عنوان مثال، چندین سنسور پارامترها را در یک آرایه می نویسند و چگونه می توانید بفهمید که چگونه این آشفتگی را مرتب کنید. لازم است به نحوی آن را با توجه به برخی پارامترها تجزیه کنیم. برای چنین حوادثی است که چرخه ها اختراع شدند. حلقه قطعه ای از کد است که چند بار اجرا می شود. یک قسمت اجرا شده از یک برنامه در یک حلقه، تکرار نامیده می شود. تعداد تکرارها می تواند از 0 تا بی نهایت باشد. برای اجرای حلقه ها در زبان برنامه نویسی، سه گزینه حلقه وجود دارد. باور کنید، این برای هر کدنویسی پیچیده کافی است. بیایید همه اینها را با جزئیات بیشتری بررسی کنیم.
  • در حالی که (شرط) ()
  • do() while(condition);
  • برای (متغیر تعداد؛ شرط؛ متغیر تعداد افزایش) ()
سیکل اول در حالی که (شرط) (). او چگونه کار می کند. بعد از کلمه در حالی کهباید یک شرط در پرانتز وجود داشته باشد. شرط می تواند هر چیزی باشد تا زمانی که درست باشد. به محض نادرست شدن شرط، اجرای حلقه متوقف می شود و برنامه از خط بعدی بعد از حلقه به اجرای برنامه ادامه می دهد. بیایید از یک مثال استفاده کنیم.
char i = 0; در حالی که (مندر واقع آنچه در اینجا نوشته شده است. ابتدا متغیر count را مقداردهی اولیه می کنیم منو آن را ریست کنید. بعد، وارد حلقه می شویم و شروع به بررسی شرایط داخل پرانتز می کنیم. اگر ارزش منکمتر از 10 است، سپس بدنه حلقه را اجرا کنید. در بدنه خود حلقه، به سادگی مقدار متغیر شمارش را یک بار افزایش می دهیم و دوباره شرایط را بررسی می کنیم. در مورد ما، حلقه 10 بار اجرا می شود. یعنی اول معنی منبرابر با صفر است. صفر کمتر از ده است. بعد متغیر را یک افزایش دادیم و با هم مقایسه کردیم، یک کمتر از ده است و به همین ترتیب. به محض اینکه متغیر شمارش برابر با ده شد، بررسی می کنیم که آیا ده کمتر از ده است؟ البته نه، و پس از بررسی چرخه از کار خواهد افتاد. این چرخه اینگونه عمل می کند. اگر لازم باشد کد را فقط یک بار در بدنه حلقه اجرا کنید، حتی اگر شرط را برآورده نکند، چه کاری باید انجام دهید؟ چرخه دیگری برای این وجود دارد به نام do() while(شرط). دقیقاً مانند چرخه قبلی کار می کند، به جز یک مورد. در این حلقه ابتدا بدنه حلقه اجرا می شود و سپس تست انجام می شود. بیایید ببینیم در کد چگونه به نظر می رسد.
char i = 0; انجام دهید ( i++; ) while ((i > 0) & (iببین چقدر جالبه ابتدا مانند دفعه قبل، متغیر شمارش را صفر می کنیم، اما در شرایطی که می نویسیم منبیشتر از صفر و کمتر از ده بود. یعنی مقدار متغیر باید در بازه یک تا نه باشد. اگر با استفاده از حلقه قبلی آن را به این شکل می نوشتیم، هرگز اجرا نمی شد. اما ما یک کلمه جادویی داریم انجام دادن. یعنی چه خواهد شد. ابتدا در بدنه حلقه مقدار متغیر شمارش افزایش می یابد و یک می شود و این بیشتر از صفر است شرط درست می شود. بر این اساس، تا زمانی که متغیر شمارش ده برابر شود، حلقه به اجرا ادامه خواهد داد. و در نهایت، نسخه سوم از چرخه. او چگونه کار می کند:
char i; برای (i = 0; iچگونه کار می کند. ابتدا متغیر شمارش را دوباره شروع می کنیم، اما بدون مقدار خاصی. بعد کلمه را می نویسیم برای، اما در پرانتز ابتدا متغیر شمارش خود را می نویسیم و یک مقدار اولیه به آن اختصاص می دهیم. سپس شرط را بررسی می کنیم و اگر درست باشد، بدنه حلقه را اجرا می کنیم و مقدار متغیر شمارش را افزایش می دهیم. در اصل این همان است در حالی که()()بنابراین از کدام چرخه استفاده کنید به شما بستگی دارد. چند کلمه در مورد چند نکته. مثلا اگر بنویسید while(1);، سپس حلقه برای همیشه اجرا می شود. یا اگر با برای، سپس به این شکل خواهد بود برای(؛؛)؛. مراقب باش. گاهی اوقات هنگام اجرای یک چرخه، شما واقعاً می خواهید همه چیز را رها کنید و از آن خارج شوید، اما شرایط اجازه نمی دهد. باید چکار کنم؟ دستور دیگری برای این کار وجود دارد زنگ تفريح؛. به محض اینکه MK با این دستور در بدنه حلقه برخورد کرد، بلافاصله از حلقه خارج شده و از خط بعدی بعد از حلقه به اجرای برنامه ادامه می دهد. اما اگر در حین عملکرد حلقه، شرایطی ایجاد شود که شرایط را برآورده نمی کند یا مثلاً لحظه ای که در آن نیازی به ادامه اجرای انتهای بدنه حلقه نداشته باشیم، چه؟ تیم اینجا به ما کمک خواهد کرد ادامه هید؛. به محض اینکه MK با این دستور روبرو می شود، همه چیز را رها می کند و به تکرار بعدی حلقه می رود. امیدوارم همه چیز را واضح توضیح داده باشم. اکنون با دریافت این دانش، بیایید برنامه خود را بازنویسی کنیم، اما با استفاده از حلقه ها.
void setup() (بایت i = 2; // متغیر شمارش while(i // اگر i کمتر از 8 باشد، بدنه حلقه را اجرا کنید ( pinMode(i, OUTPUT); // ابتدا پین ها را از 2 شروع کنید i++; //متغیر شمارش را یک بار افزایش دهید) ) void loop() (بایت i = 2؛ while(iبیایید نگاه دقیق تری بیندازیم. ابتدا متغیر شمارش را مقداردهی اولیه کردیم منو مقدار دو را به آن اختصاص داد. چرا دوتا؟ اما چون من به طور خاص پین های دوم تا هفتم را انتخاب کردم تا مطمئن شوم که مقدار اولیه اصلا مهم نیست. معلوم شد که نوعی جناس است) خب، البته، بله. بعد شرط حلقه را می نویسیم. ما باید شش تکرار انجام دهیم زیرا شش LED داریم. عالی، ما فکر می کنیم دو به اضافه شش برابر با هشت است. بله، بنابراین باید متغیر شمارش را بررسی کنیم تا کمتر از هشت شود. همین را نوشتند while(i. حالا حلقه ما شش بار اجرا می شود. چه کاری باید در بدنه حلقه انجام دهیم؟ چیز پیچیده ای نیست، فقط تابع مقداردهی اولیه خروجی را در خروجی وارد کنید، فقط یک متغیر شمارش را به جای عدد خروجی جایگزین کنید. به محض اینکه MK وارد حلقه بدنه شد، قبل از اجرای تابع مقداردهی اولیه خروجی، به آرگومان های ارسال شده نگاه می کنیم. یکی از آنها باید عدد خروجی را حمل کند و ما یک متغیر شمارش در آنجا داریم. اما هیچی، یک MK هوشمند به متغیری که آنجاست نگاه می‌کند و با افتخار عدد آن را بیرون می‌آورد. و ما یک دو در آنجا داریم. خوب، عالی است، اجازه دهید خروجی دوم را مقداردهی کنیم. پس از آن، مقدار آن را افزایش می‌دهیم. متغیر شمارش را با یکی دیگر و شرایط را بررسی کنید، بله، سه کمتر از هشت است، بیایید دوباره این کار را انجام دهیم، فقط متغیر اکنون دارای سه است. یعنی ما خروجی را برای بار سوم مقداردهی اولیه می کنیم و سپس شمارش را افزایش می دهیم. به این ترتیب با عبور از حلقه، تمام خروجی های مورد نیاز خود را تنظیم می کنیم، علاوه بر این، افزایش یک متغیر شمارش یک شرط سختگیرانه نیست. هیچ کس شما را اذیت نمی کند که چنین چیزی بنویسید: i = ((127*i)/31) & 0xF4;و اگر شرط بعد از اجرا درست باشد، این نیز کار خواهد کرد. برای حلقه، مهم نیست که در بدن چه اتفاقی می افتد، بلکه به این موضوع علاقه دارد که آیا این شرایط درست است یا خیر. همین. در درس بعدی به توابع، چرایی نیاز آنها نگاه خواهیم کرد و سعی می کنیم خودمان را بنویسیم.