RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

AVR với Led 7 thanh và nút bấm

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • tuananhbme
    Thành viên mới
    • Aug 2010
    • 21

    #1

    AVR với Led 7 thanh và nút bấm

    Các bác ơi mình đang học lập trình AVR bằng codevision. Giờ mình đang lập trình cho con Led 7 thanh. Mình muốn khi bấm nút thì số tăng, bấm nút khác thì số giảm ( 1 nút up và 1 nút down). Mình chỉ lập trình đc 1 kiểu thôi nhưng ko kết hợp được. đây là code của mình. Mong các pro giúp đỡ. Sao mạch của mình khi bấm nút down thì số giảm còm bấm nút up thì ko có chuyện gì xảy ra vậy.



    /************************************************** ***
    Project : Nut bam Led 7 thanh
    Version : 1.0
    Date : 8/7/2010
    Author : Tuan Anh
    Company : HUT


    Chip type : ATmega16
    Program type : Application
    Clock frequency : 12.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega16.h>
    #include <delay.h>

    #define up PINA.0

    #define down PINA.1


    // Declare your global variables here
    unsigned char dem=1;

    void hien_thi (unsigned char x)
    {
    switch(x)
    {

    case 0: { PORTC=0xC0; break; } // So 0
    case 1: { PORTC=0xF9; break; } // So 1
    case 2: { PORTC=0xA4; break; } // So 2
    case 3: { PORTC=0xB0; break; } // So 3
    case 4: { PORTC=0x99; break; } // So 4
    case 5: { PORTC=0x92; break; } // So 5
    case 6: { PORTC=0x82; break; } // So 6
    case 7: { PORTC=0xF8; break; } // So 7
    case 8: { PORTC=0x80; break; } // So 8
    case 9: { PORTC=0x90; break; } // So 9
    }
    }

    void ham_up(void)
    {
    if(up)
    {
    dem++;
    while(up);
    delay_ms(10);
    }

    hien_thi(dem-1);
    if(dem==10)
    dem=0;
    }

    void ham_down (void)
    {


    if(down)
    {
    dem--;
    while(down);
    delay_ms(10);
    }

    hien_thi(dem);
    if(dem==0)
    {
    hien_thi(0);
    dem=10;
    }
    }
    void main(void)
    {
    // Declare your local variables here

    PORTA=0b00000111;
    DDRA=0x00;

    PORTC=0xff;
    DDRC=0xFF;


    while (1)
    {
    if(up==0&&down==1)
    ham_up();
    if(up==1&&down==0);
    ham_down();
    };


    }


    Đây là mạch và code của mình,
    http://www.mediafire.com/?7vec0qq1bj2hehh
  • manhbkhn
    Thành viên mới
    • Jun 2010
    • 12

    #2
    bỏ cái ; ở dòng thứ 2 từ cuối nên là được thôi chú tuấn anh à.

    Comment

    • tuananhbme
      Thành viên mới
      • Aug 2010
      • 21

      #3
      Nguyên văn bởi manhbkhn Xem bài viết
      bỏ cái ; ở dòng thứ 2 từ cuối nên là được thôi chú tuấn anh à.
      Không được đâu. Giúp t với Mạnh ơi!

      Comment

      • huancao_8x
        Thành viên mới
        • Oct 2008
        • 28

        #4
        Nếu bạn check nút bấm mà chỉ check if(up) hay if(down) thì theo mình nghĩ bạn sẽ vấp phải vấn đề nhiễu xung bấm khi làm mạch thực tế và thậm chí ngay trên proteus cũng nhận ra được. Bạn có thể thêm delay rồi check up,down lại để tránh hiện tượng nhiễu xung bấm. Hoặc cách khác là dùng thêm biến check phím bấm.

        Mình cũng đã thử tạo 3 phím bấm( 1 menu, 1 up , 1down) Với menu là phím chọn và up down là tăng giảm. Có thể cách của mình so với các cao thủ là nông dân nhưng mình thấy nó khá tốt khi cần thêm modul bấm chỉ thêm code mà không cần viết lại toàn bộ. Có test proteus 7.6 hiển thị trực quan trên LCD và bạn nên xem hình ảnh đính kèm để biết số lượng trường menu được tạo ra với phím tăng giảm up và down. Đây chỉ là 1 kênh cho bạn tham khảo!
        http://www.mediafire.com/?z8y1evb1g0dag0n

        Comment

        • tuananhbme
          Thành viên mới
          • Aug 2010
          • 21

          #5
          Nguyên văn bởi huancao_8x Xem bài viết
          Nếu bạn check nút bấm mà chỉ check if(up) hay if(down) thì theo mình nghĩ bạn sẽ vấp phải vấn đề nhiễu xung bấm khi làm mạch thực tế và thậm chí ngay trên proteus cũng nhận ra được. Bạn có thể thêm delay rồi check up,down lại để tránh hiện tượng nhiễu xung bấm. Hoặc cách khác là dùng thêm biến check phím bấm.

          Mình cũng đã thử tạo 3 phím bấm( 1 menu, 1 up , 1down) Với menu là phím chọn và up down là tăng giảm. Có thể cách của mình so với các cao thủ là nông dân nhưng mình thấy nó khá tốt khi cần thêm modul bấm chỉ thêm code mà không cần viết lại toàn bộ. Có test proteus 7.6 hiển thị trực quan trên LCD và bạn nên xem hình ảnh đính kèm để biết số lượng trường menu được tạo ra với phím tăng giảm up và down. Đây chỉ là 1 kênh cho bạn tham khảo!
          http://www.mediafire.com/?z8y1evb1g0dag0n
          Thanks nhiều nhé. Mình mới học AVR nên cũng mù mờ lắm. Thanks again

          Comment

          • tdlong506
            Thành viên chính thức
            • Apr 2008
            • 47

            #6
            Bạn tuananhbme yếu về lập trình quá.
            Thông thường, bảng mã LED7 nên lưu dưới dạng mảng nằm trong ROM
            Code:
            const char LED7[] = { 0xC0; 0xF9;0xA4; 0xB0; 0x99; 0x92; 0x82; 0xF8; 0x80; 0x90 };
            lúc đó hàm hiển thị của bạn đơn giản là : (vd chỉ hiển thị 1 số)
            Code:
            void display (char x) {
            PORTC = LED7[x];
            }
            Chân input của nút bấm thông thường được kéo điện trở 10k lên nguồn, AVR thì có sẵn điện trở kéo lên, có thể không cần. Khi nút được bấm, chân input nối đất (tích cực thấp). Khi đó trong vòng while của hàm main, bạn chỉ cần kiểm tra trạng thái 0 của pin là được.
            VD: pin A.0 là UP, pin A.1 là DOWN
            Code:
            while(1) {
            if( PINA & 0x01) {
            count++;
            }
            if( PINA & 0x02) {
            count--;
            }
            display(count);
            }
            Code trên chỉ là vd đơn giản, không áp dụng thực tế được, do thời gian bạn bấm nhả rất lâu so với thời gian MCU thực hiện đoạn lệnh trên, thao tác bấm của bạn dù có nhanh lắm thì cũng đủ để tăng biến đếm vài ngàn lần. Vì thế bạn phải đặt delay và kiểm tra chống rung (vd kiểm tra nút được bấm 50 lần mới công nhận thao tác bấm).
            Cả đoạn code của bạn được rút gọn lại thành mấy dòng rồi đó, chỉ cần khai báo bảng mã LED7, rồi đến hàm main(), khai báo inout port và kiểm tra. Bạn làm tiếp nhé, nếu có điều kiện thì nên làm mạch thật mà thực hành.
            Chúc học tốt.

            Comment

            • tuananhbme
              Thành viên mới
              • Aug 2010
              • 21

              #7
              Nguyên văn bởi tdlong506 Xem bài viết
              Bạn tuananhbme yếu về lập trình quá.
              Thông thường, bảng mã LED7 nên lưu dưới dạng mảng nằm trong ROM
              Code:
              const char LED7[] = { 0xC0; 0xF9;0xA4; 0xB0; 0x99; 0x92; 0x82; 0xF8; 0x80; 0x90 };
              lúc đó hàm hiển thị của bạn đơn giản là : (vd chỉ hiển thị 1 số)
              Code:
              void display (char x) {
              PORTC = LED7[x];
              }
              Chân input của nút bấm thông thường được kéo điện trở 10k lên nguồn, AVR thì có sẵn điện trở kéo lên, có thể không cần. Khi nút được bấm, chân input nối đất (tích cực thấp). Khi đó trong vòng while của hàm main, bạn chỉ cần kiểm tra trạng thái 0 của pin là được.
              VD: pin A.0 là UP, pin A.1 là DOWN
              Code:
              while(1) {
              if( PINA & 0x01) {
              count++;
              }
              if( PINA & 0x02) {
              count--;
              }
              display(count);
              }
              Code trên chỉ là vd đơn giản, không áp dụng thực tế được, do thời gian bạn bấm nhả rất lâu so với thời gian MCU thực hiện đoạn lệnh trên, thao tác bấm của bạn dù có nhanh lắm thì cũng đủ để tăng biến đếm vài ngàn lần. Vì thế bạn phải đặt delay và kiểm tra chống rung (vd kiểm tra nút được bấm 50 lần mới công nhận thao tác bấm).
              Cả đoạn code của bạn được rút gọn lại thành mấy dòng rồi đó, chỉ cần khai báo bảng mã LED7, rồi đến hàm main(), khai báo inout port và kiểm tra. Bạn làm tiếp nhé, nếu có điều kiện thì nên làm mạch thật mà thực hành.
              Chúc học tốt.
              Thì mình đang tập tành học mà . Mới bắt đầu học nên mới cần các Pro chỉ giáo . Thanks nha.

              Mà muốn 2 or 3 led sáng thì làm thế nào hả Pro ơi?
              Last edited by tuananhbme; 07-08-2010, 22:38.

              Comment

              • tdlong506
                Thành viên chính thức
                • Apr 2008
                • 47

                #8
                Nguyên văn bởi tuananhbme Xem bài viết
                Thì mình đang tập tành học mà . Mới bắt đầu học nên mới cần các Pro chỉ giáo . Thanks nha.

                Mà muốn 2 or 3 led sáng thì làm thế nào hả Pro ơi?
                Chưa suy nghĩ đã hỏi rồi. Tự giải quyết vấn đề sau nhé.
                Sáng 2, 3 LED thì không thể mỗi LED dùng 1 port được rồi. -> tìm hiểu về quét LED
                Làm sao hiển thị được số 256 (ví dụ thế) -> tách ra thành 2, 5 và 6.

                Chúc học tốt.

                Comment

                • quilamspk13
                  Thành viên mới
                  • Jul 2010
                  • 5

                  #9
                  các bác ơi e muốn học AVR thì có cần học trước môn nào không??
                  thanks a lot........

                  Comment

                  • hungmc
                    Thành viên chính thức
                    • Nov 2009
                    • 43

                    #10
                    if(up==1&&down==0);
                    Bạn bỏ dấu "chấm phảy" ở cuối câu if này đi là hiển thị được lệnh up.
                    Nguyễn Như Hùng - Cty Cổ phần TEKPRO Việt Nam

                    - 0986681713

                    Comment

                    • tdlong506
                      Thành viên chính thức
                      • Apr 2008
                      • 47

                      #11
                      Nguyên văn bởi quilamspk13 Xem bài viết
                      các bác ơi e muốn học AVR thì có cần học trước môn nào không??
                      thanks a lot........
                      Không biết các cao thủ thế nào, chớ mình thấy trong trưòng, thường hay dạy 8051 trước để lấy căn bản, sau đó qua các loại VDK khác, tuy khác nhau, nhưng có được cái căn bản rồi cứ thế mà tiến. Mình cũng vậy, cũng tự học 8051, rồi qua ARM, AVR.

                      Comment

                      • huancao_8x
                        Thành viên mới
                        • Oct 2008
                        • 28

                        #12
                        Nguyên văn bởi quilamspk13 Xem bài viết
                        các bác ơi e muốn học AVR thì có cần học trước môn nào không??
                        thanks a lot........
                        Nếu yêu cầu thời gian ngắn nhất thì mình nghĩ Goole là môn học đầu tiên. Bạn nên search tài liệu từ google. Hầu như không có một môn học cụ thể lý thuyết nào bằng việc tìm các câu trả lời trên đó. Bạn cứ thắc mắc bất cứ thứ gì từ nguyên lý tới code .....v . v. thì nên tìm, bởi trước khi bạn mắc điều đó đã có bao người bị trước đó rồi. Ít nhất nó sẽ hiệu quả tới khi bạn đủ trình làm những thứ cao siêu hơn khi mà trên goole hiếm có kết quả của ai đó cho bạn tham khảo. hihi

                        Comment

                        • tuananhbme
                          Thành viên mới
                          • Aug 2010
                          • 21

                          #13
                          Cuối cùng thì minh cũng đã làm được.

                          /************************************************** ***
                          Project : Nut bam Led 7 thanh
                          Version : 1.0
                          Date : 8/7/2010
                          Author : Tuan Anh
                          Company : HUT


                          Chip type : ATmega16
                          Program type : Application
                          Clock frequency : 12.000000 MHz
                          Memory model : Small
                          External RAM size : 0
                          Data Stack size : 256
                          ************************************************** ***/

                          #include <mega16.h>
                          #include <delay.h>

                          #define up PINA.0

                          #define down PINA.1


                          // Declare your global variables here
                          unsigned char count=1;

                          void hien_thi (unsigned char x)
                          {
                          switch(x)
                          {

                          case 0: { PORTC=0xC0; break; } // So 0
                          case 1: { PORTC=0xF9; break; } // So 1
                          case 2: { PORTC=0xA4; break; } // So 2
                          case 3: { PORTC=0xB0; break; } // So 3
                          case 4: { PORTC=0x99; break; } // So 4
                          case 5: { PORTC=0x92; break; } // So 5
                          case 6: { PORTC=0x82; break; } // So 6
                          case 7: { PORTC=0xF8; break; } // So 7
                          case 8: { PORTC=0x80; break; } // So 8
                          case 9: { PORTC=0x90; break; } // So 9
                          }
                          }


                          void main(void)
                          {
                          // Declare your local variables here

                          PORTA=0b00000111;
                          DDRA=0x00;

                          PORTC=0xff;
                          DDRC=0xFF;


                          while (1)
                          {
                          if( PINA.0==0)
                          {
                          count++;
                          while(PINA.0==0);
                          delay_ms(10);
                          if(count==11)
                          count=10;
                          }
                          if(PINA.1==0)
                          {
                          count--;
                          while(PINA.1==0);
                          delay_ms(10);
                          if(count==0)
                          count=1;
                          }
                          hien_thi(count-1);
                          };


                          }

                          Comment

                          Về tác giả

                          Collapse

                          tuananhbme Tìm hiểu thêm về tuananhbme

                          Bài viết mới nhất

                          Collapse

                          Đang tải...