[C7] Module Led Matrix

Manhdd

Cố Vấn CLB
Staff member
Các hướng dẫn cơ bản về led ma trận các bạn xem tại đây, nội dung rất chi tiết. Code AVR các bạn có thể đọc sơ qua để hiểu nguyên lý quét, cũng không quá khó để hiểu


Module Led Ma trận cho C7 được đính kèm bên dưới bài viết. 2 bản layout đính kèm là do 2 cá nhân vẽ, chưa được kiểm chứng trên thực tế. Các bạn chỉ nên lấy đó làm tham khảo cho bản layout của mình.

Tiếp theo là đoạn basic sample code để hiện 2 mảng led đỏ và led xanh ra led ma trận. Từ basic code này có thể kết hợp với các hàm API cao hơn để điều khiển module led ma trận được mượt mà.
Code:
#define BIN(b7,b6,b5,b4,b3,b2,b1,b0) ((b7<<7)+(b6<<6)+(b5<<5)+(b4<<4)+(b3<<3)+(b2<<2)+(b1<<1)+b0)
 
/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
char MTICK = 0; // Count for row-shifting: row0 -> row7
// Store array of matrix 8x8 (red and green)
unsigned char Fontr[8] = {BIN(0,0,0,1,1,0,0,0),  // Red Font
                          BIN(0,0,0,1,1,0,0,0),
                          BIN(0,0,0,1,1,0,0,0),
                          BIN(1,1,1,1,1,1,1,1),
                          BIN(1,1,1,1,1,1,1,1),
                          BIN(0,0,0,1,1,0,0,0),
                          BIN(0,0,0,1,1,0,0,0),
                          BIN(0,0,0,1,1,0,0,0)};
unsigned char Fontg[8] = {BIN(1,1,0,0,0,0,1,1),  // Green Font
                          BIN(1,1,0,0,0,0,1,1),
                          BIN(0,0,0,0,0,0,0,0),
                          BIN(0,0,0,0,0,0,0,0),
                          BIN(0,0,0,0,0,0,0,0),
                          BIN(0,0,0,0,0,0,0,0),
                          BIN(1,1,0,0,0,0,1,1),
                          BIN(1,1,0,0,0,0,1,1)};
 
/*****************************************************************
* MATRIX 8x8 INIT AND EXPORT FUNCTIONS
******************************************************************/
void matrix8_init (void)
{
    // IO Direction: output
    P1DIR |= (ROW_CLK_PIN+ROW_LATCH_PIN+ROW_DATA_PIN+COL_CLK_PIN+COL_LATCH_PIN+COL_DATA_PIN);
    // Set all clock pins to '0' before Clock Pulse
    P1OUT &=  ~ROW_CLK_PIN;
    P1OUT &=  ~ROW_LATCH_PIN;
    P1OUT &=  ~COL_CLK_PIN;
    P1OUT &=  ~COL_LATCH_PIN;
 
    // Timer config
    CCTL0 = CCIE;
    CCR0 = 2500;
    TACTL = TASSEL_2 + MC_2;
}
 
// Timer A interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
    if (MTICK>7)
        MTICK=0; // re-load MTICK
 
    matrix8_export_empty_column(); // make column empty before shift allow new row
                            // neu khong co ham nay chung ta co the thay
                            // hien tuong luu hinh hang truoc khi cho phep hang moi
    matrix8_export_row(); // allow new row (shift row)
    matrix8_export_column(); // export red column and green column on new row
 
    MTICK++; // increase MTICK
    CCR0 +=2500; // Timer interval
}
void matrix8_export_row()
{
    signed char i;
    unsigned char row;
    row = (1<<MTICK); // row buffer
                // doi voi hang, bit 1 cho phep led hang do sang
    for (i=7;i>=0;i--)
    {
        if (row&0x01) // check bit 0 to shift into 74hc595
                    // de dam bao dung huong cua led ma tran quy dinh theo
                    // mang da khai bao thi
                    // row dich bit 0 vao truoc
                    // column dich bit 7 vao truoc (xem phia duoi)
            P1OUT |=  ROW_DATA_PIN;
        else
            P1OUT &=  ~ROW_DATA_PIN;
        row = row >> 1; // shift row buffer
        ROW_Clock;
    }
    ROW_Latch_Clock;
 
}
void matrix8_export_column()
{
    signed char i;
    unsigned char colg, colr;
    colg = ~Fontg [MTICK]; // Green Column Buffer
    colr = ~Fontr [MTICK]; // Red Column Buffer
            // doi voi cot, bit 0 cho phep led cot do sang
    for (i=7;i>=0;i--)
    {
        if (colg&0x80) // check bit 7 to shift into 74hc595
            P1OUT |=  COL_DATA_PIN;
        else
            P1OUT &=  ~COL_DATA_PIN;
        colg = colg << 1; // Shift Green Column Buffer
        COL_Clock;
    }
    for (i=7;i>=0;i--) // check bit 7 to shift into 74hc595
    {
        if (colr&0x80) // check bit 7 to shift into 74hc595
            P1OUT |=  COL_DATA_PIN;
        else
            P1OUT &=  ~COL_DATA_PIN;
        colr = colr << 1; // Shift Red Column Buffer
        COL_Clock;
    }
    COL_Latch_Clock;
}
 
