Thông báo

Collapse
No announcement yet.

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

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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

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

    Comment


    • #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


      • #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


        • #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


          • #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


            • #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, 23:38.

              Comment


              • #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


                • #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


                  • #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


                    • #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


                      • #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


                        • #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...
                          X