Thông báo

Collapse
No announcement yet.

Cần ACE giúp đỡ về ic 74hc595

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

  • Cần ACE giúp đỡ về ic 74hc595

    Tình hình là mình đã đọc vài bài viết trên diễn đàn về con ic 74hc595 nhưng vẫn chưa hình dung được hết cách truyền dữ liệu 2 byte trở lên vào con này thế nào.Ví dụ như mình muốn điều khiển 2 led matrix 8x8 dùng 2 con 74hc595 đưa dữ liệu từ 89c51 hiển thị ra led ma trận.Ở đây mình muốn hiển thị 2 chử A và B chạy ngang .Mong các anh chị diễn đàn giúp đỡ về code và giải thuật thế nào.Mình đang học code c nên chỉ biết code C và chưa tìm hiểu về timer và ngắt nên chỉ dùng được hàm delay ^^.

  • #2
    Vào mà đọc nguyên lý của 595
    IC ghi dịch 74HC595
    Matrix có số cột lớn người ta sẽ quét hàng để đảm bảo độ sáng của led lớn hơn 50%

    Comment


    • #3
      Nguyên văn bởi chung1608 Xem bài viết
      Vào mà đọc nguyên lý của 595
      IC ghi dịch 74HC595
      Matrix có số cột lớn người ta sẽ quét hàng để đảm bảo độ sáng của led lớn hơn 50%
      Cảm ơn anh chung nha nhưng thực sự mình chỉ biết cách đưa dữ liệu 1 byte vào đó thôi còn 2 byte thì chưa biết cách làm sao để chốt để có thể đưa tiếp byte tiếp theo.Anh có thể viết 1 ví dụ bằng code c về cách dịch 2 byte không ?.Cám ơn anh nhiều ^^.

      Comment


      • #4
        Nguyên văn bởi phanthienvu Xem bài viết
        Cảm ơn anh chung nha nhưng thực sự mình chỉ biết cách đưa dữ liệu 1 byte vào đó thôi còn 2 byte thì chưa biết cách làm sao để chốt để có thể đưa tiếp byte tiếp theo.Anh có thể viết 1 ví dụ bằng code c về cách dịch 2 byte không ?.Cám ơn anh nhiều ^^.
        khi kết nối nhiều 595, ta quang tâm số lượng cổng ra cảu tất cả 595. Ví dụ: nếu bạn kết nối 2 con 595 ta sẽ dịch 16 bit ra cho 595.
        Code:
        for(i=0;i<16;i++){
        DATAS=cái gì đó;
        CLOCK=0;
        CLOCK=1;
        }
        LATCH=0;
        LACTH=1;
        4 con 595 thì i<32 cứ như thế. Mỗi lần dịch nó sẽ tràn đẩy hết giá trị của lần dịch trước nên ko cần xóa trước khi dịch

        Comment


        • #5
          Nguyên văn bởi chung1608 Xem bài viết
          khi kết nối nhiều 595, ta quang tâm số lượng cổng ra cảu tất cả 595. Ví dụ: nếu bạn kết nối 2 con 595 ta sẽ dịch 16 bit ra cho 595.
          Code:
          for(i=0;i<16;i++){
          DATAS=cái gì đó;
          CLOCK=0;
          CLOCK=1;
          }
          LATCH=0;
          LACTH=1;
          4 con 595 thì i<32 cứ như thế. Mỗi lần dịch nó sẽ tràn đẩy hết giá trị của lần dịch trước nên ko cần xóa trước khi dịch
          HI.Cuối cùng thì mình cũng hình dung ra được.Không ngờ nó đơn giản vậy.Mình có code này mong anh Chung xem nhé.
          #include"regx52.h"
          sbit DATA = P2^1;
          sbit SCK = P2^0;
          sbit SCL = P2^2;
          void quet(unsigned char x)
          {int i,temp;
          for(i=0;i<8;i++)
          {temp=x;//gan bien
          temp=temp&0x80;//lay ra bit dau tien (bit 7)
          if(temp==0x80)//so sanh bit
          DATA=1; //bang 1 thi xuat vao chip =1
          else
          DATA=0; //nguoc lai bang 0
          x*=2; //dich bit lay bit trong so thap
          SCK=0; //tao xung tren chan 11
          SCK=1; //1 xung dua vào 1 bít
          }SCL=0; //xuat du lieu ra output
          SCL=1;}
          Như vậy để có thể xuất 16 bit thì mình sẽ đổi số 8 bằng số 16 và 0x80 bằng 0x8000 phải không anh?

          Comment


          • #6
            Nguyên văn bởi phanthienvu Xem bài viết
            HI.Cuối cùng thì mình cũng hình dung ra được.Không ngờ nó đơn giản vậy.Mình có code này mong anh Chung xem nhé.
            #include"regx52.h"
            sbit DATA = P2^1;
            sbit SCK = P2^0;
            sbit SCL = P2^2;
            void quet(unsigned char x)
            {int i,temp;
            for(i=0;i<8;i++)
            {temp=x;//gan bien
            temp=temp&0x80;//lay ra bit dau tien (bit 7)
            if(temp==0x80)//so sanh bit
            DATA=1; //bang 1 thi xuat vao chip =1
            else
            DATA=0; //nguoc lai bang 0
            x*=2; //dich bit lay bit trong so thap
            SCK=0; //tao xung tren chan 11
            SCK=1; //1 xung dua vào 1 bít
            }SCL=0; //xuat du lieu ra output
            SCL=1;}
            Như vậy để có thể xuất 16 bit thì mình sẽ đổi số 8 bằng số 16 và 0x80 bằng 0x8000 phải không anh?
            led ma trận nếu từ 8x16 trở lên bạn nên quét hàng vì nếu quét cột số cột nhiều thì thời gian tích cực của 1 cột quá ngắn ko thể làm led sáng thậm chí là có thể led sẽ ko sáng.
            - Để quét hàng thì bạn sử dụng 1 phần mềm dịch mã ma trận và dịch ra 1 bảng tra theo cột.
            - Tiếp theo, ví dụ bạn có 16 cột, bạn sẽ nạp vào 1 vùng RAM 16 giá trị của bảng mã. Khi dịch, bạn dịch 16 bit ra cho 595 với các bit theo vị trí theo hàng. Ví dụ bảng 16 giá trị thì bạn dịch hết bit đầu tiên của 16 giá trị vào hàng 1, rồi bạn dịch bit thứ 2 của 16 giá trị vào hàng 2 cứ thế cho cả 8 bit.
            Bạn có thể xem ví dụ dưới mình viết cho ATmega 8x40
            Code:
            #include "tableMT.c"
            sfr io unsigned short ROW absolute 0x38; //PORTB
            sbit SH at PORTC0_bit;
            sbit DS at PORTC1_bit;
            sbit EO at PORTC2_bit;
            const int lens=400;
            char m;
            unsigned int start_addr;
            char tempR[100] absolute 500;
            void shift595();
            void copy_to_ram();
            void main() {
            DDRC=0b00010111;
            PORTC=0xFF;
            DDRB=0xFF;
            ROW=0xFF;
            delay_ms(500);
            while(1){
                     start_addr=0;
                                    while(start_addr<lens){
                                                      for(m=0;m<2;m++){
                                                      copy_to_ram();
                                                      shift595();
                                                      }
                                    start_addr++;
                                    }
            }
            }
            void shift595(){char i,j;
            SH=0;EO=0;
            j=0x80;
                  while(j!=0){
                  for(i=0;i<40;i++){
                                  DS=tempR[i];
                                  SH=1;
                                  SH=0;
                                  tempR[i]=tempR[i]>>1;
                  }
                  EO=1;EO=0;
                  ROW=j;
                  j=j>>1;
                  delay_ms(2);
                  ROW=0;
                  }
            }
            void copy_to_ram(){short i;unsigned int L;
                 L=start_addr;
                 for(i=0;i<40;i++)
                 tempR[i]=table[L++];
            }
            Attached Files

            Comment


            • #7
              A oi! Cho e hoi,khi khong delay o giua xung CK va chot thi khi test thi mach k chay ha anh.
              Em viet code chuyen song song ra noi tiep mo phong thi chay nhung test mach thi khong chay.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X