Thông báo

Collapse
No announcement yet.

Tutorial: Led ma trận bằng hình ảnh (completed)

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • lethanhhai86
    replied
    Nguyên văn bởi nghaiha Xem bài viết
    Ta sẽ sử dụng 8 transitor B564, nối các chân C của 8 transitor này với các chân H1-H8, chân E nối lên dương nguồn 5V, chân B là chân điều khiển. Khi chân B ở mức 1, transitor B562 không dẫn, H1 không có dương nguồn. Khi B được kéo xuống mức 0, transitor B562 sẽ dẫn, lúc đó H1 sẽ được nối với nguồn 5V.

    Ta có 8 chân cần cấp nguồn lần lượt H1 – H8 tức là có 8 chân nối với các chân B (qua điện trở 1k) của transitor B562 CH1-CH8. Ta có thể nối thẳng các chân điều khiển này vào vi xử lý (ở đây em sẽ dùng con có sẵn là ATMEGA8518). Nhưng như vậy thì phí chân MCU quá, để chân MCU còn làm việc khác khi mở rộng mạch sau này. Do đó em em sẽ nối các chân CH1 - CH8 với con 74HC138. Qua con IC giải mã 3 ra 8 này em chỉ tốn 4 chân, 3 chân điều khiển tín hiệu A, B, C và một chân điều khiển tín hiệu cho phép cho nó. Nguyên lý làm việc của con này bác nào chưa hiểu thì xem thêm datasheet nhé.
    Rồi cắm 8 chú B562 này vào breadboard, mỗi chú có thêm 2 em điện trở đi kèm. Em bám vào chân B 1k, còn em lên dương nguồn thì 10k. Cắm cũng chẳng lâu đâu, xíu xiu thôi mà:

    Cả chú 74HC138 luôn, nhưng hết chỗ cho chú rồi, cho chú sang board khác vậy

    Chú em phụ cắm led cho em vừa cắm vừa tủm tỉm cười nè

    Và dưới đây là schematic của tutorial này nhé:
    (em đang không vào được mạng qua đường chính thống, phải đi qua proxy nên không xài chức năng upload file của diễn đàn được, các bác chịu khó down rapidshare)
    http://rapidshare.com/files/133103844/Orcad.rar
    cái file đính kèm orcad bị lỗi rùi anh ạ. trên diễn dàn có anh nào vẽ lại rồi post lên cho em với. em đang cần gấp các pác ạ

    Leave a comment:


  • leemjnhwuong
    replied
    em đã làm bảng led với bài lập trình này .chạy chữ rất ok!không xảy ra tình trạng bóng mờ hay mất xung gì cả.

    Leave a comment:


  • leemjnhwuong
    replied
    hix!! bài lập trình của bác phamngoc lằng nhằng quá!!
    em có cách viết như thế này không cần dùng SPI luôn. các bác xem thử và đóng góp ý kiến

    /************************************************** ***
    LEDMATRIX 16X48

    Chip type : ATmega32
    Program type : Application
    Clock frequency : 11.059200 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 512
    ************************************************** ***/

    #include <mega32.h>
    #include <delay.h>

    /************************************************** ***/
    #define SCK PORTB.0
    #define DATA PORTB.1
    #define SCL PORTB.2

    /************************************************** ***/
    #define A PORTA.0
    #define B PORTA.1
    #define C PORTA.2
    #define OE PORTA.3

    /************************************************** ***/
    unsigned char i,j;
    unsigned char m=0,n;
    unsigned char k;
    bit tmp;

    /************************************************** ***/
    unsigned char Led[16][12]={
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 56, 224, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 198, 24, 3, 0, 0, 0, 0, 0, 0,
    0, 199, 1, 1, 5, 4, 128, 225, 129, 227, 191, 79,
    224, 56, 2, 1, 2, 4, 192, 57, 226, 228, 63, 71,
    16, 69, 4, 1, 0, 4, 224, 25, 114, 40, 39, 71,
    8, 130, 4, 1, 0, 4, 208, 25, 115, 0, 7, 71,
    8, 128, 4, 2, 0, 2, 200, 225, 112, 0, 7, 71,
    8, 128, 2, 4, 0, 1, 252, 27, 115, 0, 7, 71,
    16, 64, 1, 8, 128, 0, 192, 25, 114, 0, 7, 71,
    32, 160, 0, 16, 64, 0, 192, 25, 98, 8, 7, 71,
    64, 80, 0, 32, 32, 0, 224, 243, 225, 4, 7, 71,
    128, 40, 0, 64, 16, 0, 0, 0, 192, 131, 15, 62,
    0, 21, 0, 128, 8, 0, 0, 0, 0, 0, 0, 0,
    0, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
    };

    /************************************************** ***/
    void xuatdata(char data) {
    for(k=0;k<8;k++) { //1 biến kiểu unsigned char có 8bit
    if (data & 0x80) //kiểm tra xem bit thứ 8 là 0 hay 1
    DATA = 0; //nếu bằng 1 thì DATA=0;
    else DATA = 1; //nếu bằng 0 thi DATA=1;
    data = data << 1; //dịch qua phải 1 bit
    // bỏ đi thứ 8 vừa đẩy chân 595 và đưa bit thứ 7 vào chỗ bit thứ 8
    //bit đầu tiên gán giá tri bằng 0 (cái này ko cần quan tâm)
    //lần lược xuất data của 8 bit
    SCK = 0;
    SCK = 1;
    }
    }
    /************************************************** ***/
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {

    for(n=6;n>0;n--) //48 cột = 6*8 led (xem như là "6 led" mỗi led 8 led đơn)
    xuatdata(Led[m][n-1]); //ta chỉ đưa data của "6 led" thôi(bằng phần cứng)
    SCL=0;
    SCL=1;
    PORTA=m; //quét hàng từ 0 đến 15
    m++ ;
    if (m==16) m=0;
    }
    /************************************************** ***/
    void main(void)
    {
    DDRA=0xFF;
    DDRB=0xFF;
    DDRD=0xFF;

    TCCR0=0x03; //
    TCNT0=0x00; //
    OCR0=0x5A; //tinh tan so quet

    TIMSK=0x02;

    ACSR=0x80;
    SFIOR=0x00;

    #asm("sei")

    SCK=1;
    SCL=1;


    /*********** CHAY CHU TU TRAI QUA PHAI **********/

    while(1)
    {
    for(i=0;i<16;i++) //16 hàng
    {
    tmp=Led[i][0]&0x01;
    //dùng biến tmp để lưu gía trị của bit đầu tiên của con led đầu tiên
    for(j=1;j<12;j++)
    {
    if(Led[i][j]&0x01) //lấy bit đầu tiên của led thứ i gán cho bit thứ 8 của led i-1
    Led[i][j-1]=(Led[i][j-1]>>1)|0x80;
    else
    Led[i][j-1]=Led[i][j-1]>>1;
    }
    if(tmp) //nếu tmp =1 thì gán cho bit thứ 8 của led cuối cùng
    Led[i][11]=(Led[i][11]>>1)|0x80;
    else //nếu tmp =0 thì chỉ cần dịch trái 1 bit
    Led[i][11]=Led[i][11]>>1;
    }
    delay_ms(100);
    };

    }

    Leave a comment:


  • Mr_se7en
    replied
    Em đang làm bảng led 16*64, phần hiển thị led em đã làm xong rồi. Anh nghaiha có kinh nghiệm làm led ma trận xin giúp đỡ em phần mạch điều khiển với, em thây mạch ĐK của anh làm rất pro nên mong anh giúp đỡ em sơ đồ nguyên lý + layout mạch ĐK. Đây là ơ đồ led của em:
    Sơ đồ này là module 2 led mở rộng được.
    Attached Files

    Leave a comment:


  • thaopro_265
    replied
    Xin chào mọi người.Mình đang làm bài tâp lớn về ma trận led.nhưng mà phần chữ dịch phải trái vẫn chưa làm dc.ai xem hộ mình viết trong chương trình chính thì phần while(1) phải viết thế nào nha.Mình làm y hệt bài của bác Nghaiha mà.

    for (k=0;k<=7;k++){
    delay_ms(10);
    }
    for (i=0;i<=23;i++){
    DMem[i]>>=1;
    }
    }
    mình ko hiểu bác Haiha dịch bít trước như thế nào.mình chỉ thấy chữ dịch dc 1 ít thôi rồi mất luôn.bác Haiha và mọi người giúp đỡ mình với...please!!!!

    Leave a comment:


  • lethanhhai86
    replied
    help em

    các đại ca ơi, giúp em với nhé. em dùng proteus mô phỏng lại cái mạch của bác nghaiha. nhưng sao kết quả lại như thế này. em mong các bác giúp em nhé
    Attached Files

    Leave a comment:


  • phamngoc
    replied
    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V2.03.4 Standard
    Automatic Program Generator
    © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project :LED MATRIX 8x32 ,quet hang
    Version :

    Date : 4/7/2009
    Author :
    Company :
    Comments: 74259+2803 quet hang(K) ,74595 xuat data ra cot(A) ,2 mau (neu muon them mau nua thi cho red=0;blue=0),dung 2 bo dem de hien thi man hinh

    Chip type : ATmega8
    Program type : Application
    Clock frequency : 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega8.h>
    #include <delay.h>

    #define DATA PORTB.3
    #define SCL PORTB.4
    #define SCK PORTB.5

    #define blue PORTD.0
    #define red PORTD.1
    //Bang ma chu so tu 0 den 9 luu vao flash
    unsigned char flash bang[]={
    0,0,0,0,112, 0,0,0,0,137, 0,0,0,0,138, 0,0,0,0,136, 0,0,0,0,136, 0,0,0,0,136, 0,0,0,0,115, 0,0,0,0,0,
    0,0,0,112,135, 0,0,0,137,136, 0,0,0,138,136, 0,0,0,136,129, 0,0,0,136,134, 0,0,0,136,136, 0,0,0,115,239, 0,0,0,0,0,
    0,0,112,135,62, 0,0,137,136,130, 0,0,138,136,140, 0,0,136,129,2, 0,0,136,134,34, 0,0,136,136,34, 0,0,115,239,156, 0,0,0,0,0,
    0,112,135,62,131, 0,137,136,130,130, 0,138,136,140,139, 0,136,129,2,136, 0,136,134,34,250, 0,136,136,34,10, 0,115,239,156,9, 0,0,0,0,0,
    112,135,62,131,225, 137,136,130,130,2, 138,136,140,139,196, 136,129,2,136,39, 136,134,34,250,40, 136,136,34,10,40, 115,239,156,9,199, 0,0,0,0,0,
    135,62,131,225,62, 136,130,130,2,2, 136,140,139,196,4, 129,2,136,39,8, 134,34,250,40,136, 136,34,10,40,136, 239,156,9,199,8, 0,0,0,0,0,
    62,131,225,62,113, 130,130,2,2,138, 140,139,196,4,138, 2,136,39,8,113, 34,250,40,136,136, 34,10,40,136,136, 156,9,199,8,113, 0,0,0,0,0,
    131,225,62,113,192, 130,2,2,138,32, 139,196,4,138,32, 136,39,8,113,192, 250,40,136,136,64, 10,40,136,136,128, 9,199,8,113,0, 0,0,0,0,0,
    225,62,113,192,0, 2,2,138,32,0, 196,4,138,32,0, 39,8,113,192,0, 40,136,136,64,0, 40,136,136,128,0, 199,8,113,0,0, 0,0,0,0,0,
    62,113,192,0,0, 2,138,32,0,0, 4,138,32,0,0, 8,113,192,0,0, 136,136,64,0,0, 136,136,128,0,0, 8,113,0,0,0, 0,0,0,0,0,
    113,192,0,0,0, 138,32,0,0,0, 138,32,0,0,0, 113,192,0,0,0, 136,64,0,0,0, 136,128,0,0,0, 113,0,0,0,0, 0,0,0,0,0,
    192,0,0,0,0, 32,0,0,0,0, 32,0,0,0,0, 192,0,0,0,0, 64,0,0,0,0, 128,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};



    //Khai bao 2 bo dem de hien thi man hinh
    unsigned char manhinh_1[32];
    unsigned char manhinh_2[32];

    //khai bao 5 byte de chua ma
    unsigned char byte1,byte2,byte3,byte4,byte5;
    //khai bao 4 bien de tang so dem
    unsigned int a=0;
    //khai bao bien de dich bit
    unsigned char n=0,j=0;
    unsigned int k=0;

    void bodem_1(void)
    {
    unsigned int i;
    n++;
    for(i=0;i<8;i++)
    {
    //lay du lieu tu bang ma trong flash
    byte1=bang[i*5+0+a];
    byte2=bang[i*5+1+a];
    byte3=bang[i*5+2+a];
    byte4=bang[i*5+3+a];
    byte5=bang[i*5+4+a];
    // tao 4 byte moi bang cach dich bit roi luu vao man hinh 1
    manhinh_1[i*4+0] = (byte1<<n)|(byte2>>8-n);
    manhinh_1[i*4+1] = (byte2<<n)|(byte3>>8-n);
    manhinh_1[i*4+2] = (byte3<<n)|(byte4>>8-n);
    manhinh_1[i*4+3] = (byte4<<n)|(byte5>>8-n);
    }
    }

    void bodem_2(void)
    {
    unsigned int i;
    n++;
    for(i=0;i<8;i++)
    {
    //lay du lieu tu bang ma
    byte1=bang[i*5+0+a];
    byte2=bang[i*5+1+a];
    byte3=bang[i*5+2+a];
    byte4=bang[i*5+3+a];
    byte5=bang[i*5+4+a];
    // tao 4 byte moi
    manhinh_2[i*4+0] = (byte1<<n)|(byte2>>8-n);
    manhinh_2[i*4+1] = (byte2<<n)|(byte3>>8-n);
    manhinh_2[i*4+2] = (byte3<<n)|(byte4>>8-n);
    manhinh_2[i*4+3] = (byte4<<n)|(byte5>>8-n);
    }
    if(n==8)
    {
    n=0;
    a=a+40;
    if(a==520)
    {
    a=0;
    red=~red;
    blue=~blue;
    }
    }
    }


    void spi(unsigned char CDATA)
    {
    unsigned char i;
    for(i=0;i<8;i++)
    {
    DATA = (CDATA<<i)&0x80;
    SCK=1; SCK=0;
    }
    }

    void display_1(void)
    {
    spi(manhinh_1[k*4]);
    spi(manhinh_1[k*4+1]);
    spi(manhinh_1[k*4+2]);
    spi(manhinh_1[k*4+3]);
    }

    void display_2(void)
    {
    spi(manhinh_2[k*4]);
    spi(manhinh_2[k*4+1]);
    spi(manhinh_2[k*4+2]);
    spi(manhinh_2[k*4+3]);
    }

    void main(void)
    {
    DDRB=0xFF;
    DDRC=0xFF;
    DDRD=0xFF;

    PORTB=0x00;
    PORTC=0x00;
    blue=1;
    red=0;
    //Khoi tao time1 ngat mode CTC COMPA
    TCNT1=0x00;
    TCCR1B=0x09;
    OCR1A=16000;
    TIMSK=0x10;
    #asm("sei")

    bodem_1();
    while(1)
    {
    //hien thi man hinh 1 ,layman hinh 2
    bodem_2();
    while(j<10);

    bodem_1();
    while(j>10);
    }
    }

    //Trinh ngat tran timer1
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    if(blue)
    {
    if(j<10)
    {
    display_1();
    // hien thi
    red=1;
    SCL=1; SCL=0;
    PORTC=k;
    red=0;
    k++;
    if(k==8)
    {
    k=0;
    j++;
    if(j==10) j=11;
    }
    }
    else
    {
    display_2();
    // hien thi
    red=1;
    SCL=1; SCL=0;
    PORTC=k;
    red=0;
    k++;
    if(k==8)
    {
    k=0;
    j++;
    if(j==20) j=0;
    }
    }
    }
    else
    {
    if(j<10)
    {
    display_1();
    // hien thi
    blue=1;
    SCL=1; SCL=0;
    PORTC=k;
    blue=0;
    k++;
    if(k==8)
    {
    k=0;
    j++;
    if(j==10) j=11;
    }
    }
    else
    {
    display_2();
    // hien thi
    blue=1;
    SCL=1; SCL=0;
    PORTC=k;
    blue=0;
    k++;
    if(k==8)
    {
    k=0;
    j++;
    if(j==20) j=0;
    }
    }
    }
    }//ket thuc chuong trinh
    Last edited by phamngoc; 29-04-2009, 16:22.

    Leave a comment:


  • nong_dan_
    replied
    AVR cho người mới bắt đầu

    Em mới bắt đầu học AVR nên có thể nói là chưa biết gì cả.
    Em muốn hỏi các anh là: AVR có những ưu, nhược điểm, thế mạnh, kiến trúc phần cứng như thế nào so với 8051.
    Mong các anh giới thiệu rõ hơn về cả Tập thanh ghi của nó nữa để cho những người mới học như em được hiểu rõ hơn.
    Cảm ơn các tiền bối.

    Leave a comment:


  • canary87
    replied
    Bạn HÀ ơi. Bạn có thể chỉ rõ hỏn về cách bạn dùng FET 4A với IC đệm 74245 dc ko? Với lại bạn có thể tính thử giúp mình phần công suất nếu mình làm bảng quang báo 2x12 led ma trận, dựa theo cách thiết kể dùng FET va IC đệm của bạn. Cảm ơn bạn nhìu.

    Leave a comment:


  • tungbka
    replied
    Em cũng đang tập tành làm led ma trận. Em mới kiếm được phần mềm tạo mã cho led ma trận, không biết các bác có cần ko nhưng em thấy dùng rất nhanh, đỡ tốn công tính toán nên em cứ đưa lên đây :
    http://www.mediafire.com/download.php?yywtyjhwcnm

    Leave a comment:


  • hightech_uc
    replied
    Mỗi chân 595 có 1 con trở mà bạn. Dòng qua mỗi led khoảng 10-15mA, loại led bầu dục này tuổi thọ cao lắm, ko dễ chết đâu...

    Leave a comment:


  • nghaiha
    replied
    @hightech_uc: Cái module này đảm bảo nó tốn điện ác bác nhỉ? bác có gì đo thử dòng trung bình (phía 220VAC) khi thắp sáng khoảng 10 module không.

    Bác có module đó kiểm tra cho em chỗ này. Nguồn cung cấp của bác sẽ là 5V. Qua 595 cấp nguồn cho led cũng 5V. Nếu không quét mà cấp nguồn luôn thế này thì led chắc là chóng die. Vậy cái phần hạ áp xuống cho led nằm ở đâu hả bác?

    Cám ơn bác.

    Leave a comment:


  • hightech_uc
    replied
    Hoặc đây...
    Attached Files

    Leave a comment:


  • hightech_uc
    replied
    Nó đây này. Bạn đếm xem có đủ 32 con 595 không...
    http://www.maxup.vn/tai-ve/dlyce40fj...00001.jpg.html
    http://www.maxup.vn/tai-ve/lmxawtt2u...00002.jpg.html
    http://www.maxup.vn/tai-ve/hcvjvw0kd...00003.jpg.html
    http://www.maxup.vn/tai-ve/1krcudsmb...00004.jpg.html
    Last edited by hightech_uc; 19-03-2009, 08:46.

    Leave a comment:


  • nghaiha
    replied
    Nguyên văn bởi hightech_uc Xem bài viết
    Không phải là 16x32 pixels đâu, là 8x16 pixels, kích cỡ vật lí mới là 16x32cm, như vậy mặt sau nó có 32 con 595 thôi. Và 32 con 595 này nắm trên một mạch in khoảng 2 dm2 cắm lên trên bo hàn led. Để tôi đưa video của nó lên cho bạn xem.
    http://www.easy-share.com/1904061582/Led_Module.mp4
    Mấy module như thế này chỗ em có nhiều lắm, bác cho em xem làm gì. Em đang cần bác chứng minh điều bác nói cơ.

    Leave a comment:

Về tác giả

Collapse

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

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

Collapse

Đang tải...
X