Thông báo

Collapse
No announcement yet.

[help!!!] giúp em về hiển thị từ 00-99 trên led 7 đoạn

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

  • [help!!!] giúp em về hiển thị từ 00-99 trên led 7 đoạn

    Tình hình là em mới tập tành về PIC. Em muốn hiển thị từ 00-99 trên LED 7 đọan tăng dần. Cứ cách 1s tăng 1 số. Code đây ạ:
    #include <16f877a.h>
    #use delay(clock=20000000)
    unsigned int8 so[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10 011001,0b10010010,0b10000010,0b11111000,0b10000000 ,0b10010000};
    void bat_led1()
    {
    output_c(0b00000001);
    }
    void bat_led2()
    {
    output_c(0b000000010);
    }
    void hienthi(unsigned int16 x)
    {
    unsigned int8 chuc=x/10;
    unsigned int8 donvi=x%10;
    bat_led1();
    output_b(so[chuc]);
    delay_ms(5);
    bat_led2();
    output_b(so[donvi]);
    delay_ms(5);
    }
    void main()
    {
    while(true)
    {
    unsigned int16 i;
    for(i=00;i<100;i++)
    {
    hienthi(i);
    delay_ms(1000);
    }
    }
    }

    Khổ là nếu giữ nguyên code như vậy thì mạch mô phỏng vẫn chạy, nhưng LED1 chỉ nhấp nháy(theo code là 5ms) và LED2 thì sáng đến tận 1s. . Cứ như vậy. Em đã cho vòng lặp while() ở trong phần hienthi() nhưng nếu như vậy thì mạch mô phỏng chỉ hiện lên số 00. . Vậy có cách nào khắc phục không ạ? Anh nào chỉ em với

  • #2
    Nguyên văn bởi nguyennha15 Xem bài viết
    Tình hình là em mới tập tành về PIC. Em muốn hiển thị từ 00-99 trên LED 7 đọan tăng dần. Cứ cách 1s tăng 1 số. Code đây ạ:
    #include <16f877a.h>
    #use delay(clock=20000000)
    unsigned int8 so[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10 011001,0b10010010,0b10000010,0b11111000,0b10000000 ,0b10010000};
    void bat_led1()
    {
    output_c(0b00000001);
    }
    void bat_led2()
    {
    output_c(0b000000010);
    }
    void hienthi(unsigned int16 x)
    {
    unsigned int8 chuc=x/10;
    unsigned int8 donvi=x%10;
    bat_led1();
    output_b(so[chuc]);
    delay_ms(5);
    bat_led2();
    output_b(so[donvi]);
    delay_ms(5);
    }
    void main()
    {
    while(true)
    {
    unsigned int16 i;
    for(i=00;i<100;i++)
    {
    hienthi(i);
    delay_ms(1000);
    }
    }
    }

    Khổ là nếu giữ nguyên code như vậy thì mạch mô phỏng vẫn chạy, nhưng LED1 chỉ nhấp nháy(theo code là 5ms) và LED2 thì sáng đến tận 1s. . Cứ như vậy. Em đã cho vòng lặp while() ở trong phần hienthi() nhưng nếu như vậy thì mạch mô phỏng chỉ hiện lên số 00. . Vậy có cách nào khắc phục không ạ? Anh nào chỉ em với
    mình lập trình ccs cho con pic16f877a, bạn tham khảo nha
    test.zip
    hoangduc2304

    01884653780

    Comment


    • #3
      Nguyên văn bởi nguyennha15 Xem bài viết
      Tình hình là em mới tập tành về PIC. Em muốn hiển thị từ 00-99 trên LED 7 đọan tăng dần. Cứ cách 1s tăng 1 số. Code đây ạ:
      #include <16f877a.h>
      #use delay(clock=20000000)
      unsigned int8 so[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10 011001,0b10010010,0b10000010,0b11111000,0b10000000 ,0b10010000};
      void bat_led1()
      {
      output_c(0b00000001);
      }
      void bat_led2()
      {
      output_c(0b000000010);
      }
      void hienthi(unsigned int16 x)
      {
      unsigned int8 chuc=x/10;
      unsigned int8 donvi=x%10;
      bat_led1();
      output_b(so[chuc]);
      delay_ms(5);
      bat_led2();
      output_b(so[donvi]);
      delay_ms(5);
      }
      void main()
      {
      while(true)
      {
      unsigned int16 i;
      for(i=00;i<100;i++)
      {
      hienthi(i);
      delay_ms(1000);
      }
      }
      }

      Khổ là nếu giữ nguyên code như vậy thì mạch mô phỏng vẫn chạy, nhưng LED1 chỉ nhấp nháy(theo code là 5ms) và LED2 thì sáng đến tận 1s. . Cứ như vậy. Em đã cho vòng lặp while() ở trong phần hienthi() nhưng nếu như vậy thì mạch mô phỏng chỉ hiện lên số 00. . Vậy có cách nào khắc phục không ạ? Anh nào chỉ em với
      mình hướng dãn bạn giải thuật như thé nàyd nha.
      nếu bạn không cần thời gian thật chính xác thì bạn dùng vòng lắp for. bạn làm sao tính toán số vòng lặp đó nó bằng 1s rồi nó thực hiện xong Và thoát khỏi vòng lặp rồi nó thực hiện phép tính cộng or trừ rồi bạn lại tiếp tục thực hiện vòng lặp for đó,
      nếu bạn muón cho nó thật chính xác thì bạn dùng ngắt TM1 vả thạch anh 32,768kHz, phần hiển thị bạn cho nó thực hiện trong vòng lặp while, còn phàn tăng thì bạn để trong phần ngắt, khi nó đủ 1 s nó sẽ tự động tăng lên.




      facebook:

      Comment


      • #4
        tks bạn datinhlakho2. Nhưng khi chạy mô phỏng, không hiểu sao 2 led 7 đoạn vẫn còn hiện tượng nhấp nháy. Bạn còn cách nào khắc phục hiện tượng đó k?

        Comment


        • #5
          tks bạn thsang auto. Nhưng bạn có thể giải thích rõ hơn được k? Mình muốn tổng hợp ý kiến

          Comment


          • #6
            Hi,
            Cái này bác dùng 1 timer 8 bít là đủ. Chương trình ngắt timer sẽ có hai nhiệm vụ: 1> Tăng biến đếm cnt từ 0-99 sau mỗi 1s, 2> Quét 2 led 7 đoạn vs tần số >24HZ. Thực tế tôi làm thấy tần số quét led vào khoảng 60-100Hz là đẹp. Còn chương trình chính thì điều khiển các port dữ liệu và điều khiển thôi
            Thân

            Comment


            • #7
              Nguyên văn bởi nguyennha15 Xem bài viết
              tks bạn datinhlakho2. Nhưng khi chạy mô phỏng, không hiểu sao 2 led 7 đoạn vẫn còn hiện tượng nhấp nháy. Bạn còn cách nào khắc phục hiện tượng đó k?
              do chương trình mô phỏng thôi bạn ơi. mình wet led với tần số 50Hz (bằng tần số điện lưới 2 pha) nên khi bạn làm trên mạch thật thì đảm bảo sẽ không có hiện tượng giật đâu bạn. mình làm rồi, rất OK
              hoangduc2304

              01884653780

              Comment


              • #8
                tks các bác để xem... chắc là được hehe

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X