Ứng dụng 16F877A tạo nhiều menu LCD 16x2

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • slowlove
    Đệ tử 1 túi
    • Mar 2006
    • 15

    #1

    Ứng dụng 16F877A tạo nhiều menu LCD 16x2

    e có làm 1 project tạo 1 menu trên LCD1602.Vấn đề đau đầu là khi số lượng menu tăng lên rất nhiều thì vấn đề điều khiển cũng gặp nhiều khó khăn cho người sử dụng...

    trong project này e có tham khảo cách chọn menu của máy tính casio..thấy cũng khá hay.E đã cho thêm 1 con trỏ vào cho thêm sinh động và trực quan...tránh đc vc phải sử dụng thêm 4 phím để làm phím di chuyển con trỏ

    ttrong 1 màn hình của LCD mình có định nghĩa 4 menu nhỏ đc gọi là 1 trang(page).Khi cần nhiều menu thì ta tạo ra nhiều trang =>số menu có đc là (page x 4).Để chọn menu nào thì ấn số tương ứng trên bàn phím...
    ấn phím # thì k0 có tác dụng(bị block).Để chuyển page thì dùng phím 0 và phím =
    để chọn chức năng tương ứng với menu ấn phím On/C
    ở phần menu page cuối có phần option,có nhớ setting của người sử dụng lưu lúc trước và không hỏi lại mỗi khi chạy.ko bị mất khi mất nguồn.

    cái này e chưa làm thử mà chỉ mô phỏng trên proteus thôi...mọi người xem rồi cho e ý kiến ...làm sao để thiết kế 1 menu với nhiều nhánh nhỏ bên trong mà ko bị loạn lên...??????

    download mạch ở đây:
    http://www.mediafire.com/?kdzjdtlgzjm
    full code ở đây:
    http://www.mediafire.com/download/2o...6/Menu_LCD.rar
    Last edited by slowlove; 04-07-2015, 11:22 PM.
  • slowlove
    Đệ tử 1 túi
    • Mar 2006
    • 15

    #2
    sao e ko up cái file rar lên 4fum đc nhỉ...đành up lên MF.
    sao chưa thấy bác nào cho ý kiến nhỉ....???

    Comment

    • nguyenhuytuong
      Nhập môn đệ tử
      • Dec 2009
      • 10

      #3
      Bạn có thể up code lên để mọi người tham khảo được ko?

      Comment

      • slowlove
        Đệ tử 1 túi
        • Mar 2006
        • 15

        #4
        Đây là code chính của trương trình...ko đính kèm đc file nên các bạn xem tạm vì code quá dài...
        ngoài ra thư viện cho LCD mình để life riêng,các chương trình trong menu mình cũng để riêng..
        =========================================
        Code:
        #include <16F877A.h>
        #device *=16 adc=10
        #use delay(clock=20M)
        #define lcd_4bit
        #include <lcd_lib.c>
        #include <menu_list.c>
        #include <2416.c>
        #fuses NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
        #priority int_timer2,int_timer0 
        /*******************************/
        #bit OE = 0x08.7 
        /*----------*/
        #bit c0 = 0x07.0
        #bit c1 = 0x07.1
        #bit c2 = 0x07.2
        #bit c3 = 0x07.3
        #bit c4 = 0x07.4
        #bit c5 = 0x07.5
        #bit c6 = 0x07.6
        #bit c7 = 0x07.7
        /*--------------*/
        #byte portB=0x06
        #byte portC=0x07
        #byte portD=0x08
        /*---------Dinh nghia Marco------------*/
        #define kiemtra (c4+(c5<<1)+(c6<<2)+(c7<<3))
        #define start_quetphim enable_interrupts(int_timer2)
        #define stop_quetphim disable_interrupts(int_timer2)
        /*---------------------------------------------*/
        unsigned int1 chon_play;
        unsigned int8 a,b;   
        unsigned int8 phim,chon_ct,chon_page,backup;
        unsigned int8 data;
        const unsigned char msg_ask[]={"  YES 1  NO 2  "};
        /*-----------------------------------------------------------------*/
        /*----------------------cac chuong trinh con-----------------------*/
        /*-----------------------------------------------------------------*/
        void muiten(void){data=0x7e;display();}
        void eraser(void){data=' ';display();}
        /*----------------------*/
        void contro(unsigned int8 dong,cot){
        moveto(dong,cot);muiten();
        delay_ms(20);
        moveto(dong,cot);eraser();
        delay_ms(20);
        }
        /*-----Loi Chao------*/
        void wellcome(void){
        const unsigned char msg1[]={"BAN QUYEN SP CUA"};
        const unsigned char msg2[]={"Slowlove-(29/06)"};
        for(a=0;msg1[a]!='\0';++a){data=msg1[a];display();}
        moveto(2,1);
        for(a=0;msg2[a]!='\0';++a){data=msg2[a];display();}
        delay_ms(800);
        }
        /*------------------*/
        void cau_hoi_xac_nhan(void){
        const unsigned char msg1[]={"Co muon chay CT?"};
        clear();
        for(a=0;msg1[a]!='\0';++a){data=msg1[a];display();}
        moveto(2,1);
        for(a=0;msg_ask[a]!='\0';++a){data=msg_ask[a];display();}
        }
        /*------------------*/
        void thong_bao_complete(void){
        const unsigned char msg[]={"Complete !"};
        clear();moveto(1,4);
        for(a=0;msg[a]!='\0';++a){data=msg[a];display();}   //Complete
        delay_ms(200);
        }
        void thong_bao_resetpage(void){
        const unsigned char msg1[]={"GO \"BEGIN_PAGE\" ?"};
        clear();
        for(a=0;msg1[a]!='\0';++a){data=msg1[a];display();}
        moveto(2,1);
        for(a=0;msg_ask[a]!='\0';++a){data=msg_ask[a];display();}
        }
        /*----------------------------------------------------------------------------*/
        /*-----------------------------Chuong trinh chinh-----------------------------*/
        /*----------------------------------------------------------------------------*/
        #include <program.c>
        void main(void){
        setup_timer_0(rtcc_internal|rtcc_div_256);
        setup_timer_2(t2_div_by_16,255,8);
        enable_interrupts(int_timer0);
        disable_interrupts(int_timer2);
        enable_interrupts(global);
        /*---------Cac lenh khoi tao ban dau-------*/
        setup_adc_ports(no_analogs);
        set_tris_a(0);           
        set_tris_c(0xf0); 
        set_tris_d(0x00); 
        portC=portD=0; 
        OE=0;
        /*--------Cac lenh hien thi ban dau--------*/
        khoitao(1,0);
        cursor(1,0,0);
        wellcome();
        /*****************phan xu li chinh cua chuong trinh*********************/
        while(true){
        clear(); 
        while(true)
           {
              start_quetphim;  
              menu_display(chon_page);  
              while((phim==0)||(phim==1)||(phim==2)); 
              phim=4;  
              while(true)
                {
                    if((phim==1)||(phim==2))break;   
                    switch(phim){
                    case 0:goto thuc_hien_chuong_trinh; 
                    case 4:stop_quetphim,backup=phim,contro(1,1),start_quetphim;break;
                    case 5:stop_quetphim,backup=phim,contro(1,9),start_quetphim;break;
                    case 6:stop_quetphim,backup=phim,contro(2,1),start_quetphim;break;
                    case 8:stop_quetphim,backup=phim,contro(2,9),start_quetphim;break;
                    default:stop_quetphim,phim=backup;}
                }
              stop_quetphim;
              if(phim==2)++chon_page;  
              if((phim==1)&&(chon_page>0))--chon_page;  
              if(chon_page==8)chon_page=0;  
           }
        /*-----------------------------------------------------------------------------*/
        thuc_hien_chuong_trinh:
        if(chon_page<7&&read_eeprom(1))
        {
        unsigned int8 backup_chon;
        cau_hoi_xac_nhan();  
        while(phim==0);   
        stop_quetphim;
        backup_chon=4;   
        while(true) 
           {
              if(phim==0)break;  
              switch(phim){
              case 4:stop_quetphim,backup_chon=phim,chon_play=0,contro(2,2),start_quetphim;break; 
              case 5:stop_quetphim,backup_chon=phim,chon_play=1,contro(2,9),start_quetphim;break;  
              default:stop_quetphim,phim=backup_chon;}
           }  
        }
        stop_quetphim; 
        if(chon_play==0||read_eeprom(1)==0||chon_page==7)
           {
              switch(backup)
              {
                 case 4:chon_ct=(chon_page<<2)+1;break;
                 case 5:chon_ct=(chon_page<<2)+2;break;
                 case 6:chon_ct=(chon_page<<2)+3;break;
                 case 8:chon_ct=(chon_page<<2)+4;break;
              }
              chay_chuongtrinh(chon_ct);
              thong_bao_complete();   //complete
              if(chon_page>0&&chon_page<7&&read_eeprom(0))
                 {
                    unsigned int8 backup_chon;
                    unsigned int1 chon_reset;
                    thong_bao_resetpage();
                    start_quetphim;
                    while(phim==0);
                    backup_chon=4;  
                    while(true)
                       {
                          if(phim==0)break;
                          switch(phim){
                          case 4:stop_quetphim,backup_chon=phim,chon_reset=0,contro(2,2),start_quetphim;break; 
                          case 5:stop_quetphim,backup_chon=phim,chon_reset=1,contro(2,9),start_quetphim;break;  
                          default:stop_quetphim,phim=backup_chon;}
                       }
                    stop_quetphim;    
                    if(chon_reset==0)chon_page=0;
                 }
           }
        }
        }
        /*-----------------------------------------------------------------*/
        /*------------Cac chuong trinh con phuc vu ngat timer--------------*/
        /*-----------------------------------------------------------------*/
        #int_ext
        void ext(void){}
        /*--------------------------*/
        #int_timer0
        void chose(void){
        static unsigned int8 x,value0;
        ++value0;
        if(value0==10){
        output_a(3<<x++);
        if(bit_test(x,3))x=0;
        value0=0;
        }
        }
        /*--------------------------*/
        #int_timer1
        void timer1(void){}
        /*--------------------------*/
        #int_timer2
        void quet(void){
        portC=1;   
        switch(kiemtra){
        case 1:phim=12;break;
        case 2:phim=13;break;
        case 4:phim=14;break;
        case 8:phim=15;break;
        default:phim=16;}   
        portC=2;
        switch(kiemtra){
        case 1:phim=8;break;
        case 2:phim=9;break;
        case 4:phim=10;break;
        case 8:phim=11;break;}
        portC=4;
        switch(kiemtra){
        case 1:phim=4;break;
        case 2:phim=5;break;
        case 4:phim=6;break;
        case 8:phim=7;break;}
        portC=8;
        switch(kiemtra){
        case 1:phim=0;break;
        case 2:phim=1;break;
        case 4:phim=2;break;
        case 8:phim=3;break;}
        portC=0;
        }
        /*--------------------------*/
        Last edited by slowlove; 07-01-2010, 10:34 AM.

        Comment

        • slowlove
          Đệ tử 1 túi
          • Mar 2006
          • 15

          #5
          Đã >100 ng đọc mà ko thấy ai có ý kiến j hết là sao vậy ta...??
          Last edited by slowlove; 08-01-2010, 09:51 PM.

          Comment

          • slowlove
            Đệ tử 1 túi
            • Mar 2006
            • 15

            #6
            đã 250 ng đọc mà ko có ai có ý kiến là sao thế???
            mọi ng đi đâu hết rùi...có mạch có code rồi mà....!!!

            Comment

            • piano76
              Nhập môn đệ tử
              • Mar 2010
              • 2

              #7
              e thấy khó wa sao ma cho ý kiến được

              Comment

              • piano76
                Nhập môn đệ tử
                • Mar 2010
                • 2

                #8
                a o dau zay.e voi a lam thử

                Comment

                • slowlove
                  Đệ tử 1 túi
                  • Mar 2006
                  • 15

                  #9
                  Nick yahoo của mình là love_classicalguitar..
                  bạn nào cần nghiên cứa hc phát triển ứng dụng của mình thì liên hệ ...mình sẽ gửi bản full cho...
                  mình mới nghiên cứu hoàn chỉnh hệ thống hiển thj này thôi...con chưa biết làm j với nó...
                  hiện tại chương trình đã có 40 menu bao gồm 4 options có nhớ...
                  các chương trình đc thêm vào sau này mà ko làm ảnh hưởng tới chương trình lớn...

                  Comment

                  • cskiller
                    Đệ tử 4 túi
                    • Aug 2008
                    • 89

                    #10
                    Nói chung tinh thần học hỏi, chia sẽ của bạn rất tốt. Tuy nhiên hiện thực menu trên LCD như thế này hơi khó đọc hiểu với các bạn ở mức độ 'bình dân' để có thể sử dụng lại code này. Cách hiện thức khác hiệu quả hơn là sử dụng danh sách con trỏ hàm, dễ dàng cho phép mở rộng cũng như đồng nhất các tính chất của sub menu. Kết hợp với sử dụng stack, các sub menu gọi sau thêm vào stack luôn là con, do đó nó nằm ở top và được xủ lý trước(hiển thị các sub menu con hoặc chọn lựa thực thi), khi thoát nó bị đẩy khỏi stack và sub menu cha của nó trước đó lạitrở thành top và tiếp tục quá trình, lặp cho đến khi stack trống nghĩa là về root.

                    Regards
                    Quang báo RG/RGB 6/8/12/16 bits màu
                    Phone No: 0905.034.086
                    Email: lmquyen@gmail.com

                    Comment

                    • pk178
                      Đệ tử 5 túi
                      • Jan 2009
                      • 100

                      #11
                      Chào bạn !!!

                      Mình cũng đã từng phải lập trình để tạo menu kiểu này. Thuật toán của mình như sau :

                      + Phím menu nối vào 1 chân ngắt, của vxl, khi nào ấn menu -> xuất hiện ngắt -> bạn đặt 1 cờ tương ứng, giả sử lần đầu tiên xuất hiện ngắt, bạn đặt cờ có giá trị là 1, lần thứ 2 xuất hiện ngắt, bạn đặt cờ có giá trị là 2.

                      + Chương trình chính sẽ liên tục kiểm tra trạng thái của cờ này để đưa ra chương trình con tương ứng với giá trị của cờ.

                      Cách làm trên có ưu điểm là nếu sau này bạn muốn mở rộng thêm các chức năng của chương trình như thêm các menu chẳng hạn, thì chỉ việc đặt thêm 1 cờ và 1 chương trình con tương ứng, chương trình cũ ko bị ảnh hưởng => dễ dàng cho việc nâng cấp firmware !

                      Hơn nữa chương trình trong ngắt như vậy sẽ ko quá dài, bạn ko bị gặp phải lỗi tràn stack (trước mình đã phải khổ sở với lỗi này)

                      Nói thật là mình cũng ko có đủ kiên nhẫn để đọc chương trình của bạn, hihi, mình nghĩ các bạn khác cũng thế nên ít người phản hồi lại cho bạn. Hơn nữa, bạn nên đưa thuật toán ra cho mọi người thảo luận thôi, chứ post cả code lên mạng thế kia thì đôi khi có những tình huống ko hay lắm hihi.

                      Thân ái !

                      Comment

                      • carino289
                        Nhập môn đệ tử
                        • Mar 2010
                        • 1

                        #12
                        bạn nào có cái menu.c không cho tớ với.
                        Last edited by carino289; 04-04-2010, 09:21 AM.

                        Comment

                        • trangthancb
                          Nhập môn đệ tử
                          • Apr 2011
                          • 5

                          #13
                          hi@ cảm ơn bạn đã share code nhé.
                          ^_^

                          Comment

                          Working...