Quét LED matrix

dotana

Trứng gà
Không biết diễn đàn mình có anh chị hay bạn nào làm mạch led matrix rồi cho xin cái code với giải thuật chứ mình quét nó ra chữ nhưng nháy nháy nhìn rất khó chịu. Đã thử tăng giảm thời gian, tắt led khi dich rồi mà vẫn chưa hết cái bệnh nháy, một điều nữa là khi quét độ sáng của LED giảm đi đáng kể! có cách nào để nó sáng bình thường và chạy mượt mà như mấy cái biển quang báo như ở mấy chỗ ngân hàng không???
Cảm ơn nhiều!
À mình dùng cách quét hang nhưng vẫn cứ bị! Bạn nào có cao kiến xin chỉ giúp
 

nguyenquoctrung-hhk

Thành Viên PIF
chắc bạn là người mới vào diễn đàn nên chưa hiểu, diễn đàn không thích kiểu xin xỏ code, nếu bạn gặp khó khăn về vấn đề nào hãy đưa phần mình đã làm, mọi người cùng tham khảo mới biết bạn thiếu xót chổ nào, mọi người cùng đóng góp ý tưởng thì đề tài của bạn sẽ hoàn thành thôi.
 

dotana

Trứng gà
chắc bạn là người mới vào diễn đàn nên chưa hiểu, diễn đàn không thích kiểu xin xỏ code, nếu bạn gặp khó khăn về vấn đề nào hãy đưa phần mình đã làm, mọi người cùng tham khảo mới biết bạn thiếu xót chổ nào, mọi người cùng đóng góp ý tưởng thì đề tài của bạn sẽ hoàn thành thôi.
#include <16F887.h>
#use delay(clock=4M)
#fuses NOWDT ,HS ,NOPUT ,NOPROTECT ,NODEBUG , NOBROWNOUT , NOLVP , NOCPD //, NOWRT
//#use rs232(baud=9600,xmit=PIN_c6,rcv=PIN_c7) //
//#use i2c(Master,slow,sda=PIN_C4,scl=PIN_C3)// 100KHz
#use fast_io(b)
#use fast_io(d)
#define SCK PIN_C2 //shift register clock input
#define DAT PIN_C0 //serial data input
#define SCL PIN_C1 //storage register clock input
#define CONTROL PORTD
const char font[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,0xFE,2,2,0,0xFE,0x12,0x12,0x12,0xEC,0,0x7E,0x80,0x80,0xFE,0,0x7C,0x82,0x82,0x7C,0,0xFE,2
,2,0xFC,0,0x7C,0x82,0x92,0x74,0,0,0x10,0xFE,0x92,0x82,0x7C,0,0xF8,0x14,0x12,0x14,0xF8,0,0xFE,0,0
,0xFE,0x10,0x10,0xFE,0,0x7C,0x82,0x82,0x7C,0,0x7C,0x82,0x82 ,0x44 ,0 ,0 ,0xFE ,0x8A ,0x8A ,0x74 ,0 ,0xF8 ,0x14 ,0x12
,0x14 ,0xF8 ,0 ,0x7C ,0x82 ,0x82 ,0x44 ,0 ,0xFE ,0x10 ,0x10 ,0xFE ,0 ,0 ,0xFE ,0x28 ,0x44 ,0x82 ,0 ,0xFE ,0x10 ,0x10 ,0xFE ,0
,0x7C ,0x82 ,0x82 ,0x7C ,0 ,0xF8 ,0x14 ,0x12 ,0x14 ,0xF8 ,0 ,0 ,2 ,2 ,0xFE ,2 ,2 ,0 ,0xFE ,0x12 ,0x12 ,0x12 ,0x0C ,0x80
,0xFE ,0x10 ,0x10 ,0xFE ,0 ,0x7C ,0x82 ,0x82 ,0x44 ,0 ,0xFE ,4 ,8 ,4 ,0xFE ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
const char hang[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int8 i=0,j=0,a,b;
void led595()
{
for(b=0;b<=4;b++){
for(i=0;i<=7;i++)
{
for(j=0;j<=31;j++) //dua 32 bit o vi tri thu i cua moi byte vao
{
if (bit_test(font[a+j],i)) output_high(DAT);
else output_low(DAT);
output_high(PIN_C2);
output_low(PIN_C2); //bo sung them gia tri dieu kien
}
output_d(hang);
output_high(PIN_C1);
output_low(PIN_C1);
delay_ms(2);
}
}
}
void main()
{
output_high(PIN_C1);
output_high(PIN_C2);
set_tris_c(0xff);
set_tris_d(0x00);
while(1)
{
a=0;
for(a=0;a<=140;a++)
{
led595();
}
}
}



Xin lỗi vì mình viết cai code không được trong sáng lắm, dùng CCS do hồi đó chưa biết sử dụng hàm nào trong MPLAB tương ứng với cái hàm bit_test trong CCS, giờ khắc phục được rồi!
Mình không lên diễn đàn để xin xỏ code, cái mình quan tâm là dùng cách nào để quét không nháy thôi, có thể là sử dụng timer hay gì gì đó, mình thì chỉ viết bằng cách hình dung của mình là cho quét đi quét lại để tạo delay-> Bị nháy.

File proteus mô phỏng: Xin đừng nói là mô phỏng không giống với thực tế vì trong trường hợp này mình đã đổ kit rồi, và tình trạng giông với mô phỏng!
Bạn nào có cao kiến chỉ giúp!
Cảm ơn!View attachment LedMatrix8x32.rar
 

2death

Cố Vấn CLB
Staff member
Chào em,
Chị có ý kiến nhỏ nhỏ thế này :D

Nếu có thể sửa được phần cứng, em nên dùng con thanh ghi dịch 74HC595, nó có thể xuất mức logic 0 hay 1 gì đó và giữ giá trị đó (latch) mà em khỏi phải quét vòng vòng (quét hoài chóng mặt), như vậy có thể giải quyết được các vấn đề:

1. Dễ code hơn :D
2. Khi quét Led thì tốn dòng nuôi cho Led hơn (hình như chị có đọc 1 lần trên forum dientuvietnam về cái công thức tính dòng nuôi led nếu mình dùng cáchquetst vòng vòng này, em lên đó tìm lại nhé, bài viết đó hướng dẫn rất kĩ, có cả hướng dẫn giải thuật quét led sao cho không bị nháy nữa). Như vậy dùng thanh ghi dịch đỡ tốn dòng cho Led hơn.

Có điều lưu ý là con 595 này giao tiếp SPI với PIC (thật ra là cũng dễ, các anh thi LED Design đều đã làm qua, nếu em muốn dùng thử thì cứ hỏi nhé, sẽ có bạn trả lời.
P/S: mà thật ra cách kết nối với con 595 này + code SPI trên forum mình có rồi, giờ chị không nhớ là nó ở mục nào :D
 

dotana

Trứng gà
Dạ chị ơi em sử dụng 595 để dịch mà! để đệm dòng em sử dụng ULN2803 của TI, có trở hạn hạn dòng, các chân Anot chung dùng transitor để cấp dòng , treo trở ở ngõ ra của ULN2803, các con 595 nối tiếp với nhau , các chân ngõ vào chỉ cần 3 chân là Data, Clock, và chân Latch để xuất thôi!
Với 595 em chưa biết sử dụng SPI với nó nên trên code em post em tự tạo xung rồi đưa dữ liệu vào bằng tay thôi!
Trên code nếu em không quét vòng vòng thì không tạo được thời gian delay cần thiết để hiện cái chữ đó lên ( ví dụ em muốn chữ T hiện khoảng thời gian 300ms thì em phải cho nó quét đi quét lại vài lần ). Đó là lí do em hỏi diễn đàn mình có cách nào mà không phải quét vòng vòng vậy hay không! Tại em thấy mấy cái biển quảng cáo họ làm chạy mượt nhìn đã thiệt nên em cũng muốn học hỏi!
Xin chị góp ý thêm!
Cảm ơn chị!
P/S: diễn đàn đó em có đọc cũng khá nhiều nhưng chưa thấy, để em kiếm lại thử!
 
nguyên tắc làm quang báo bằng led matrix thì phải quét thôi em không còn cách nào khác . vì nó là led matrix mà. em xem chỉnh lại thời gian delay giữa các lần hiển thị xem sao. trong các bảng quang báo dài thì người ta dùng phương pháp quét hàng chứ không ai dùng phương pháp quét cột cả. vì số hàng ít nên quét hàng sẽ đảm bảo thời gian quét.
 

dotana

Trứng gà
nguyên tắc làm quang báo bằng led matrix thì phải quét thôi em không còn cách nào khác . vì nó là led matrix mà. em xem chỉnh lại thời gian delay giữa các lần hiển thị xem sao. trong các bảng quang báo dài thì người ta dùng phương pháp quét hàng chứ không ai dùng phương pháp quét cột cả. vì số hàng ít nên quét hàng sẽ đảm bảo thời gian quét.
Dạ cái này em biết, ý em là không biết mấy người làm bảng quang báo đó người ta quét kiểu gì mà chữ chạy cứ như màn hình, còn em quét thì nó cứ nháy nháy, nhìn một hồi đau cả mắt luôn
 
đó là do em chọn thời gian delay giữa các lần quét chưa đúng em cứ thử thay đổi thời gian thử xem.
 

Manhdd

Cố Vấn CLB
Staff member
PortC phải là output chứ nhỉ!

Kiểu quét vòng vòng của bạn nhìn nhức đầu thật =.= . Bạn nên sử dụng nhiều hàm con để chương trình dễ đọc hơn. Như thêm hàm dịch bit => dịch hàng, dịch cột, ...

Để làm chủ cách hiển thị, nên sử dụng timer. Trạng thái của ma trận do 1 mảng toàn cục làm chủ, gọi là font[] (mỗi phần tử đại diện cho 1 hàng, mỗi bit cho 1 led). Việc quét ma trận do ngắt timer đảm nhiệm hoàn toàn. Chương trình chính chỉ cần thay đổi biến font[] thì ma trận sẽ thay đổi theo, ngoài lúc đó có thể làm việc khác (delay, lcd, uart, ...).
Tạo font giống như tạo mảng. MPLab hỗ trợ bạn khai báo kiểu nhị phân, dễ quan sát:
Code:
int Font_A[16] = {  
                    0b00000000,
                    0b00000000,
                    //...
                    0b00000000};
// Các trình biên dịch khác có cách khai báo biến nhị phân khác
Bạn có viết thêm các hàm thay đổi font đã có: Dịch trái, dịch phải, xoay, lật, ...
Bạn tham khảo isr timer của mình (viết cho arm):
Code:
void TIMER16_1_IRQHandler()
{
     if (LPC_TMR16B1->IR & 0x01) // interrupt flag is set
     {
        if (matrix_mode == 0)
        { 
            LPC_TMR16B1->IR = 1;   // clear interrupt flag
    	    LPC_TMR16B1->TCR = 0;	// disable timer
            return;
	}
	if (MTICK>15)
		MTICK=0;
        // Display leds at row MTICK
        matrix_shiftrow(1<<MTICK);  
        matrix_shiftcol(Font[MTICK]);
        ///////////////////////////////////////
	MTICK++;
        LPC_TMR16B1->IR = 1;   // clear interrupt flag
	}
	return;
}
 

khoakovie

Trứng gà
đã quét led thì phải dùng timer thôi bạn ,chu kì quét mới cố định ,khi vào ngắt timer thì xuất biến data ra port rồi chốt 595,biến data là vị trí của data trong mảng khai báo .trong chương trình chính ta còn làm việc khác như cập nhập data ...
tính dòng qua led thì cũng như PWM thôi ,ví dụ chu kì quét (ngắt timer) là 4ms bạn quét 8 hàng thì mỗi hàng sẽ sáng trong 4*1/8 ms dòng trung bình qua led = 1/8 dòng đỉnh(dòng tính toán) ,vd dòng để led sáng là 10mA ,vì quét 8 hàng nên ta tính sao cho dòng qua 1 con led là 10mA*8= 80mA
 
Top