Thông báo

Collapse
No announcement yet.

lấy sườn nút bấm trong Kiel-C

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

  • lấy sườn nút bấm trong Kiel-C

    mình đang làm 1 bài có yêu cầu như sau:
    có 2 nút bấm: tăng, giảm hiển thị số lên lcd
    ban đầu hiển thị số 0
    ấn tăng số hiển thị tăng lên 1 ấn giảm thì giảm đi 1.
    chương trình mình viết đã hiển thị được số nhưng mình gặp phải 1 vấn đề: do vòng quét phím rất nhanh nên khi mình ấn nút giá trị sẽ tăng ko phải là 1 mà là rất lớn. bây giờ mình muốn chỉ khi nào có sự thay đổi sườn xung ở nút bấm thì giá trị mới được thay đổi mà ko biết làm thế nào. mong các bác chỉ giáo

  • #2
    Thuật toán quét nút và chống nhiễu nút đơn giản làm thế này bạn nhé...
    - trường hợp 1: muốn tác động trong khi giữ nút
    nếu nút =0 ( được nhấn ) thì đợi một chút ( cỡ chục ms tùy nút ) lại nếu nút vẫn được nhấn thì làm gì thì làm ...
    code :
    if ( nut == 0 )
    {
    delay(abc);
    if ( nut == 0 ) { ha ha ha chính xác nút đang bị giữ ... muốn làm gì thì làm}
    }

    - trường hợp 2: muốn tác động trong khi nhả nút
    nếu nút =0 ( được nhấn ) thì đợi một chút ( cỡ vài ms tùy nút ) lại nếu nút vẫn được nhấn thì đợi khi nào nhả nút ( nut = 1 ) ta tiến hành công việc ví dụ x = x + 1
    code:
    if ( nut == 0 )
    {
    delay_ms(5);
    if ( nut == 0 )
    {
    delay_ms(1);
    while(nut == 0);
    x = x+1;
    }
    }

    - trường hợp 3: sử dụng truyền biến phối hợp với chương trình chính quét nút liên tục ... để bài viết tới mình viết tiếp sau nhé giờ muộn quá rùi.

    Comment


    • #3
      Dùng 1 biến tạm thời lưu giữ trạng thái nút bấm trong quá khứ. So sánh trạng thái này với trạng thái hiện tại sẽ phát hiện được sườn xung cho dù vòng quét rất nhanh kể cả khi trong vòng quét không có delay.
      Code:
      unsigned char temp=0;
      while(1)           // chương trình chính.
      {
      if(temp==0&&PIN==1) 
      {
      // Nút đã được nhấn.....
      // Làm gì đó ở đây...
      }
      temp=PIN; // lưu trạng thái 
      // Các chương trình tiếp theo.
      }

      Comment


      • #4
        Cái này là thuật toán chống rung trong bàn phím:
        -Đầu tiên:Kiểm tra tình trạng hiện tại của nút bấm(Bấm hay chưa)?
        -TRễ 1 khoảng thời gian
        -KIểm tra lại tình trạng nút bấm.Nếu nó vẫn đựợc bấm thì đúng là cái nút đó đã được bấm.Bạn làm gi thì làm
        myPage:

        Comment


        • #5
          Chống rung chỉ cần hỏi từ 0-1-0 thế đó.Cứ 10ms quét 1 lần.Kô nên quét liên tục.Nó ra cả tràng.
          , , ,

          Comment


          • #6
            cảm ơn các bác đã quan tâm giúp đỡ. hiện em đã mô phỏng cho chạy ok. đang cắm thử mạch thật nếu còn vấn đề gì mong các bác giúp đỡ em tiếp

            Comment


            • #7
              CÒn có một cách nữa người ta hay dùng là như sau !
              if (nut==0)
              {
              while (nut==0) {} //đợi cho đến khi nhả nút ra mới thực hiện công việc
              //Phần công việc nếu nút được nhấn
              ...
              ...
              }

              Comment


              • #8
                cách của bạn aka _quan cũng đc, nhưng phải có tụ chống nhiêu cơ khí, mún chắc ăn thì thuật toán phải ntn

                //nut=1 : nhấn
                //nut=0 : thả
                ///lấy cạnh lên
                nếu nut=1;
                chờ;
                nếu nút tiếp tục bằng 1;
                đúng{==>thực hiện;};
                else{quay lại chờ nut=1};



                //lấy cạnh xuống
                nếu nut=1;
                chờ;
                nếu nút tiếp tục bằng 1;
                chờ đến khi nút =0;
                chờ tiếp nếu nút tiếp tục bằng =0;
                đúng
                {==>thực hiện};
                else
                {nhảy lại từ đầu, chờ nut=1}

                cách này tránh tốt tình trạng nhiễu cơ khí
                TamPhieuLuuKy@yahoo.com
                092 2838 712 --->>

                Comment


                • #9
                  Mình có ý kiến thế này: Mỗi người có thể kết nối nút bấm khác nhau để lấy sườn âm hay sườn dương, nhưng để biết được nút được bấm hay chưa chì cần đọc trạng thái thay đổi của nó là đủ. Ex code:
                  delay_ms(15);
                  if(!sw)
                  {
                  //lệnh thực thi
                  }
                  while(!sw);
                  delay_ms(15);

                  Comment


                  • #10
                    bit StatusPhim; // '0': trạng thái phím đã nhả (không được nhấn);'1' trạng thái phím đang được nhấn (chưa nhả)

                    if(phim)// phim đã nhả
                    {
                    StatusPhim=0;
                    }

                    if(phim==0&StatusPhim==0) // nếu phím được nhấn đồng thời kiểm tra trạng thái nhấn của lần trước đó đã nhả chưa, nếu thỏa mãn thì thực hiện
                    {
                    StatusPhim=1; // bật trang thái báo phím đang nhấn
                    // thực hiện công việc ở đây???

                    }


                    p/s: nhấn thỏa mãi cũng không sao, nhấn xong mới thực hiện công việc: đếm tăng giá trị,... có thể không cần tạo trễ =>tiết kiệm thời gian cho vđk trong khi có ct khác dùng ngắt đòi hỏi thời gian thực hiện ngắt rất nhanh. Đã test OK
                    Last edited by thiennv0109; 21-12-2011, 23:31.
                    Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                    Gmail: -Mobile: 0989.194.472

                    Comment


                    • #11
                      Cách trên nên nối kiểu phím của nút reset, thường thì ở mức '1' còn khi nhấn, phím được kéo xuống mass
                      Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                      Gmail: -Mobile: 0989.194.472

                      Comment


                      • #12
                        Với biến tạm thời thì xuống mass hay lên Vcc đều như nhau. Không cần delay khi quét, muốn quét tốc độ cao nhất có thể cũng được. Dù giữ nút 1000s vẫn không ra cả tràng bởi vì đây là lấy sườn chứ không phải lấy mức. Nó chỉ có tác dụng khi có sự thay đổi 0>1 hoặc 1>0. Có thể thực hiện công việc ngay khi nhấn nút. Khi giữ nút mà không nhả thì chương trình vẫn hoạt động bình thường.

                        Comment


                        • #13
                          @duong_act: chuẩn bác.
                          Do mục dích của người sử dụng mà viết kiểu nhấn , biến sẽ thay đổi như thế nào thôi.
                          Thường các nút nhấn để chỉnh giá trị người ta hay làm theo kiểu: khi nhấn thì một biến nào đó thay đổi, nếu nhấn và giữ phím trong khoảng thời gian nào đó, giả sử trong 5s mà vẫn nhấn nó sẽ tiếp tục thực hiện thay đổi biến. với cách này để tránh ảnh hưởng đến các cv khác thì dùng thêm time là giải quyết được.
                          Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                          Gmail: -Mobile: 0989.194.472

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X