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

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

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • hermex2009
    Thành viên chính thức
    • Nov 2009
    • 34

    #1

    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
  • robot_arm
    Thành viên chính thức
    • Dec 2011
    • 32

    #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

    • duong_act
      Thành viên tích cực
      • Nov 2008
      • 4903

      #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

      • kami90
        Thành viên tích cực
        • Aug 2010
        • 143

        #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

        • rptdnmqs
          Thành viên tích cực
          • Nov 2008
          • 440

          #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

          • hermex2009
            Thành viên chính thức
            • Nov 2009
            • 34

            #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

            • AKA_QUAN
              Thành viên chính thức
              • Jul 2011
              • 77

              #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

              • superhieu1
                Thành viên tích cực
                • Jul 2010
                • 1884

                #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

                • OoMrBayoO
                  Thành viên chính thức
                  • Jul 2011
                  • 88

                  #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

                  • thiennv0109
                    Thành viên tích cực
                    • Dec 2010
                    • 219

                    #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, 22: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

                    • thiennv0109
                      Thành viên tích cực
                      • Dec 2010
                      • 219

                      #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

                      • duong_act
                        Thành viên tích cực
                        • Nov 2008
                        • 4903

                        #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

                        • thiennv0109
                          Thành viên tích cực
                          • Dec 2010
                          • 219

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