Thông báo

Collapse
No announcement yet.

Code C quét phím - chống dội phím cho AVR dùng codevision lập trình

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

  • Code C quét phím - chống dội phím cho AVR dùng codevision lập trình

    Hôm nay buồn buồn kg có việc gì làm bèn đem cái code C viết cho con atmega32 dùng để chống dội phím ra cho anh em tham khảo rồi dùng. Code này đảm bảo chống dội phím tối đa, khi bạn nhấn một phím và giữ bất kì bao lâu cũng được, khi nhả phím ra nó mới thực hiện.
    - Kết nối phần cứng bàn phím ma trận 4x4, 4 chân nối vào 4 bit thấp của portB, 4 chân nối vào 4 bit cao của portB.
    - Phuơng pháp quét phím cấp điện lần lượt 4 chân bít thấp, kiểm tra sự thay đổi ở 4 chân bit cao. khi nào có sự thay đổi nhảy đến phần chống dội phím, sau đó xử lí sự kiện có phím nhấn.

    Code quét phím:

    while(1)
    {
    DDRB=0x0F;
    PORTB=0;

    PORTB.0=1;
    delay_ms(5);
    if (PINB>15) break;
    PORTB=0;
    PORTB.1=1;
    delay_ms(5);
    if (PINB>15) break;
    PORTB=0;
    PORTB.2=1;
    delay_ms(5);
    if (PINB>15) break;
    PORTB=0;
    PORTB.3=1;
    delay_ms(5);
    if (PINB>15) break;
    }
    Code chống dội phím
    void chongdoi(void)
    { int i;
    loinhan:;
    for (i=0;i<=50;i++) // khi có phím nhấn sẽ nhảy đến đây
    {
    if (PINB<=15) goto loinhan; //đảm bảo kg còn dội nữa
    }
    ma_key=PINB; // luu gia tri portB
    delay_ms(50);
    while(1)
    {
    if (PINB<=15) //đợi phím nhả ra
    {
    loinha:;
    for (i=0;i<=50;i++)
    {
    if (PINB>15) goto loinha;
    }
    break;
    }
    }
    PORTB=0; //reset PORTB
    }
    Cái này mình tự viết chạy OK, vì làm đồ án mà (T_T). Trước đây search tá lả lun mà kg có, đành tự tìm hiểu rùi tự viết thấy khổ quá, giờ share cho anh em khỏi cất công viết lại cực khổ, vì mình đã trải qua cái khổ rùi! Khổ chỉ một lần, có gì anh em ta share cho nhau!!!!!!
    Last edited by bijusi@; 11-11-2008, 10:07.

  • #2
    Ngoài cách trên ra có một cách chống dội đơn giản nhưng hiệu quả hơn như sau:

    Code:
    cur_key = <giá trị hiện tại của phím>;
    
    is_keypressed = (cur_key) & (!old_key);
    if (is_keypressed) 
      {do anything...;}
    
    old_key = cur_key;
    Tham khảo:

    http://dientuvietnam.net/forums/showthread.php?t=19162

    Comment


    • #3
      bài viết của anh hay quá, em cũng muốn tìm hiểu các quét phím thì đọc được lại giải quyết tổng thể luôn cả vấn đề chống dội, giờ em chỉ cần bổ xung một chương trình con giải mã nữa(một lệng switch-case) nữa là OK rồi
      Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

      Comment


      • #4
        bài viết của anh hay quá, em cũng muốn tìm hiểu các quét phím thì đọc được lại giải quyết tổng thể luôn cả vấn đề chống dội, giờ em chỉ cần bổ xung một chương trình con giải mã nữa(một lệng switch-case) nữa là OK rồi
        nhưng em nghĩ có nên cần phần kiểm tra nhả không anh? vì chuẩn nhất là như bàn phím máy tính, nếu cứ giữ phím nhấn thì giá trị sẽ được thực hiện liên tục sau những khoảng thời jan nhất định
        Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

        Comment


        • #5
          Nguyên văn bởi Le Thi Bich Xem bài viết
          bài viết của anh hay quá, em cũng muốn tìm hiểu các quét phím thì đọc được lại giải quyết tổng thể luôn cả vấn đề chống dội, giờ em chỉ cần bổ xung một chương trình con giải mã nữa(một lệng switch-case) nữa là OK rồi
          nhưng em nghĩ có nên cần phần kiểm tra nhả không anh? vì chuẩn nhất là như bàn phím máy tính, nếu cứ giữ phím nhấn thì giá trị sẽ được thực hiện liên tục sau những khoảng thời jan nhất định
          Nếu bác làm theo code của mình thì không cần kiểm tra nhả, bác có thể nhấn bao lâu tùy thích, chương trình chỉ biết 1 lầm phím nhấn.

          Cơ chế nhận của bàn phím máy tính khác với ở đây.

          Bác có thể test bằng protues thì biết.

          Comment


          • #6
            nếu muốn nó tác động mình có thể delay chứ kg cần chờ nhả, mà cũng kg bị dội

            Comment


            • #7
              okkk

              kg bị dội
              |

              Comment


              • #8
                Nguyên văn bởi tintintin Xem bài viết
                Ngoài cách trên ra có một cách chống dội đơn giản nhưng hiệu quả hơn như sau:

                Code:
                cur_key = <giá trị hiện tại của phím>;
                
                is_keypressed = (cur_key) & (!old_key);
                if (is_keypressed) 
                  {do anything...;}
                
                old_key = cur_key;
                Tham khảo:

                http://dientuvietnam.net/forums/showthread.php?t=19162

                Tốt nhất là tạo timer 1 ms . đọc cỡ 200 (tùy thuộc vào tốc độ lấy trạng thái của phím nhanh hay chậm.)
                code hơn dài sẽ post sau ( chờ tìm lại. ).

                Comment


                • #9
                  Mình có 1 cách đơn giản sử dụng count thay vì dùng delay,nhưng mình thà là code dài xúi mà chạy ổn định thi tốt hơn. Bạn nào có code chạy ổn định có thể post lên cho anh em tham khảo voi.

                  bit checkbutton ()
                  {
                  unsigned int i=0;
                  while (input==1)
                  {
                  i++;
                  if (i>=precount) {return(1);goto exit;}
                  else return(0);
                  }
                  i=0; return(0);
                  exit:{}
                  }

                  //precount là giá trị đặt trước giới hạn cho biến đếm count
                  //input là đầu vào. Nếu ấn nút thì là 1
                  //hàm checkbutton sẽ chỉ trả về giá trị 1 khi ấn nút thực sự.

                  Comment


                  • #10
                    code của mình là ok rùi, chạy từ đó đến jo vẫn ok, bao xài lun đó

                    Comment


                    • #11
                      mình có post lên code quét phím trên diễn đàn rồi. Các bạn tham khảo tại: http://dientuvietnam.net/forums/showthread.php?t=21148
                      Hy vọng sẽ giúp ích cho việc viết ứng dụng của các bạn

                      Comment


                      • #12
                        Các bạn cho mình hỏi là nếu mình vừa quét phím, vừa quét led có được không nhỉ?
                        Ví dụ mình quét led 7 đoạn và delay mỗi con led 7 đoạn là 20ms chẳng hạn => điều khiển 10 con led thì mất 200ms lận, như vậy nếu user bấm phím trong thời điểm "nhạy cảm" đó thì chương trình có phát hiện ko?
                        Ko lẽ phải viết sự kiện bắt phím ngay trong hàm delay hả mấy pro?

                        Comment


                        • #13
                          tấc cả điều có thể em ah.
                          Tư vấn thiết kế hệ thống điện-điện tử theo yêu cầu.
                          Tel: 0903 702 417. Email: web:

                          Comment


                          • #14
                            vậy phương pháp tổng quát là làm như thế nào hả các bác......

                            Comment


                            • #15
                              Ở mỗi lần phát xung thay vì delay bạn nên dùng time để tạo trễ thời gian và trong lúc đó mình quét kiểm tra và đọc dữ liệu bàn phím một lần. Nhứng nếu dùng cocde của anh Puji... thì bạn phải kéo dài thời gian phát xung quét leb lên 70ms là ít nhất, làm thêm các thao tác sử lý và hiển thị leb thì với 10 leb chu kỳ quét khoảng 1s để không bị nháy bạn phải quét có nhớ
                              Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                              Comment

                              Về tác giả

                              Collapse

                              bijusi@ Tìm hiểu thêm về bijusi@

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

                              Collapse

                              Đang tải...
                              X