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à.
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
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;
}
Attachments
-
224 KB Views: 194