Matrix 8x8 with XC8

4:08:00 AM

LED MATRIX 8x8 đơn giản chỉ là 64 con LED được sắp xếp với nhau theo dạng ma trận, thành 8 hàng và 8 cột, tức là 16 chân. Vì mỗi loại LED MATRIX có sơ đồ chân riêng nên các bạn hãy tra cứu datasheet của nó để có thể lắp mạch chính xác nhé! (mà kiểm tra từng chân của LED matrix cũng biết được .
Trong bài viết này mình sử dụng LED matrix "row anode", có nghĩa là các chân điều khiển hàng của ma trận chính là cực dương của LED. Đây là hình minh họa:

matrix 8x8
Để LED MATRIX hoạt động, chúng ta chỉ cần cấp dòng điện vào các chân ROWs và nối các chân COLUMNS với GND. 
Ảnh mô phỏng protues.

matrix 8x8 pic16f877a xc8

- Đây là code.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic16f877a.h>

#define _XTAL_FREQ 4000000

// Khai bao bien.

// Khai bao du lieu hien thi.
const unsigned char a[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xE3,0xC1,0x81,0x03,0x03,0x81,0xC1,0xE3,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF

};

const unsigned char b[] = {
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
};

const unsigned char c1[] = {
0b00000000,
0b00000000,
0b10000000,
0b11000000,
0b11100000,
0b11110000,
0b11111000,
0b11111100,
};

void init_PORTD(void)
{
PORTD = 0X00; // Khoi tao Port D.
TRISD = 0X00; // Cau hinh PORTD la ngo ra.
}

void init_PORTB(void)
{
PORTB = 0X00; // Khoi tao Port B.
TRISB = 0X00; // Cau hinh PORTB la ngo ra.
}

void scanmatrixsta(unsigned char dat_dis)
{
// Khai bao bien.
unsigned char scancode,i;

// Dinh nghia ham.
scancode = 0x01; // Ma quet LED ban dau - 00000001.
for(i=dat_dis;i<=dat_dis+7;i++)
{
PORTB = a[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode << 1; // Dich ma quet LED.
}
}

void sangtat(unsigned char n)
{
// Khai bao bien.
unsigned char i,j,dat_dis,scancode;
while(n--)
{
dat_dis=8;
for(j=1;j<=21;j++) // Thoi gian cua 1 trang thai man hinh (21 x 8 x 3ms).
{
scanmatrixsta(dat_dis); // Quet LED de hien thi.
}
}
}

void traiphai(unsigned char n)
{
unsigned char i,j,dat_dis,scancode;
while(n--)
{
for(dat_dis=8;dat_dis<=23;dat_dis++)
{
for(j=1;j<=12;j++)
{
scancode = 0x01; // Ma quet LED ban dau - 00000001.
for(i=dat_dis;i>=dat_dis-7;i--)
{
PORTB = a[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode << 1; // Dich ma quet LED.
}
}
}
}
}

void duoilen(unsigned char n)
{
// Khai bao bien.
unsigned char i,j,k,l,dat_dis,scancode;
unsigned char b[]={0x00};
unsigned char c[]={0x00};
while(n--)
{
for(k=8;k>=1;k--)
{
dat_dis=8;
for(j=1;j<=12;j++)
{
scancode = 0x01; // Ma quet LED ban dau - 00000001.
for(i=dat_dis;i<=dat_dis+7;i++)
{
l=k-1;
b[i] = ~a[i];
b[i] = b[i]<<l;
PORTB = ~b[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode << 1; // Dich ma quet LED.
}
}
}


for(k=1;k<=8;k++)
{
dat_dis=8;
for(j=1;j<=12;j++)
{
scancode = 0x01; // Ma quet LED ban dau - 00000001.
for(i=dat_dis;i<=dat_dis+7;i++)
{
b[i] = ~a[i];
b[i] = b[i]>>k;
PORTB = ~b[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode << 1; // Dich ma quet LED.
}
}
}


}
}

void sangdanphaitrai(unsigned char n)
{
unsigned char i,j,k,scancode,dat_dis;
while(n--)
{
PORTB = 0xFF; // Xuat ma hien thi.
__delay_ms(100); // Tan so quet LED - 3ms.
__delay_ms(100);
__delay_ms(100);

for(k=1;k<=8;k++)
{
for(j=1;j<=(100/k);j++)
{
dat_dis=15;
scancode = 0x80; // Ma quet LED ban dau - 00000001.
for(i=dat_dis;i>=dat_dis+1-k;i--)
{
PORTB = a[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode >> 1; // Dich ma quet LED.
}
}
}
}
}

void sangdantrenxuong(unsigned char n)
{
// Khai bao bien.
unsigned char i,j,k,l,dat_dis,scancode;
unsigned char b[]={0x00};
while(n--)
{
for(k=8;k>=1;k--)
{
dat_dis=8;
for(j=1;j<=20;j++)
{
scancode = 0x01; // Ma quet LED ban dau - 00000001.
for(i=dat_dis;i<=dat_dis+7;i++)
{
l=k-1;
b[i] = ~(a[i]<<l);
b[i] = b[i]>>l;
PORTB = ~b[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode << 1; // Dich ma quet LED.
}
}
}
}
}

void sangdan2benvao(unsigned char n)
{
unsigned char i,j,k,scancode,scancode1,dat_dis;
while(n--)
{
PORTB = 0xFF; // Xuat ma hien thi.
__delay_ms(100); // Tan so quet LED - 3ms.
__delay_ms(100);
__delay_ms(100);

for(k=1;k<=4;k++)
{
for(j=1;j<=(100/k);j++)
{
dat_dis=15;
scancode = 0x80; // Ma quet LED ban dau - 00000001.
scancode1 = 0x01;
for(i=dat_dis;i>=dat_dis+1-k;i--)
{
PORTB = a[i]; // Xuat ma hien thi.
PORTD = scancode; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode = scancode >> 1; // Dich ma quet LED.
}

for(i=dat_dis-7;i<=dat_dis-8+k;i++)
{
PORTB = a[i]; // Xuat ma hien thi.
PORTD = scancode1; // Xuat ma quet (ACT = 1).
__delay_ms(2); // Tan so quet LED - 3ms.
PORTD = 0x00; // Chong lem hien thi.
scancode1 = scancode1 << 1; // Dich ma quet LED.
}

}
}
}
}

// Chuong trinh chinh.
void main (void)
{
unsigned char dat_dis;
init_PORTB(); // Cau hinh Port B.
init_PORTD(); // Cau hinh Port D.


while(1)
{
sangtat(1);
traiphai(2);
duoilen(2);
sangdantrenxuong(2);
sangdanphaitrai(2);
sangdan2benvao(2);
}


Share this

Related Posts

Previous
Next Post »