giúp em với:Lập trình nút bấm cho pic 16f877a voi???

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • thanhchung89
    Nhập môn đệ tử
    • May 2011
    • 8

    #1

    giúp em với:Lập trình nút bấm cho pic 16f877a voi???

    em đang làm đồ án phần đo nhiệt độ thi em làm được rùi,còn phần nút ấn để tăng giảm nhiệt độ đặt thì chưa làm đươc. Mong các anh, chị giúp em với:
    thầy em bắt làm thêm 3 nút bấm:
    + 1 nút để ấn định thay đổi nhiệt độ
    + 1 nút để tăng nhiệt độ
    + 1 nút để giảm nhiệt độ
    giả sử có 3 nút: A B C: khi ấn nút A thi màn hình LCD hiển thị dòng chữ '' nhập nhiệt độ''
    khi ấn nút B thì tăng nhiệt độ
    khi ấn nút c thì giảm nhiệt độ
    sau đó khi ấn tiếp nút A thì kết thúc quá trình thay đổi nhiệt độ
    e mong mọi người giúp đỡ e với !!!!!!!! e thank nhiều
    Attached Files
  • tanbka
    Đệ tử 5 túi
    • Dec 2008
    • 91

    #2
    Bài tập của bạn đã rất rõ ràng, nhưng vấn đề của bạn là thế nào nhỉ, bạn cứ viết đi, vướng phần nào thì hỏi phần ấy, đoạn nào chạy ko đúng, hay không chạy thì post lên để mọi người giúp.

    Comment

    • thanhchung89
      Nhập môn đệ tử
      • May 2011
      • 8

      #3
      uhm, em đã post cả chương trình rùi mà!!! nhưng chương trình đó chưa có phần nút bấm! em đã làm nhưng phần chương trình đó của e ko chạy.em post lại chương trình này:
      #include <16F877A.h>
      #include <def_877a.h>
      #device *=16 adc=10
      #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
      #use delay(clock=20000000)
      #include <lcd_lib_4bit.c> // Thu vien ham cho LCD
      int8 low,high,min,max,i;
      int1 do_F;
      void convert_bcd(int8 x);
      #INT_EXT
      #define nut1 PIN_C2
      #define nut2 PIN_C3
      #define nut3 PIN_C4
      void test()
      {
      if (do_F == 1) do_F=0;
      else do_F=1;
      }
      void banphim()
      { max =40;
      if (nut1 == 0)
      LCD_putcmd(0x01);
      LCD_putchar("nhap nhiet do:");
      {if (nut2==0)
      max = max + 1;
      if (nut3 == 0)
      max = max - 1;}

      }
      //-----------------------------------------------------------------
      void main()
      {
      float value;
      min =0; //nhiet do mim
      // max =40; //nhiet do max
      do_F =0 ;
      i = 10 ;
      trisa = 0xFF;
      trisb = 0x01;
      output_low(pin_C0);
      output_low(pin_C1);
      LCD_init();
      LCD_putcmd(0x01);
      LCD_putchar("do_nhiet_do:");
      LCD_putcmd(0xC0);
      LCD_putchar("cho ty nhe ...");
      //==== Khoi tao cho ngat ngoai============================================= ==
      enable_interrupts (INT_EXT);
      ext_int_edge(H_TO_L);
      enable_interrupts (GLOBAL);
      //=========== Khoi tao che do cho bo ADC=====================================
      setup_adc_ports(AN0);
      setup_adc(ADC_CLOCK_INTERNAL);

      delay_us(10);// Lay mau nhiet do lan dau tien
      value=(float)read_adc();
      value = (value - 558.5)/2.048; // For 5V supply
      // value = (value - 754.8)/2.048; // For 3.7V Supply
      // value = (value - 698.2)/2.048; // For 4V supply
      convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7
      delay_ms(100);
      LCD_putcmd(0xC0);
      LCD_putchar("Ok ");
      delay_ms(100);

      while(1)
      {
      if (i==10)
      {
      value = read_adc();
      value=(value-558.5)/2.048;

      if (do_F==1)
      value=1.8*value+32;
      convert_bcd((int8)value);

      LCD_putcmd(0xC0);
      printf(LCD_putchar,"Nhiet do la:");
      LCD_putchar(high); LCD_putchar(low);

      if (do_F==0)
      printf(LCD_putchar," C");
      else
      printf(LCD_putchar," F");
      i=0;
      }
      if ( (int8)value <= max & min <=(int8)value)
      output_high(pin_C1);
      else output_low(pin_C1);
      if( ( (int8)value > max )|| ( (int8)value < min))
      output_high(pin_C0);
      else output_low(pin_C0);
      i++;
      }
      }
      //The End=============================================== ========================
      void convert_bcd(int8 x)
      {
      low=x%10; //chia lay phan du, so hang don vi
      high=x/10; //tach hang tram va hang chuc
      low = low + 0x30;
      high = high + 0x30;
      }

      phần chương trình con void ban_phim() ấy nó ko chạy
      mong mọi người giúp đỡ

      Comment

      • tanbka
        Đệ tử 5 túi
        • Dec 2008
        • 91

        #4
        Bạn phải đưa hàm banphim() vào trong vòng lặp while thì nó mới chạy được chứ
        Với lại việc khai báo hàm void convert_bcd(int8 x) phải đặt trước hàm main() chứ bạn

        Comment

        • hcmut.khoamaisi
          Đệ tử 4 túi
          • Dec 2009
          • 79

          #5
          void banphim()
          { max =40;
          if (nut1 == 0)
          LCD_putcmd(0x01);
          LCD_putchar("nhap nhiet do:");
          {if (nut2==0)
          max = max + 1;
          if (nut3 == 0)
          max = max - 1;}
          chỗ hàm if nên sửa lại điều kiện bằng cách dùng input_state() cjo các chân nối đến các nút nhấn;
          trong hàm main() nên dùng set_tris_x() cấu hình cho các chân có nối nút nhấn là input!
          Hàm banphim() phải để lặp trong while(true)
          My blog: http://autumnneverreturn.blogspot.com/
          Đối thủ khó chiến thắng nhất là bản thân !!!

          Comment

          • thanhchung89
            Nhập môn đệ tử
            • May 2011
            • 8

            #6
            anh ơi xem hộ em với: chương trình em đã sửa như a nói nhưng mà vẫn ko chạy được a ơi
            chương trình e sửa đây này a xem hộ em với nhé:
            #include <16F877A.h>
            #include <def_877a.h>
            #device *=16 adc=10
            #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
            #use delay(clock=20000000)
            #include <lcd_lib_4bit.c> // Thu vien ham cho LCD
            int8 low,high,min,max,i;
            int1 do_F;
            void convert_bcd(int8 x);
            #INT_EXT
            //#define nut1 PIN_C2
            //#define nut2 PIN_C3
            //#define nut3 PIN_C4
            void test()
            {
            if (do_F == 1) do_F=0;
            else do_F=1;
            }
            void convert_bcd(int8 x)
            {
            low=x%10; //chia lay phan du, so hang don vi
            high=x/10; //tach hang tram va hang chuc
            low = low + 0x30;
            high = high + 0x30;
            }

            void banphim()
            { max =40;
            set_tris_C(3);
            set_tris_C(4);
            set_tris_C(5);
            while(1)
            {if (pin_C2 == 0)
            LCD_putcmd(0x01);
            LCD_putchar("nhap nhiet do:");
            {if (pin_C3==0)
            max = max + 1;
            if (pin_C4 == 0)
            max = max - 1;}

            }}
            //-----------------------------------------------------------------
            void main()
            {
            float value;
            min =0; //nhiet do mim
            // max =40; //nhiet do max
            do_F =0 ;
            i = 10 ;
            trisa = 0xFF;
            trisb = 0x01;
            output_low(pin_C0);
            output_low(pin_C1);
            LCD_init();
            LCD_putcmd(0x01);
            LCD_putchar("do_nhiet_do:");
            LCD_putcmd(0xC0);
            LCD_putchar("cho ty nhe ...");
            //==== Khoi tao cho ngat ngoai============================================= ==
            enable_interrupts (INT_EXT);
            ext_int_edge(H_TO_L);
            enable_interrupts (GLOBAL);
            //=========== Khoi tao che do cho bo ADC=====================================
            setup_adc_ports(AN0);
            setup_adc(ADC_CLOCK_INTERNAL);

            delay_us(10);// Lay mau nhiet do lan dau tien
            value=(float)read_adc();
            value = (value - 558.5)/2.048; // For 5V supply
            // value = (value - 754.8)/2.048; // For 3.7V Supply
            // value = (value - 698.2)/2.048; // For 4V supply
            convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7
            delay_ms(100);
            LCD_putcmd(0xC0);
            LCD_putchar("Ok ");
            delay_ms(100);

            while(1)
            {
            if (i==10)
            {
            value = read_adc();
            value=(value-558.5)/2.048;

            if (do_F==1)
            value=1.8*value+32;
            convert_bcd((int8)value);

            LCD_putcmd(0xC0);
            printf(LCD_putchar,"Nhiet do la:");
            LCD_putchar(high); LCD_putchar(low);

            if (do_F==0)
            printf(LCD_putchar," C");
            else
            printf(LCD_putchar," F");
            i=0;
            }
            if ( (int8)value <= max & min <=(int8)value)
            output_high(pin_C1);
            else output_low(pin_C1);
            if( ( (int8)value > max )|| ( (int8)value < min))
            output_high(pin_C0);
            else output_low(pin_C0);
            i++;
            }
            }
            //The End=============================================== ========================

            Comment

            • tanbka
              Đệ tử 5 túi
              • Dec 2008
              • 91

              #7
              Trong hàm bàn phím bàn khởi tạo 3 lần
              set_tris_C(3);
              set_tris_C(4);
              set_tris_C(5);
              như thế 3 PIN C2,C3,C4 đâu có đồng thời là đầu vào
              Bạn chỉ cần 1 lệnh thôi set_tris_C(24); là cấu hình C2,3,4 là đầu vào, còn lại đầu ra.
              Với lại cấu hình cổng vào ra bạn chỉ cần thực hiện 1 lần trước vòng lặp while, không cần để trong hàm quét phím, như thế PIC sẽ phải cấu hình cổng liên tục ở mỗi vòng quét.

              Comment

              • thanhchung89
                Nhập môn đệ tử
                • May 2011
                • 8

                #8
                thank các a nhieu!!! nhung e sủa rùi mà chẳng thay đổi được gì ca!!!
                hay là cái hàm đó của em có vấn đề gì nhi??
                chỉ giáo cho e với??

                Comment

                • thanhchung89
                  Nhập môn đệ tử
                  • May 2011
                  • 8

                  #9
                  ko có ai giúp vậy?

                  Comment

                  • tdm
                    Đệ tử 7 túi
                    • May 2005
                    • 258

                    #10
                    Nguyên văn bởi thanhchung89 View Post
                    ko có ai giúp vậy?
                    thôi thì để tôi chèn giúp bạn vài dòng lệnh để code hoàn chỉnh vậy.
                    Code:
                    #include <16F877A.h>
                    #include <def_877a.h>
                    #device *=16 adc=10
                    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
                    #use delay(clock=20000000)
                    #include <lcd_lib_4bit.c> // Thu vien ham cho LCD
                    
                    int8 low,high,min,max,i,sida=0xaa;
                    int1 do_F;
                    float value;
                    #define nut1 RC2
                    #define nut2 RC3
                    #define nut3 RC4
                    #INT_EXT
                    void test()
                       {
                       if (do_F == 1) do_F=0;
                       else do_F=1;
                       }
                       void banphim(void);
                       void convert_bcd(int8 x);
                       
                    //-----------------------------------------------------------------
                    void main()
                       {
                       min =0;      //nhiet do mim 
                       max =40;    //nhiet do max 
                       do_F =0 ;
                       i = 10 ;
                       trisa = 0xFF;
                       trisb = 0x01;
                       trisc = 0b00011100;
                       output_low(pin_C0);
                       output_low(pin_C1);
                        //==== Khoi tao cho ngat ngoai===============================================
                       enable_interrupts (INT_EXT);
                       ext_int_edge(H_TO_L);
                       enable_interrupts (GLOBAL);
                       //=========== Khoi tao che do cho bo ADC=====================================
                       setup_adc_ports(AN0);
                       setup_adc(ADC_CLOCK_INTERNAL);
                       LCD_init();
                       LCD_putcmd(0x01);
                       LCD_putchar("do_nhiet_do:");
                       LCD_putcmd(0xC0);
                       LCD_putchar("cho ty nhe ...");
                       delay_us(10);// Lay mau nhiet do lan dau tien
                       value=(float)read_adc();
                       value = (value - 558.5)/2.048; // For 5V supply
                       // value = (value - 754.8)/2.048; // For 3.7V Supply
                       // value = (value - 698.2)/2.048; // For 4V supply
                       convert_bcd(value); // Tach so tram, chuc, donvi de hien thi len LED 7
                       delay_ms(100);
                       LCD_putcmd(0xC0);
                       LCD_putchar("Ok               ");
                       delay_ms(100);
                       while(1)
                          {
                          banphim();
                          if (i==10)
                             {
                              if(sida==0xaa)
                              {
                             value = read_adc();
                             value=(value-558.5)/2.048;
                             
                             if (do_F==1) 
                                value=1.8*value+32;
                             convert_bcd(value);
                    
                             LCD_putcmd(0xC0);
                             printf(LCD_putchar,"Nhiet do la:");
                             LCD_putchar(high); LCD_putchar(low);
                             
                             if (do_F==0) 
                                printf(LCD_putchar," C");
                             else 
                                printf(LCD_putchar," F");
                             i=0;
                              }
                              else
                              {
                              }
                             }//
                            
                       if (value <= max & min <=value) 
                           {
                              output_high(pin_C1);
                           }
                            else output_low(pin_C1);
                       if(value > max ||value < min)
                              output_high(pin_C0);
                           else output_low(pin_C0); 
                          i++;
                          }
                       }
                    //The End=======================================================================
                    void convert_bcd(int8 x)
                       {
                       low=x%10;      //chia lay phan du, so hang don vi
                       high=x/10;     //tach hang tram va hang chuc
                       low = low + 0x30;
                       high = high + 0x30;
                       }
                    void banphim()
                    { 
                    if (nut1 == 0)
                    {
                    sida=~sida;
                    if(sida!=0xaa)
                    {
                    LCD_putcmd(0x01);
                    LCD_putchar("nhap nhiet do:");
                    LCD_putcmd(0xC0);
                    printf(LCD_putchar,"gia tri MAX:%d",max);
                    }
                     else
                     {
                     LCD_putcmd(0x01);
                     LCD_putchar("do_nhiet_do:");
                     value = read_adc();
                             value=(value-558.5)/2.048;
                             
                             if (do_F==1) 
                                value=1.8*value+32;
                             convert_bcd(value);
                    
                             LCD_putcmd(0xC0);
                             printf(LCD_putchar,"Nhiet do la:");
                             LCD_putchar(high); LCD_putchar(low);
                             
                             if (do_F==0) 
                                printf(LCD_putchar," C");
                             else 
                                printf(LCD_putchar," F");
                     }
                    while(nut1 == 0)
                    {
                    }
                    }
                    else if (nut3 == 0)
                    {
                      if(sida!=0xaa)
                      {
                      max = max - 1;
                      LCD_putcmd(0xC0);
                      printf(LCD_putchar,"gia tri MAX:%d",max);
                      }
                    else
                       {
                       }
                       while(nut3 == 0)//cho nha phim
                       {
                        }
                       delay_ms(10);//chong nay phim
                    }
                    else if (nut2 == 0)
                    {
                      if(sida!=0xaa)
                      {
                      max = max +1;
                      LCD_putcmd(0xC0);
                      printf(LCD_putchar,"gia tri MAX:%d",max);
                      }
                       else
                       {
                       }
                       while(nut2 == 0)//cho nha phim
                       {
                        }
                       delay_ms(10);//chong nay phim
                    }
                    else
                    {
                    }
                    }
                    http://www.youtube.com/watch?v=nvtwwuzRkZI
                    Last edited by tdm; 05-05-2011, 10:53 AM.
                    viết chương trình cho vdk chạy ổn định là cả một vấn đề.

                    Comment

                    • thanhchung89
                      Nhập môn đệ tử
                      • May 2011
                      • 8

                      #11
                      anh TDM ơi : Em cảm ơn anh nhiều lắm! mạch của em chạy được rồi anh ạ!
                      em vui lắm! em mới học nên kiến thức còn ít lắm may mà có anh giúp đỡ ko thì em ko biết làm thế nào hết
                      a có thể cho em số điện thoại hoặc nick chát ko ạ?
                      em muốn cảm ơn anh!!
                      em chúc anh và gia đình luôn vui vẻ và hạnh phúc!!

                      Comment

                      • thanhchung89
                        Nhập môn đệ tử
                        • May 2011
                        • 8

                        #12
                        em biết tên anh rồi : chúc anh MINH và gia đình hạnh phúc
                        cho em số điện thoại của anh nhé?cảm ơn a MINH

                        Comment

                        • thanhchung89
                          Nhập môn đệ tử
                          • May 2011
                          • 8

                          #13
                          a ơi cho e biết là tại sao phải khai báo ''sida=0xaa'' trong dòng khai báo: int8 low,high,min,max,i,sida=0xaa; ?
                          no có tác dụng gì vậy a??

                          Comment

                          • hoangcuibap
                            Đệ tử 1 túi
                            • Sep 2008
                            • 13

                            #14
                            Chao bac TMD, em muon cam on bac ve doan chuong trinh o tren qua do em co the hoc dc nhieu.
                            Em thay bac khai bao float value nhung sao bac lai truyen tham so khai bao kieu int, nhu vay se co sai so.
                            Bac chuyen doi gia tri adc voi so thuc, con cach nao khac nua ko bac? Vi nhan chia voi so thuc se ton tai nguyen vdk

                            Comment

                            • tdm
                              Đệ tử 7 túi
                              • May 2005
                              • 258

                              #15
                              Nguyên văn bởi thanhchung89 View Post
                              a ơi cho e biết là tại sao phải khai báo ''sida=0xaa'' trong dòng khai báo: int8 low,high,min,max,i,sida=0xaa; ?
                              no có tác dụng gì vậy a??
                              khi sida=0xaa//ct sẽ hiểu là đọc giá trị cảm biến
                              khi sida !=0xaa ct sẽ hiểu là đang cài đặt nhiệt độ.
                              em coi lại phần nut1 sẽ rõ.
                              @hoangcuibap:
                              bạn có thể sửa lại cho phù hợp với ứng dụng của bạn.
                              viết chương trình cho vdk chạy ổn định là cả một vấn đề.

                              Comment

                              Working...