void matrix8_export_empty_column()
{
    signed char i;
    P1OUT |=  COL_DATA_PIN; // Set 1 to make led off
    for (i=15;i>=0;i--) // Shift 0xFFFF (16 bit 1)
    {
        _delay_cycles(MCLK_F*5); // delay 5 circle machine before next clock
                // cho delay nay nham thoa dap ung tan so cua 74hc595
                // tuc la 74hc595 khong nhan ra cac xung clock qua nhanh
                // cac clock o tren khong can dong nay vi ban than cac dong code da la delay
        COL_Clock;
    }
    COL_Latch_Clock;
}
P/S: Phần code này do mình phát triển, không khuyến khích tất cả các bạn làm theo. Vì đơn giản là giải thuật quét led matrix rất phong phú, các bạn có thể cá nhân hoá để phát triển thêm :)
 

Attachments

cowboyhere

Cố Vấn CLB
Staff member
có 1 con IC ở dưới led martrix, rồi lại để trở cắm đứng dưới led matrix nữa sẽ đội cái matrix lên cao lắm ( nếu dùng header) anh xem có cần trải ra ko chứ để cao quá cũng xấu
 

Kisses Hacker

Art Supporter
Staff member
có 1 con IC ở dưới led martrix, rồi lại để trở cắm đứng dưới led matrix nữa sẽ đội cái matrix lên cao lắm ( nếu dùng header) anh xem có cần trải ra ko chứ để cao quá cũng xấu
Led matrix cắm trên 2 hàng header female. Cao lắm bạn đừng lo về cái IC, còn cái hàng trở đứng thì hàn khít chân vào board một tý là ổn:D
 

Manhdd

Cố Vấn CLB
Staff member
có 1 con IC ở dưới led martrix, rồi lại để trở cắm đứng dưới led matrix nữa sẽ đội cái matrix lên cao lắm ( nếu dùng header) anh xem có cần trải ra ko chứ để cao quá cũng xấu
Anh coi thiết kế cũ cũng thế mà. Vả lại, led matrix được cắm trên header cái nên vốn dĩ đã cao hơn IC với trở đứng rồi :d
Xu hướng thời đại là "xây nhà cao tầng" để tiết kiệm diện tích mà :)
 

ctcngh

Thành Viên PIF
Mấy con trở nối với matrix đều là 47k hết hả a? Tại thấy trong schematic màu đỏ thì 100 còn màu xanh là 47.
 

omega5161

Thành Viên PIF
Code:
#include <msp430g2553.h>
void ckrow()
{
    P1OUT&=~0X02;
    P1OUT|=0X02;
}
void ckcol()
{
    P1OUT&=~0X08;
    P1OUT|=0X08;
}
void lck()
{
    P1OUT&=~0X40;
    P1OUT|=0X40;
}
void datarow(char x)
{
    char i;
    for(i=1;i<=8;i++)
        {if(i==x)
            P1OUT|=0X01;
        else
            P1OUT&=~0x01;
        ckrow();
        }
}
void datacolum(char y)
{
    char i;
    for(i=0;i<=16;i++)
        {
        if(i==y)
            P1OUT&=~0X04;
        else
            P1OUT|=0x04;
        ckcol();
        }
}
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;               
  P1DIR |= 0xff;
  P1OUT = 0Xff;
  char i;
  while(1)
    {
      for(i=1;i<=8;i++)
          {
          datarow(i);datacolum(i);
          lck();
          _delay_cycles(500000);
          }
    }
}
e thử viết code cho led màu xanh sáng theo đường chéo của ma trận mà nó cứ dựt dựt thế này là vì lý do gì thế ak?
 
_điều đầu tiên là em nên hỏi advisor của mình, cứ xoắn nhiệt vào, không trả lời được thì nêu tên advisor lên đây.
_điều thứ 2 là em có thể dùng microsoft visio hoặc dùng bút vẽ code flow của em cho mọi người hiểu rõ hơn, cũng tiện debug hơn.
_thứ 3 là module led matrix của mình dùng shift register, tức là kết nối 3 chân SPI, cái này msp430g2553 có hỗ trợ. em coi code mẫu phần USCI SPI để biết rõ thêm. (file msp430g2xx3_uscia0_spi_09, MSP430G2xx3 Demo - USCI_A0, SPI 3-Wire Master Incremented Data). coi code mẫu, không hiểu thanh ghi nào thì tra phần 16.4 slau144.
Dù sao thì viết code chay mà chạy được tức là em cũng hiểu SPI rồi , đáng khen. cố gắng đọc nốt và hoàn thành để mai đi khè tụi khác :D
 

