با سلام خدمت اعضای محترم سایت
من یه کدی نوشتم برای ساخت یک منو با مگا 8 و سه تا کلید قرار دادم برای دستگاه. لازم به ذکر هست که در این دستگاه از یک سنسور ds18b20 و یک آیسی ds1307 و یک ال سی دی کاراکتری 2X16 استفاده شده. این کد 71 درصد از حافظه فلش رو پر کرده.
متأسفانه مشکل این هست که وقتی وارد یکی از منوها میشم ، وقتی کلید دوم رو فشار میدم میکرو هنگ میکنه و این هنگ کردن فقط با کلید دوم اتفاق میفته. توی بعضی از تاپیک های انجمن خوندم که مشکل هنگ کردن به خاطر سرریز پشته هست. توی کد نوشته شده از دستور switch استفاده شده. آیا این دستور میتونه باعث سرریز پشته بشه؟؟
متأسفانه کد یک مقدار طولانی هست . مشکلات با کلیدی اتفاق می افته که مربوط به temp_key ==1 هست. البته هنگ کردن بعد از ورود به زیر منوها پیش میاد و وقتی که میخوایم زمان یا دما رو تنظیم کنیم.
من یه کدی نوشتم برای ساخت یک منو با مگا 8 و سه تا کلید قرار دادم برای دستگاه. لازم به ذکر هست که در این دستگاه از یک سنسور ds18b20 و یک آیسی ds1307 و یک ال سی دی کاراکتری 2X16 استفاده شده. این کد 71 درصد از حافظه فلش رو پر کرده.
متأسفانه مشکل این هست که وقتی وارد یکی از منوها میشم ، وقتی کلید دوم رو فشار میدم میکرو هنگ میکنه و این هنگ کردن فقط با کلید دوم اتفاق میفته. توی بعضی از تاپیک های انجمن خوندم که مشکل هنگ کردن به خاطر سرریز پشته هست. توی کد نوشته شده از دستور switch استفاده شده. آیا این دستور میتونه باعث سرریز پشته بشه؟؟
متأسفانه کد یک مقدار طولانی هست . مشکلات با کلیدی اتفاق می افته که مربوط به temp_key ==1 هست. البته هنگ کردن بعد از ورود به زیر منوها پیش میاد و وقتی که میخوایم زمان یا دما رو تنظیم کنیم.
کد:
temp_key = key; if ( temp_key != old_key ) { old_key = temp_key; if ( temp_key != no_key ) { if ( temp_key == 0 ) { if ( mode < 7 ) { mode++; if ( mode == 7 ) { lcd_clear(); mode = 0; } } switch(mode) { case 0: { lcd_gotoxy(0,0); lcd_puts( time_buffer ); lcd_gotoxy(11,0); lcd_puts( temp_buffer ); break; } case 1: { lcd_clear(); lcd_putsf("Set Time"); break; } case 2: { lcd_clear(); lcd_putsf("Set Temp"); break; } case 3: { lcd_clear(); lcd_putsf("Time Schedule"); break; } case 4: { lcd_clear(); lcd_putsf("Set Control Mode"); break; } case 5: { lcd_clear(); lcd_putsf("Set Motor"); break; } case 6: { lcd_clear(); lcd_putsf("Set Pump"); break; } case time_setting: { set_time_mode++; if ( set_time_mode == 4 ) { set_time_mode = 1; rtc_set_time(h,m,s); mode = 2; lcd_clear(); lcd_putsf("Set Temperature"); } break; } case temp_setting: { set_temp_mode++; if ( set_temp_mode == 3 ) { set_temp_mode = 1; mode = 3; lcd_clear(); lcd_putsf("Time Schedule"); } break; } case timer_setting: { set_timer_mode++; if ( set_timer_mode == 9 ) { set_timer_mode = 1; mode = 4; lcd_clear(); lcd_putsf("Set Control Mode"); } break; } } } else if( temp_key == 1 ) { if(mode==7 && set_time_mode==1) { s=0; rtc_set_time(12,12,0); } if ( 0 < mode < 7 ) { mode+=6; } } else if( temp_key == 2) { switch ( mode ) { case time_setting: { switch ( set_time_mode ) { case 1: { rtc_set_time(h,m,0); break; } case 2: { m--; if ( m == 255 ) m = 59; break; } case 3: { h--; if ( h == 255 ) h = 23; break; } } break; } case temp_setting: { switch ( set_temp_mode ) { case 1: { if(low_temp > 20 ) low_temp--; break; } case 2: { if(high_temp > 20 ) high_temp--; break; } } break; } case timer_setting: { if ( (set_timer_mode%2) == 1 ) { if (--h_schedule[set_timer_mode - 1] == 255 ) { h_schedule[set_timer_mode - 1] = 23; } } else { if (--m_schedule[set_timer_mode - 1] == 255 ) { m_schedule[set_timer_mode - 1] = 59; } } break; } case motor_setting: { break; } case pump_setting: { break; } }
دیدگاه