Thông báo

Collapse
No announcement yet.

[help] led matrix 8x8

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

  • [help] led matrix 8x8

    tình hình là thế này ạ:
    em có qua bên tutorial led matrix của bác nghaiha xem và làm tuy nhiên mạch của em chỉ gồm 1 matrix 8x8, 2 con 74hc595(để đưa data vào Red và Green) và 1 con 74hc138 để quét hàng.Và VĐK em dùng atmega8.
    về hiệu ứng thì em đã làm được từ trên xuống dưới từ dưới lên trên.
    như tuorial của bác nghaiha.

    về cách thức để hiệu ứng dịch trái hay dịch phải em hiểu nhưng ko biết code( dịch bit mỗi hàng lần lượt 1 bit của chữ này thì 1 bit của chữ sau chiếm chỗ)

    và nhiều hiệu ứng như thế này thì làm thế nào ạ??http://www.youtube.com/watch?v=LTP0YCMr0X8

    híc mong các cao thủ chỉ bảo..
    Last edited by soulasylum; 26-01-2010, 09:52.

  • #2
    híc không có bác nào rúp đỡ ah

    Comment


    • #3
      Để dịch trái hay phải theo phương pháp quét hàng thì bạn có thể làm theo 2 cách:
      + Nếu bạn dùng Hadware SPI thì thực hiện dịch Bit trước khi xuất dữ liệu vì SPI chỉ hỗ trợ xuất từng Byte.
      + Nếu bạn dùng Software SPI thì có thể "ăn gian" thay vì dịch Bit thì mình "chèn" N xung trước hoặc sau khi xuất dữ liệu, khi đó 74HC595 sẽ tự dịch chuỗi đi N Bit trái hoặc phải theo ý của bạn.
      Bạn phải có giải thuật tạo hiệu ứng, code nó thành 1 đoạn code tách biệt, rồi tạo 1 kịch bản lần lượt play từng hiệu ứng theo kịch bản.

      Regards

      Email:
      Phone: 0905.034.086

      Comment


      • #4
        Nguyên văn bởi cskiller Xem bài viết
        Để dịch trái hay phải theo phương pháp quét hàng thì bạn có thể làm theo 2 cách:
        + Nếu bạn dùng Hadware SPI thì thực hiện dịch Bit trước khi xuất dữ liệu vì SPI chỉ hỗ trợ xuất từng Byte.
        + Nếu bạn dùng Software SPI thì có thể "ăn gian" thay vì dịch Bit thì mình "chèn" N xung trước hoặc sau khi xuất dữ liệu, khi đó 74HC595 sẽ tự dịch chuỗi đi N Bit trái hoặc phải theo ý của bạn.
        Bạn phải có giải thuật tạo hiệu ứng, code nó thành 1 đoạn code tách biệt, rồi tạo 1 kịch bản lần lượt play từng hiệu ứng theo kịch bản.

        Regards
        em dùng hadware SPI
        bác có thể cho em xin code một ví dụ nhỏ được không?

        Comment


        • #5
          Code:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.04.5b Evaluation
          Automatic Program Generator
          © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : 
          Version : 
          Date    : 27-Jan-2010
          Author  : Freeware, for evaluation and non-commercial use only
          Company : 
          Comments: 
          
          
          Chip type               : ATmega8
          Program type            : Application
          AVR Core Clock frequency: 12.000000 MHz
          Memory model            : Small
          External RAM size       : 0
          Data Stack size         : 256
          *****************************************************/
          
          #include <mega8.h>
          // SPI functions
          #include <spi.h>
          #include <delay.h>
          
          #define DATA    PORTB.3
          #define CLK     PORTB.5
          #define LATCH   PORTB.2
          
          unsigned char i=0;
          unsigned char m,j;
          unsigned char flash BIEN[]={0x0F,0x0F,0x0F,0x0F,0xF0,0xF0,0xF0,0xF0};
          unsigned char MAN_HINH[7];
          
          void latch()
          {
              LATCH = 0;
              LATCH = 1;
          }
          
          // Timer 0 overflow interrupt service routine
          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
          {
          // Reinitialize Timer 0 value
          TCNT0=0xA1;
          // Place your code here
          PORTC = i+8;
          spi(MAN_HINH[i]);
          latch();
          i++;
          if(i==8) i=0;
          }
          
          void dichtrai()
          {
              for (j=0;j<=7;j++)
              {
                  for (m=0;m<=7;m++)
                  {
                      MAN_HINH[m] = MAN_HINH[m]<<j;
                      MAN_HINH[m] = BIEN[m];  
                  }
                  delay_ms(500);
              }
          }
          // Declare your global variables here
          
          void main(void)
          {
          // Declare your local variables here
          
          // Input/Output Ports initialization
          // Port B initialization
          // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
          // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
          PORTB=0x00;
          DDRB=0xFF;
          
          // Port C initialization
          // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
          // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
          PORTC=0x00;
          DDRC=0x7F;
          
          // Port D initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTD=0x00;
          DDRD=0x00;
          
          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: 46.875 kHz
          TCCR0=0x04;
          TCNT0=0xA1;
          
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: Timer1 Stopped
          // Mode: Normal top=FFFFh
          // OC1A output: Discon.
          // OC1B output: Discon.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer1 Overflow Interrupt: Off
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=0x00;
          TCCR1B=0x00;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;
          
          // Timer/Counter 2 initialization
          // Clock source: System Clock
          // Clock value: Timer2 Stopped
          // Mode: Normal top=FFh
          // OC2 output: Disconnected
          ASSR=0x00;
          TCCR2=0x00;
          TCNT2=0x00;
          OCR2=0x00;
          
          // External Interrupt(s) initialization
          // INT0: Off
          // INT1: Off
          MCUCR=0x00;
          
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x01;
          
          // Analog Comparator initialization
          // Analog Comparator: Off
          // Analog Comparator Input Capture by Timer/Counter 1: Off
          ACSR=0x80;
          SFIOR=0x00;
          
          // SPI initialization
          // SPI Type: Master
          // SPI Clock Rate: 3000.000 kHz
          // SPI Clock Phase: Cycle Half
          // SPI Clock Polarity: Low
          // SPI Data Order: MSB First
          SPCR=0x54;
          SPSR=0x00;
          
          // Global enable interrupts
          #asm("sei")
          LATCH = 1;
          for (m=0;m<=7;m++)
          {
              MAN_HINH[m] = BIEN[m];
          }
          
          while (1)
                {
                // Place your code here
                dichtrai();
                };
          }
          các bác xem hộ em.

          1. tại sao khi mô phỏng bằng proteus nó lại sai lệch về data.
          2.hiệu ứng dịch trái của em sai ở đâu?
          Attached Files
          Last edited by soulasylum; 27-01-2010, 22:54.

          Comment


          • #6
            Thực ra nếu mạch của bạn chỉ có 1 led 8x8 thì không cần phải dùng IC dịch HC595 và IC giải mã 74LS138 vì làm như vậy bạn sẽ khó điều khiển hơn so với việc nối trực tiếp vào các cổng của VDK qua điện trở hạn dòng. làm như vậy bạn sẽ linh hoạt hơn trong việc điều khiển các hiệu ứng hiển thị. chúc may mắn !

            Comment


            • #7
              Mình thấy vuson nói đúng đấy
              Dùng con 89c51 là được

              Comment


              • #8
                đây là em chỉ mô phỏng thui còn thực tế em muốn điều khiển cả thêm màu xanh của led nữa.
                với lại nó là 1 module nên em tiết kiệm chân

                em có sửa lại hàm dichtrai() như sau:

                void dichtrai()
                {
                for (j=0;j<=7;j++)
                {
                for (m=0;m<=7;m++)
                {
                MAN_HINH[m] = MAN_HINH[m]<<j;
                }
                delay_ms(500);
                }
                }

                thì thấy nó có dịch nhưng hình như một phát nó dịch lên tận 2 bit nên màn hình của em không được mịn.
                híc em cũng chưa nghĩ ra voi nhiều chữ chạy liền nhau thì thế nào.hic

                Comment


                • #9
                  hình như mình thấy thời gian delay của bạn hơi lớn đó. thường thì mình chỉ delay khoảng 1ms thôi. và để không bị nhiễu thì sau mỗi lần hiển thị một ký tự xong ta nên tắt hiển thị đi rồi mới hiển thị ký tự tiếp theo như ví dụ mà tớ viết dưới đây.
                  P2=cot[n];
                  if((m+n)>31)
                  {
                  P1=ktu[m+n-32];
                  delay(10);
                  P1=0x00; // xoa du lieu o hang
                  P2=0x00; // xoa du lieu o cot
                  }

                  Comment


                  • #10
                    Nguyên văn bởi vu son Xem bài viết
                    hình như mình thấy thời gian delay của bạn hơi lớn đó. thường thì mình chỉ delay khoảng 1ms thôi. và để không bị nhiễu thì sau mỗi lần hiển thị một ký tự xong ta nên tắt hiển thị đi rồi mới hiển thị ký tự tiếp theo như ví dụ mà tớ viết dưới đây.
                    P2=cot[n];
                    if((m+n)>31)
                    {
                    P1=ktu[m+n-32];
                    delay(10);
                    P1=0x00; // xoa du lieu o hang
                    P2=0x00; // xoa du lieu o cot
                    }
                    nếu để delay là 1ms thì sẽ không nhìn thấy gì.
                    vi em nghĩ đây là hiệu ứng.

                    Comment


                    • #11
                      đúng là nếu delay nhỏ thì ko nhìn thấy gì. nhưng ở đây bù lại là mình lặp đi lặp lại cái hiển thị đó nhiều lần bằng vòng lặp for như sau :

                      for(m=0; m<64 ; m++)// Dich hien thi
                      {
                      for(lap=0; lap<12; lap ++) // Lap hien thi
                      {
                      for(n=0; n<32; n++) // Quet cot
                      {
                      P2=cot[n];
                      if((m+n)>31)
                      {
                      P1=ktu[m+n-32];
                      delay(10);
                      P1=0x00; // xoa du lieu o hang
                      P2=0x00; // xoa du lieu o cot
                      }

                      Mình ko làm về AVR đây là code mình viết cho 89C51 bạn có thể tham khảo xem.

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X