PIC Lesson: Dot Matrix

Dot Matrix adalah sejenis display yang seakan-akan 7 Segment. Kelebihannya berbanding 7 Segment adalah Dot Matrix boleh memaparkan lebih banyak character berbanding 7 Segment yang hanya memaparkan nombor. Binaan Dot Matrix adalah seperti sejumlah LED yang disambung secara matrix. Contoh 8X8 Dot Matrix, mempunyai 64 LED di dalam satu set.

Sambungan matrix akan mengurangkan I/O berbanding sambungan LED secara direct. Kendaliannya adalah membuat blinking bagi setiap row. Ini kerana tidak boleh menyalakan dua row serentak. Schematic bagi 8X8 Dot Matrix adalah seperti di bawah.

Di bawah adalah videonya

PIC Source Code

21 Replies to “PIC Lesson: Dot Matrix”

  1. Okay.. maaf mengganggu en. Saya cuma minta bantuan klu bagaimana nak looping saja supaya alphabet tu sentiasa scrol berulang2.. maaf yer..

  2. Assalamualaikum Mr. Shahrul sya mempunyai 1 kemusykilan. saya telah membuat satu aturcara untulk scroll message pada dot matrik 5×7. kenapa apabila sampai pada alphabet z ia x looping.
    padahal saya telah menggunakan for loop. mintak tlg tgk kan bleh x?

    Program seperti dibawah:

    /*
    Project: Interfacing an LED matrix
    Description : A 7×5 LED matrix
    MCU: PIC16F877, External crystal = 20.0 MHz,
    7 rows are driven by PORTB, and 5 colums by PORTA pins
    English Alphabets from A through Z are displayed sequentially.

    02 / 03 / 2012

    */

    // Define row values for each of the five columns corresponding
    // to Alphabets A through Z

    #include
    #include
    #define _XTAL_FREQ 20000000
    __CONFIG(0x3D39); //configuration bits@ microcontroller// 0x3D39 877

    void delay_ms(unsigned int ui_value);
    /* Use XT mode, No Watch Dog, No Code Protect, No Power-up Timer */

    main(){
    char const pat[156]={0x7E,0x09,0x09,0x09,0x7E,0x00,//A tujuan diletakkan 0x00 supaya ada space antara huruf iaitu 1 baris colum space.
    0x7F,0x49,0x49,0x49,0x36,0x00,//B
    0x3E,0x41,0x41,0x41,0x22,0x00,//C
    0x7F,0x41,0x41,0x41,0x3E,0x00,//D
    0x7F,0x49,0x49,0x49,0x49,0x00,//E
    0x7F,0x09,0x09,0x09,0x09,0x00,//F
    0x3E,0x41,0x49,0x49,0x3A,0x00,//G
    0x7F,0x08,0x08,0x08,0x7F,0x00,//H
    0x41,0x41,0x7F,0x41,0x41,0x00,//I
    0x21,0x41,0x41,0x41,0x3F,0x00,//J
    0x7F,0x08,0x14,0x22,0x41,0x00,//K
    0x7F,0x40,0x40,0x40,0x40,0x00,//L
    0x7F,0x04,0x08,0x04,0x7F,0x00,//M
    0x7F,0x04,0x08,0x10,0x7F,0x00,//N
    0x3E,0x41,0x41,0x41,0x3E,0x00,//O
    0x7F,0x09,0x09,0x09,0x06,0x00,//P
    0x3E,0x41,0x51,0x61,0x7E,0x00,//Q
    0x7F,0x09,0x19,0x29,0x46,0x00,//R
    0x46,0x49,0x49,0x49,0x31,0x00,//S
    0x03,0x01,0x7F,0x01,0x03,0x00,//T
    0x3F,0x40,0x40,0x40,0x3F,0x00,//U
    0x1F,0x20,0x40,0x20,0x1F,0x00,//V
    0x3F,0x40,0x38,0x40,0x3F,0x00,//W
    0x63,0x14,0x18,0x14,0x63,0x00,//X
    0x03,0x04,0x78,0x04,0x03,0x00,//Y
    0x61,0x51,0x49,0x45,0x43,0x00,//Z
    };

    char cnt, cnt2, scrollcnt, col;

    TRISB=0b00000000; /* set port_b sebagai output */
    TRISA=0b00000000; /* set port_a sebagai output */
    PORTB=0b00000000; /* ZERO port_a & port_b */
    PORTA=0b00000000;

    scrollcnt = 0;
    cnt2 = 0;

    for (;;) // Infinite loop to avoid run on code
    {

    //delay_ms(10); sekiranya isi delay disini , colum akan bergerak makin perlahan bergantung masa delay yang kita setkan
    col = 0b00000001; // Colum bermula pada colum pertama pada porta_0.
    ++scrollcnt; // scrollcnt digunakan sebagai satu delay sebelum kita switch kan colum

    if (scrollcnt == 20) // semakin kecil nilai scrollcnt semakin cepat tulisan bergerak
    {
    scrollcnt = 0;
    ++cnt2;

    if (cnt2 == 156)
    cnt2 = 0;
    }

    for(cnt = 0; cnt<5; cnt++) // sekiranya cnt=3 maknanya tulisan akan mula bergerak bermula dari colum ketiga.
    {
    PORTA = 0; // Padam semua data sebelumnya
    PORTB = pat[cnt+cnt2]; // Setup data untuk dipaparkan
    PORTA = col; // Papar data baru

    delay_ms(1); // Lengahkan sedikit masa sebelum kita keluarkan output pada colum berikutnya.Sekurang2nya letak 1 delayms.

    col< 0) // ui_value adalah variable bagi unsigned int.
    { // menggunakan control statement while
    __delay_ms(1); // cth: while (expression) statement; atau
    } // cth: while (expression) {statement;}
    } // variable ui_value–>0 maksudnya adalah variable ui_value ditolak dengan 1
    // dan >0 maksudnya nilai variable ui_value lebih besar dari 0

  3. manteb nih mas…panduannya
    bisa minta saran nih….saya mo buat jam digital pake ATmega8535 dg display dot matrix 5×7 (8 buah)
    gmana saran dari mas shahrul….??
    please

    1. Untuk byk character, menjadikan byk I/O, jd mmg memerlukan lebih byk PIC. Boleh juga extend I/O menggunakan Mux/Demux, tetapi itu juga menambah bilangan IC.
      Sy lebih suka menjadikan PIC itu spt driver, cth 1 PIC untuk mengawal 2 Dot Matrix. Jd, 10 Dot Matrix memerlukan 5 PIC. Kemudian, terdapat PIC utama yg mengawal 5 PIC yg lainnya.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.