Trang chủ Lifehacks Hướng dẫn viết code led matrix 2023

Hướng dẫn viết code led matrix 2023

bởi sharescript_songoku

Chào các
bạn trong bài đăng này mình sẽ hướng dẫn các bạn lập trình với LED MATRIX 8×8
sử dụng PIC16F877A. Trước tiên mình sẽ giới thiệu về LED MATRIX 8X8.

LED
MATRIX 8×8 đơ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:

Để
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.

Ứng
dụng của LED MATRIX là được sử dụng rộng rãi trong ngày nay đặc biệt là trong
các biển quảng cáo. Từ bài đăng này các bạn có thể nguyên cứu thêm và phát triển PROJECT của mình lên từ 1 LED có thể lên 2,3, hoặc 4 LED.

– Đây là ảnh mô phỏng trên protues.

– Đây là code chương trình.

#include <16f877a.h>
#fuses NOLVP,NOWDT,PUT,XT
#use delay(clock=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)
{
OUTPUT_D(0X00); // Khoi tao Port D.
SET_TRIS_D(0X00); // Cau hinh PORTD la ngo ra.
}

void init_PORTB(void)
{
OUTPUT_B(0X00); // Khoi tao Port B.
SET_TRIS_B(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++)
{
OUTPUT_B(a[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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–)
{
OUTPUT_B(a[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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;
OUTPUT_B(~b[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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;
OUTPUT_B(~b[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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–)
{
OUTPUT_B(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–)
{
OUTPUT_B(a[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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;
OUTPUT_B(~b[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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–)
{
OUTPUT_B(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–)
{
OUTPUT_B(a[i]); // Xuat ma hien thi.
OUTPUT_D(scancode); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(0x00); // Chong lem hien thi.
scancode = scancode >> 1; // Dich ma quet LED.
}

for(i=dat_dis-7;i<=dat_dis-8+k;i++)
{
OUTPUT_B(a[i]); // Xuat ma hien thi.
OUTPUT_D(scancode1); // Xuat ma quet (ACT = 1).
delay_ms(2); // Tan so quet LED – 3ms.
OUTPUT_D(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

Có thể bạn quan tâm

Để lại bình luận