Thông báo

Collapse
No announcement yet.

Giúp mình với! có ai hướng dẫn dùng vòng lặp vô hạn cho nút nhấn giúp mình !

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

  • Giúp mình với! có ai hướng dẫn dùng vòng lặp vô hạn cho nút nhấn giúp mình !

    BT của mình là khi C0==1 thì 8led đơn của portD sáng đuổi . C1==1 thì portD sáng dần . Mình viết như thế này nhưng nó chỉ chạy dc nút C0 thui mà cũng ko có lặp vô hạn nữa ! Ai hướng dẫn dùm mình với !
    #include <16f877.h>
    #fuses nowdt,put
    #use delay(clock=4000000)
    #byte portd=0x08
    #byte porta=0x05
    #bit a0=porta.0
    #bit a1=porta.1
    #bit a2=porta.2
    #bit a3=porta.3
    int16 i;
    int16 sangduoi[15]={128,64,32,16,8,4,2,1,2,4,8,16,32,64,128};
    int16 sangdan[8]={192,224,240,248,252,254,255,127};
    void main()
    {
    set_tris_a(0xff);
    set_tris_d(0x00);
    while(1)
    {
    if(a0==1)
    {
    for(i=0;i<15;i++)
    {
    portd=sangduoi[i];
    delay_ms(20);
    }
    }
    }
    if(a1==1)
    {
    for(i=0;i<8;i++)
    {
    portd=sangdan[i];
    delay_ms(20);
    }
    }
    }

  • #2
    Nguyên văn bởi thmmm Xem bài viết
    BT của mình là khi C0==1 thì 8led đơn của portD sáng đuổi . C1==1 thì portD sáng dần . Mình viết như thế này nhưng nó chỉ chạy dc nút C0 thui mà cũng ko có lặp vô hạn nữa ! Ai hướng dẫn dùm mình với !
    #include <16f877.h>
    #fuses nowdt,put
    #use delay(clock=4000000)
    #byte portd=0x08
    #byte porta=0x05
    #bit a0=porta.0
    #bit a1=porta.1
    #bit a2=porta.2
    #bit a3=porta.3
    int16 i;
    int16 sangduoi[15]={128,64,32,16,8,4,2,1,2,4,8,16,32,64,128};
    int16 sangdan[8]={192,224,240,248,252,254,255,127};
    void main()
    {
    set_tris_a(0xff);
    set_tris_d(0x00);
    while(1)
    {
    if(a0==1)
    {
    for(i=0;i<15;i++)
    {
    portd=sangduoi[i];
    delay_ms(20);
    }
    }
    }
    if(a1==1)
    {
    for(i=0;i<8;i++)
    {
    portd=sangdan[i];
    delay_ms(20);
    }
    }
    }
    Khi sử dụng đến button trong bài của bạn thì bạn nên chú ý đến việc chống rung phím và nên có đoạn chờ nhả phím thì hẵng cho out khỏi hàm phục vụ phím đó nếu bạn ko muốn bị ảnh hưởng đến quá trình sau.

    Comment


    • #3
      Chống rung là sao hả bạn ? Mà mình chỉ mún bấm xong rồi thả ra là giữ lun quá trình . Bấm nút thứ 2 là chuyển qua quá trình thứ 2 ngay ko phải chờ hết quá trình đầu . Tại mình chỉ quen code ASM thui , còn code C mình gà mờ quá . Mấy bạn chỉ rõ dùm mình . Có code mẫu càng tốt . Cám ơn các bạn . Hiện tại mình đã làm dc 4 nút nhấn rùi còn giữ quá trình và chuyển tiếp quá trình ngay lập tức thì chưa dc !
      #include <16f877a.h>
      #fuses nowdt,put
      #use delay(clock=4000000)
      #byte portd=0x08
      #byte porta=0x05
      #bit a0=porta.0
      #bit a1=porta.1
      #bit a2=porta.2
      #bit a3=porta.3
      int16 i;
      int16 sangduoi[16]={128,64,32,16,8,4,2,1,2,4,8,16,32,64,128,0};
      int16 sangdan[8]={192,224,240,248,252,254,255,0};
      int16 tatdan[9]={255,127,63,31,15,7,3,1,0};
      int16 vaora[8]={129,66,36,24,36,66,129,0};

      void main()
      {
      set_tris_a(0xff);
      set_tris_d(0x00);
      while(1)
      {
      if(a0==1)
      {
      for(i=0;i<16;i++)
      {
      portd=sangduoi[i];
      delay_ms(20);
      }
      }
      else if(a1==1)
      {
      for(i=0;i<8;i++)
      {
      portd=sangdan[i];
      delay_ms(20);
      }
      }
      else if(a2==1)
      {
      for(i=0;i<9;i++)
      {
      portd=tatdan[i];
      delay_ms(20);
      }
      }
      else if(a3==1)
      {
      for(i=0;i<9;i++)
      {
      portd=vaora[i];
      delay_ms(20);
      }}
      }}

      Comment


      • #4
        Mình nghĩ 1 phím 1 chức năng thì không cần chống dội đâu. Nhưng bạn phải cho 1 biến giữ trạng thái chứ.
        Cái câu lệnh "if (a0 == 1) thì làm gì gì đó" chưa hợp lý thì phải. Khi bạn bấm nút a0 nó mới bằng 1 và chạy nhưng bạn thả ra thì nó bằng 0 mất rồi.
        Mình thấy nên làm là
        if(a0 == 1) thì biến t = 1
        if (a1==1) thì biến t = 2
        rồi tiếp là
        if (t==1) thì làm gì đó
        if (t == 2) thì làm gì đó

        Comment


        • #5
          Do ta sử dụng phím vật lý nên có hiện tượng rung phím khi sử dụng. Còn rung phím nghĩa là khi bạn bấm nút thì nó sẽ ko chuyển mức ngay cho bạn (VD 1->0) mà sẽ bị tạo ra 1 loạt xung vuông vs chu kỳ ko xác định trong 1 khoảng time cỡ <10ms rồi tín hiệu ms ổn định và đối với quá trình nhả phím ( 0->1) cũng tương tự.VD như 1 đoạn CT if ( P1.1 == ) {CT con} dễ thấy khi CT con của bạn time hoạt động <10ms thì khi thực out khỏi hàm lệnh này có thể sẽ bị thực hiện 1 lần nữa do hiện tượng rung phím or nếu CT con có >10ms thì khi bạn nhả phím thì cũng bị hiện tượng tương tự và có thể đoạn code này sẽ bị tác động nhầm lần nữa.
          p/s.Quá trình bạn bấm 1 phím thì tối thiểu cũng vài trăm ms.vì thế có thể bạn chưa nhả phím ra CT phục vụ phím đó đã xong rồi và bạn biết chuyện j xảy ra tiếp theo rồi chứ? Vì vậy nếu bạn sử dụng phím theo kiểu bấm 1 phát thực hiện 1 phát thì nên có vc chống rung phím và chờ nhả phím.

          Comment


          • #6
            Mình đã làm biến giữ trạng thái như bạn hadinhdiep thì ok rồi . Đúng như bạn thuphuongbk nói . Mình cắm testboard chạy thử thì nhấn phím 1 hồi lâu chương trình sau mới dc thực hiện chứ ko phải thực hiện ngay lập tức . Cám ơn 2 bạn . Cái chống rung này nhìn mấy code mình search trên mạng thực sự ko hiểu nổi ! 2 bạn có code mẫu ko cho mình zới !
            void main()
            {
            set_tris_a(0xff);
            set_tris_d(0x00);
            while(1)
            {
            if(a0==1)
            {
            k=1;
            }
            else if(a1==1)
            {
            k=2;
            }
            else if(a2==1)
            {
            k=3;
            }
            else if(a3==1)
            {
            k=4;
            }
            if(k==1)
            {
            for(i=0;i<16;i++)
            {
            portd=sangduoi[i];
            delay_ms(20);
            }
            }
            else if(k==2)
            {
            for(i=0;i<8;i++)
            {
            portd=sangdan[i];
            delay_ms(20);
            }
            }
            else if(k==3)
            {
            for(i=0;i<9;i++)
            {
            portd=tatdan[i];
            delay_ms(20);
            }
            }
            else if(k==4)
            {
            for(i=0;i<9;i++)
            {
            portd=vaora[i];
            delay_ms(20);
            }}
            }}

            Comment


            • #7
              Nếu chống rung = phần mềm thì đơn giản là việc bạn tránh cái khoảng time mà nó bị "rung" ra bằng 1 hàm delay.và time rõ ràng chỉ cần >10ms là đc.
              p/s: khi thấy có sự thay đổi ở phím thì ta delay_ms ( 10 ) ; rồi kiểm tra lại.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X