اطلاعیه

Collapse
No announcement yet.

طریقه ساخت منو در lcd

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : طریقه ساخت منو در lcd

    الهم صل علی محمد و آل محمد و عجل فرجهم
    www.adaksell.com

    دیدگاه


      #17
      پاسخ : طریقه ساخت منو در lcd

      سلام.
      خیلی جالب بود، خوشم اومد.
      اگه کار خودتونه یا دسترسی به سورسش دارین ممنون میشم قرار بدین
      توی کانال یوتیوب من قراراه طراحی انواع بردهای الکترونیکی مثل بردهای تک لایه، دو لایه یا به طور کلی بردهای چند لایه، بردهای مبتنی بر میکروکنترلر، بردهای صنعتی، بردهای الکترونیک قدرت و بردهای فرکانس بالارو یاد بگیریم.
      همینطور کدنویسی انواع میکروکنترلرهای 8 بینی مثل میکروکنترلرهای خانواده AVR-STM8، میکروکنترلرهای میبتی بر معماری ARM مثل STM32 و پردازنده های مخصوص اینترنت اشیاء مثل ESP32-ESP8266 و DSPها یاد میگیریم.
      https://www.youtube.com/@aKaReZa75​

      دیدگاه


        #18
        پاسخ : طریقه ساخت منو در lcd

        نوشته اصلی توسط akaReza نمایش پست ها
        سلام.
        خیلی جالب بود، خوشم اومد.
        اگه کار خودتونه یا دسترسی به سورسش دارین ممنون میشم قرار بدین
        سلام.اینو صرفا به عنوان یک ایده گذاشتم . نه کار من هست و نه دسترسی به سورسش دارم . اما یادمه که اون بنده خدا برای یک آکواریوم این برنامه رو نوشته بود.
        جدیدترین ویرایش توسط mojitaba; ۱۶:۱۹ ۱۳۹۹/۰۶/۱۰.
        الهم صل علی محمد و آل محمد و عجل فرجهم
        www.adaksell.com

        دیدگاه


          #19
          پاسخ : طریقه ساخت منو در lcd

          سلام. همون طور که دوستان هم اشاره کردن، ایجاد منو کاملا سلیقه ای هست. روش های مختلفی وجود داره که هر کدوم مزایا و معایبی دارن. من معمولا منوها رو با ایجاد یه لیست پیوندی (link list) ایجاد می کنم. یه مقداری شبیه به برنامه های شی گرا تو c++ میشه. اگه با پوینتر ها و ساختار ها زیاد کار نکرده باشی، شاید برات پیچیده باشه یه مقدار. ولی با این روش منوهای انعطاف پذیر، پیچیده و البته خوانا میشه ایجاد کرد.کلیت کار به این شکله که یه سری ساختار کلی برای هر گزینه تعریف می کنی که نوع داده، عنوانش، داده بعدی، قبلی و توابعی که قراره اجرا کنه رو تو خودش نگه می داره. بعد توابع رو به صورت عمومی یا اختصاصی برای هر گزینه تعریف می کنی که این توابع میتونن توابع دیگه ای رو صدا بزنن، مقدار داده رو تغییر بدن، یا خود توابعی که تو اون گزینه ذخیره شده رو تغییر بدن (مثلا وقتی یه بار دکمه اینتر بزنی یه تابع اجرا میشه که حالت ویرایش رو فعال می کنه و هم زمان عملکرد خود دکمه اینتر رو تغییر میده. اگر مجددا دکمه اینتر رو بزنی، این بار داده سیو می شه.)
          این برنامه نمونه رو با AS7 نوشتم. فکر می کنم بتونه کمکت کنه. فرض گرفتم 4 تا دکلمه enter , exit , right , left وجود داره با دو گزینه ساده برای منو که البته با هم تفاوت دارن.



          به طور کلی داده های هر منویی به این شکل بهش داده میشه. البته میشه به جای این یه تابع constructor هم نوشت تا خوانایی برنامه بره بالاتر، امکان دبل چک داده ها وجود داشته باشه و یه سری داده ها هم به صورت پیش فرض پر بشن.


          button_funs basic_button_funs = {
          .check_enter_button = f_check_enter_rising_edge,
          .check_exit_button = f_check_exit_rising_edge,
          .check_right_button = f_check_right_rising_edge,
          .check_left_button = f_check_left_rising_edge,
          .enter_button_fun = f_display_val,
          .exit_button_fun = f_null,
          .right_button_fun = f_next_object,
          .left_button_fun = f_previous_object
          };




          button_funs obj2_basic_button_funs = {
          .check_enter_button = f_check_enter_rising_edge,
          .check_exit_button = f_check_exit_rising_edge,
          .check_right_button = f_check_right_rising_edge,
          .check_left_button = f_check_left_rising_edge,
          .enter_button_fun = f_edit_val,
          .exit_button_fun = f_cancel_edit_val,
          .right_button_fun = f_next_object,
          .left_button_fun = f_previous_object
          };




          button_funs obj2_secondary_button_funs = {
          .check_enter_button = f_check_enter_delayed,
          .check_exit_button = f_check_exit_delayed,
          .check_right_button = f_check_right_delayed,
          .check_left_button = f_check_left_delayed,
          .enter_button_fun = f_switch_val,
          .exit_button_fun = f_switch_val,
          .right_button_fun = f_increase_val,
          .left_button_fun = f_decrease_val
          };
          object_type1 object1 = {
          .basic_info.button_funs_ptr = &basic_button_funs,
          .basic_info.main_object_fun = f_obj1_mainfun,
          .basic_info.next_object.void_ptr = &object2,
          .basic_info.previous_object.void_ptr = &object2,
          .basic_info.object_info_read = false,
          .basic_info.title = "object1",
          .basic_info.type = obj_type1
          };




          object_type2 object2 = {
          .base_info.button_funs_ptr = &obj2_basic_button_funs,
          .base_info.main_object_fun = f_obj1_mainfun,
          .base_info.next_object.void_ptr = &object1,
          .base_info.previous_object.void_ptr = &object1,
          .base_info.object_info_read = false,
          .base_info.title = "object2",
          .base_info.type = obj_type2,
          .secondary_button_funs_ptr = &obj2_secondary_button_funs,
          .value2 = 0
          };


          [FONT=Yekan][/FONT]




          اگه بخوای برنامه حافظه کمتری درگیر کنه، میتونی داده هایی که ثابت هستن (مثل رشته ها) رو بفرستی تو بخش sram و هر بار از اونجا مقدارشو بخونی. به علاوه میشه یه گزینه هم گذاشت که کاربر بتونه تنظیماتی که وارد کرده رو ذخیره کنه و این داده ها تو eeprom برن و دفعات بعد از اون بخش بارگذاری بشن (که ram کمتر درگیر بشه)
          جدیدترین ویرایش توسط a.rahami; ۰۴:۰۳ ۱۳۹۹/۰۸/۱۸.

          دیدگاه


            #20
            پاسخ : طریقه ساخت منو در lcd

            سلام وقت بخیر من میخوام یه ساعت و تاریخ بنویسم باatmega32 به زبان c
            ساعت تاریخ رو نوشتم تو منو تنظیمات گیر کردم نمیدونم با چه الگدوریتمی باید بنویسم
            اگه امکانش هست راهنمایی کنید .

            مشکلم دقیقا تو منو تنظیماته وقتی کلید تنظیمات رو میزنی سه تا گزینه بیار
            Edit Time
            Edit Date
            Edit Week_dey
            علامت فلش رو روی هر کدوم رفتی و کلید تایید فشرده شد ارد اون صفحه بشه .

            ????????????????????????????????????????????????

            دلیل: ادغام دو پست برای جلوگیری از اسپم

            نوشته اصلی توسط محمد نوروزی 76 نمایش پست ها
            سلام وقت بخیر من میخوام یه ساعت و تاریخ بنویسم باatmega32 به زبان c
            ساعت تاریخ رو نوشتم تو منو تنظیمات گیر کردم نمیدونم با چه الگدوریتمی باید بنویسم
            اگه امکانش هست راهنمایی کنید .

            مشکلم دقیقا تو منو تنظیماته وقتی کلید تنظیمات رو میزنی سه تا گزینه بیار
            Edit Time
            Edit Date
            Edit Week_dey
            علامت فلش رو روی هر کدوم رفتی و کلید تایید فشرده شد ارد اون صفحه بشه .

            ������������������������������������������������
            اینم بگم که دقیقا نمیدونم باید گزینه و علامت فلش رو چی تعریف کنم که میکرو بفهمه وقتی کلید پایین زده میشه فلش بیاد پایین رو گزینه بعدی

            دیدگاه


              #21
              پاسخ : طریقه ساخت منو در lcd

              کسی حضور داره تو انجمن جواب سوال من رو بده ????????????????????????????????????

              دیدگاه


                #22
                پاسخ : طریقه ساخت منو در lcd

                سلام دوست عزیز
                کد برنامه تون رو بذارید یا آپلود کنین
                اینطوری که نمیشه راهنمایی کرد
                همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
                لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
                تایپیک های من:
                حل تمام مشکلات atmega128a (eca.ir)
                آموزش کار با سایت (eca.ir)

                دیدگاه


                  #23
                  پاسخ : طریقه ساخت منو در lcd

                  مطالب بسیار جالب است

                  دیدگاه


                    #24
                    پاسخ : طریقه ساخت منو در lcd

                    1. #include <mega32.h>
                    2. #include <lcd.h>
                    3. #include <delay.h>
                    4. #include <ds1307.h>
                    5. #include <stdio.h>
                    6. #asm
                    7. .equ __lcd_port=0x12; PORTD
                    8. #endasm
                    9. #asm
                    10. .equ _i2c_port=0x15; PORTC
                    11. .equ _sda_bit=1
                    12. .equ _scl_bit=0
                    13. #endasm
                    14. #define sw_setting PINA.0
                    15. #define sw_enter PINA.1
                    16. #define sw_up PINA.2
                    17. #define sw_down PINA.3
                    18. char lcd1[20],lcd2[20];
                    19. unsigned char hour=0, min=0, sec=0;
                    20. unsigned char year=0, month=0, day=0, week_day=0;
                    21. int hour_s=0, min_s=0, sec_s=0, year_s=0, month_s=0, day_s=0, week_day_s=0;
                    22. unsigned char menu=0, arrow=0;
                    23. //********************** key_scan ****************************
                    24. void key_scan(void)
                    25. {
                    26. menu = 0, arrow = 0;
                    27. chek:
                    28. if(sw_setting == 0)
                    29. {
                    30. while(sw_setting == 0){};
                    31. delay_ms(25);
                    32. menu = 1;
                    33. arrow = 1;
                    34. }
                    35. if(sw_enter == 0 & menu == 1)
                    36. {
                    37. while(sw_enter == 0){};
                    38. delay_ms(25);
                    39. while(arrow != 0)
                    40. {
                    41. switch(arrow)
                    42. {
                    43. case 1:
                    44. menu = 2;
                    45. arrow = 11;
                    46. goto chek_sw;
                    47. break;
                    48. case 2:
                    49. menu = 3;
                    50. arrow = 21;
                    51. goto chek_sw;
                    52. break;
                    53. case 3:
                    54. menu = 4;
                    55. arrow = 31;
                    56. goto chek_sw;
                    57. break;
                    58. }
                    59. }
                    60. }
                    61. chek_sw:
                    62. if(sw_down == 0 & menu <= 5)
                    63. {
                    64. while(sw_down == 0){};
                    65. delay_ms(25);
                    66. arrow++;
                    67. if(arrow >= 4& menu == 1)
                    68. {
                    69. arrow = 1;
                    70. }
                    71. else if(arrow >= 14& menu == 2)
                    72. {
                    73. arrow = 11;
                    74. }
                    75. else if(arrow >= 25& menu == 3)
                    76. {
                    77. arrow = 21;
                    78. }
                    79. else if(arrow >= 33& menu == 4)
                    80. {
                    81. arrow = 31;
                    82. }
                    83. }
                    84. if(sw_up == 0 & menu <= 5)
                    85. {
                    86. while(sw_up == 0){};
                    87. delay_ms(25);
                    88. arrow--;
                    89. if(arrow <= 0& menu == 1)
                    90. {
                    91. arrow = 3;
                    92. }
                    93. else if(arrow <= 10 & menu == 2)
                    94. {
                    95. arrow = 13;
                    96. }
                    97. else if(arrow <= 20& menu == 3)
                    98. {
                    99. arrow = 24;
                    100. }
                    101. else if(arrow <= 30& menu == 4)
                    102. {
                    103. arrow = 32;
                    104. }
                    105. }
                    106. if(menu != 0)
                    107. {
                    108. while (menu != 0)
                    109. {
                    110. switch(menu)
                    111. {
                    112. case 1:
                    113. if(arrow == 1)
                    114. {
                    115. lcd_clear();
                    116. lcd_putsf(" Setting\n~Edit Time\n Edit Date\n Edit Week Day");
                    117. delay_ms(50);
                    118. goto chek;
                    119. }
                    120. else if(arrow == 2)
                    121. {
                    122. lcd_clear();
                    123. lcd_putsf(" Setting\n Edit Time\n~Edit Date\n Edit Week Day");
                    124. delay_ms(50);
                    125. goto chek;
                    126. }
                    127. else if(arrow == 3)
                    128. {
                    129. lcd_clear();
                    130. lcd_putsf(" Setting\n Edit Time\n Edit Date\n~Edit Week Day");
                    131. delay_ms(50);
                    132. goto chek;
                    133. }
                    134. break;
                    135. case 2:
                    136. if(arrow == 11)
                    137. {
                    138. lcd_clear();
                    139. lcd_putsf(" Edit time\n~hour %0\n min %0\n ok");
                    140. delay_ms(50);
                    141. goto chek;
                    142. }
                    143. else if(arrow == 12)
                    144. {
                    145. lcd_clear();
                    146. lcd_putsf(" Edit time\n hour %0\n~min %0\n ok");
                    147. delay_ms(50);
                    148. goto chek;
                    149. }
                    150. else if(arrow == 13)
                    151. {
                    152. lcd_clear();
                    153. lcd_putsf(" Edit time\n hour %0\n min %0\n~ok");
                    154. delay_ms(50);
                    155. goto chek;
                    156. }
                    157. break;
                    158. case 3:
                    159. if(arrow == 21)
                    160. {
                    161. lcd_clear();
                    162. lcd_putsf(" Edit Date\n~Year %0\n Month %0\n Day %0 ok");
                    163. delay_ms(50);
                    164. goto chek;
                    165. }
                    166. else if(arrow == 22)
                    167. {
                    168. lcd_clear();
                    169. lcd_putsf(" Edit Date\n Year %0\n~Month %0\n Day %0 ok");
                    170. delay_ms(50);
                    171. goto chek;
                    172. }
                    173. else if(arrow == 23)
                    174. {
                    175. lcd_clear();
                    176. lcd_putsf(" Edit Date\n Year %0\n Month %0\n~Day %0 ok");
                    177. delay_ms(50);
                    178. goto chek;
                    179. }
                    180. else if(arrow == 24)
                    181. {
                    182. lcd_clear();
                    183. lcd_putsf(" Edit Date\n Year %0\n Month %0\n Day %0 ~ok");
                    184. delay_ms(50);
                    185. goto chek;
                    186. }
                    187. break;
                    188. case 4:
                    189. if(arrow == 31)
                    190. {
                    191. lcd_clear();
                    192. lcd_putsf(" Edit Week Day\n~Week_day %0\n\n ok");
                    193. delay_ms(50);
                    194. goto chek;
                    195. }
                    196. else if(arrow == 32)
                    197. {
                    198. lcd_clear();
                    199. lcd_putsf(" Edit Week Day\n Week_day %0\n\n~ok");
                    200. delay_ms(50);
                    201. goto chek;
                    202. }
                    203. break;
                    204. }
                    205. }
                    206. }
                    207. }
                    208. //********************* main *********************************
                    209. void main(void)
                    210. {
                    211. DDRA = 0x00;
                    212. PORTA = 0x00;
                    213. DDRD = 0xff;
                    214. PORTD = 0x00;
                    215. lcd_init(20);
                    216. i2c_init();
                    217. rtc_init(0,0,0);
                    218. while (1)
                    219. {
                    220. if(menu == 0)
                    221. {
                    222. if(sw_setting == 0) key_scan();
                    223. if(sw_enter == 0) key_scan();
                    224. lcd_clear();
                    225. rtc_get_time(&hour,&min,&sec);
                    226. rtc_get_date(&year,&month,&day,&week_day);
                    227. sprintf(lcd1,"%02u:%02u:%02u",hour,min,sec);
                    228. sprintf(lcd2,"%02u/%02u/%02u %02u",year,month,day,week_day);
                    229. lcd_gotoxy(0,0);
                    230. lcd_puts(lcd1);
                    231. lcd_gotoxy(9,0);
                    232. lcd_puts(lcd2);
                    233. delay_ms(500);
                    234. }
                    235. }
                    236. }





                    توضیح برنامه:
                    برنامه ساعت و تاریخ قابل تنظیم هست با منوی تنظیمات .چهار کلید تنظیمات (setting) تایید(enter) بالا(up) پایین(down) وجود دارد. کلید تنظیمات که فشرده میشه وارد منو تنظیمات با 3 گزینه میشود Edit Time - Edit Date - Edit Week Day میشه با کلید های بالا و پایین علامت فلش جابجا میشه و روی هر گزینه کلید تایید
                    (enter)
                    فشرده شود وارد صفحه ی اون قسمت میشه و با زدن مجدد کلید تنظیمات صفحه به عقب بر میگرده.
                    با تغییر هر صفحه متغییر منو اضافه و کم میشود .
                    مشکلاتی که دارم
                    1) وقتی وارد صفحه ی تنظیمات میشه متغییر منو مخالف صفر میشه ، وقتی مجدد کلید تنظیمات رو میزنم متغییر منو هر چند که باشه ازش یک واحد کم میشه ولی برابر 0 نمیشه که وارد صفحه ی اصلی بشه.
                    2) چطور برای علامت فلش یک تابع بنویس که حجم کد کم بشه و هر جا خواستم علامت فلش رو نشون بدم .

                    فایل پروتئوس رو چطور باید آپلود کنم هر چقدر گشتم پیدا نکردم ؟
                    جدیدترین ویرایش توسط محمد نوروزی 76; ۰۰:۵۲ ۱۴۰۱/۰۱/۲۰.

                    دیدگاه

                    لطفا صبر کنید...
                    X