ctcngh

Thành Viên PIF

Manhdd

Cố Vấn CLB
Staff member
Đã chạy code led ma trận tốt trên module led matrix của omega5161 . Code tham khảo update ở đầu bài.
Layout của omega5161 làm khá tốt, em quay lại cái port Jr với add thêm logo PIF rồi gửi qua mail anh để làm mẫu cho các bạn nhé :) Ngày mai anh học cả ngày, cứ gọi cho anh nếu cần nhận lại module về nhà code :D
 

Chi Linh

Thành Viên PIF
Hi advisor, cho em hỏi con IC UDN 2891, con này mua ngoai nhat tao ko ban, neu có thì giá rất cao tới 80k...mấy anh cho em hỏi vậy có con nào thay thế được không?...nếu có thì tên IC đó là gì...thanks! Hi
 

Manhdd

Cố Vấn CLB
Staff member
Hi advisor, cho em hỏi con IC UDN 2891, con này mua ngoai nhat tao ko ban, neu có thì giá rất cao tới 80k...mấy anh cho em hỏi vậy có con nào thay thế được không?...nếu có thì tên IC đó là gì...thanks! Hi
Schematic mới đã sửa lại thành TD62783 cho các bạn dễ tìm rồi :)
 

Manhdd

Cố Vấn CLB
Staff member
Đã update bản layout mới ở post đầu tiên. Các em có thể làm mạch được rồi.
Nhớ đọc cái file note nhé :d
 

vanthinhvt92

Thành Viên PIF
Ủa đang nói về led matrix sao anh lại nói led 7 đoạn rất phong phú, có nhầm lẫn gì đó , hay em đọc nhầm.!
 

Manhdd

Cố Vấn CLB
Staff member
Chắc em đọc nhầm đó =))
Thì cái nào cũng phong phú cơ mà. E omega5161 làm khá tốt rồi đó, các e khác cố gắng nha :)
Tuần này C7 sẽ học PWM, các em nhớ mang mạch đầy đủ và coi trước TUT PWM cho LaunchPad bên diễn đàn TI :1cool_byebye:
 

Manhdd

Cố Vấn CLB
Staff member
À còn nữa. Tài liệu cho K12 tuần này nói về ghi dịch đó. Em nào còn lơ ngơ cái này thì nên xem qua :)
 

phucuong23192

Thành Viên PIF
Code:
#include <msp430g2553.h>
void ckrow()
{
    P1OUT&=~0X02;
    P1OUT|=0X02;
}
void ckcol()
{
    P1OUT&=~0X08;
    P1OUT|=0X08;
}
void lck()
{
    P1OUT&=~0X40;
    P1OUT|=0X40;
}
void datarow(char x)
{
    char i;
    for(i=1;i<=8;i++)
        {if(i==x)
            P1OUT|=0X01;
        else
            P1OUT&=~0x01;
        ckrow();
        }
}
void datacolum(char y)
{
    char i;
    for(i=0;i<=16;i++)
        {
        if(i==y)
            P1OUT&=~0X04;
        else
            P1OUT|=0x04;
        ckcol();
        }
}
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;           
  P1DIR |= 0xff;
  P1OUT = 0Xff;
  char i;
  while(1)
    {
      for(i=1;i<=8;i++)
          {
          datarow(i);datacolum(i);
          lck();
          _delay_cycles(500000);
          }
    }
}
e thử viết code cho led màu xanh sáng theo đường chéo của ma trận mà nó cứ dựt dựt thế này là vì lý do gì thế ak?
cho hoi cach cam' day de minh test cai mach cai. thay sau co 5 soi ah clk chen bit cam sao.

//2death: bài viết tiếng Việt không dấu sẽ bị xoá.
 

omega5161

Thành Viên PIF
cho hoi cach cam' day de minh test cai mach cai. thay sau co 5 soi ah clk chen bit cam sao.
P1.0=>DATAROW
P1.1=>CLOCKROW
P1.2=>DATACOLLUM
P1.3=>CLOCKCOLLUM
P1.6=>LATCHCLOCKROW+COLUM(hai cái latchclock đều cắm vào chân P1.6 nhé)
 

Manhdd

Cố Vấn CLB
Staff member
Cách cắm dây tuỳ theo cách các bạn code. Nếu có sẵn code mẫu mà bạn vẫn không biết cắm dây như thế nào tức là bạn chưa hiểu phần cứng, cần học lại bài ghi dịch với K12 :)
Phần basic code ở bài đầu chỉ là 1 đoạn code, thực hiện đến 60-70% phần việc của các bạn. Các bạn cần động não tí, không phải lúc nào cũng có sẵn code đổ vào chạy liền đâu =.=
 
Top