PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Hướng Dẩn làm LED 8x8, 8x16, 74hc595 và PIC (http://www.picvietnam.com/forum/showthread.php?t=14712)

lambaotrung 16-04-2012 11:16 PM

Hướng Dẩn làm LED 8x8, 8x16, 74hc595 và PIC
 
1 Attachment(s)
Chào mọi người Mình cũng là 1 người đang học về VDK PIC, chỉ mới thôi còn rất non.
Cái hôm muốn gởi đến các bạn là cách hiện thị led Matrix 8x16 từ cơ bản đến chạy chữ và hướng phát triển đến tối đa theo kiến thức của Mình biết.
Bắt đầu vào việc thì mình xin cảm ơn bác LongTu trong diễn đàn của PICVIETNAM của chúng ta rất nhiều, Vì anh ấy đã tặng tụy giúp mình rất nhiều kiến thức về VDK, chắc các bạn điều biết đến bác longtu, anh ấy cũng là người viết rất nhiều bài chia sẻ kinh nghiệm về làm modell GPS.

I. Phần giới thiệu và dưa chử lên LED 8x8:
1. Đầu tiền thì mình sẽ giúp các bạn hiểu về LED Matrix 8x8:
Rất để tìm trên goole.
2. Nguyên lý làm việc của ic 74hc595:
Lên google bắm chử “ datasheet 74hc595” là ra hết.
Mình chỉ giởi thiệu về 4 chân cơ bản củ 595.


Chân 14: là chân DATA input dưa dử liệu vào thanh ghi của IC. Tăt nhiên 1 con IC 595 chỉ chứ 1 dc 1bye =8 bit dử liệu.
Chân 11: là chân Shift_clock, khi tạo 1 xung cao thấp ( 1,0) tại chân để đưa dử liệu từ chân 14 vào RAM của 595
Chân 12: là chân Latch_clock, khi tạo 1 xung ( 1,0 ) ở chân này thì nó sẻ đưa 8 bit dử liệu từ RAM ra 8 chân Q.
Chân 10: là chân cho phép xuất hay ko xuất dử liệu “ chân này ta để trống ở trường hợp này.

3. Cách tạo font chử bằng excell:

file đính kèm ở cuối bài.

4. Cách viết chương trình và giải thuật giúp hiễn thị từ 595 sang LED 8x8:
Về đoạn này khi các bạn đã nắm dc nguyên tắc hoạt động của 595 và led ma trix thì chúng tả sẻ dể dàng viết chứ lên led 1 cách dể dàng
a. Việc đầu tiền là các bạn tạo 1 chu kỳ thơi giàn để mình dưa giá trị ra 595, ơ đây mình timer 2 của PIC để định thời quét led.
b. Tạo vòng lập để đưa toàn bộ dử liểu từ mãng hiển thị lên 595 ở đây mảng hiễn thị của mình là char const buffer_mh[8]={…… code PICVIETNAM…};, mãng chúng ta có 8 thành phần vì chúng ta chỉ làm 1 led 8x8 thui.
Vòng lặp chúng ta sẽ viết trong timer2 sẻ viết như sao.
//--------------------------code ------------------//
#int_timer2
void timer2()
{
INT i,y ;
for(i=0;i<8;i++)
{
//------------------- vòng lặp đưa dử liệu vào 595-----//
for(y=0;y<8;y++)
{
DATA=bit_test(buffer_mh[y],i); // đưa giá trị vào 959
SHIFT_CLOCK=1;
SHIFT_CLOCK=0;
}
// khi đã nạp đủ 8 bit vào 595.
LATCH_CLOCK=1; // lúc này chúng ta cho 595 xuất ra 8 chân Q.
LATCH_CLOCK=0;
//-----------------------------------------------------------------//
//--------------- cách quát hàng bằng 595/--------------//
// cách này sẽ giúp tiết kiệm chân cho PIC, cách viết tương tự trên//
for(y=0;y<8;y++)
{
c4=bit_test(~hang[i],y);
c3=1;
c3=0;
}
c5=1;
c5=0;
//----------------------------- END --------------------------------------//

ở chổ này thi mọi người sẻ hiện thị dực ngững gì có trong mãng buffer_mh. Khá là đơn giản hé cách bạn cứ thể tăng dần số led matrix lên thành 2 con 3 con thì 595 củng tăng theo như led. Như vậy code mình sẽ thay đổi thoe số con 595 tăng dần.
//---------------------------------------- CODE ---------------------------------------------------------------
#int_timer2
void timer2()
{
INT i,y ;
INT IC=1 ; // ic=1 ở d6ay9 là chúng ta chỉ dùng 1 con
for(i=0;i<8;i++)
{
//------------------- vòng lặp đưa dử liệu vào 595-----//
for(y=0;y<8*IC;y++) // chú ý chổ này.
{
//-- như vậy các bạn sẻ tăng số IC 595 lên và biến IC củng thay đổi theo--//
//----------------------------------- END ----------------------------------------------------------


II. Làm cho LED chạy chử :
Cũng rất đơn giản cách bạn ah. Ta tạo them 1 biến index và khai báo lại cho mảng buffer_mh của mình như sau

Char const buffer_mh[8][32]={ nội dung phải có 32 thành phần }
Nếu chử nghĩa nhiều quá thi các bạn có thể tăng lên buffer_mh[8][64], ….. tùy nhé.

Quay lại biến index thì chúng ta sẻ tăng hoặc giảm dần biến này tùy thoe mình muốn chạy chữ từ “trái sang phải “ hay từ “phải sang trái”
Cú pháp như sau



//----------------------Code -------------------------//
Int Index=0;

Void main()
{
//------------ Khai bao ngắt,set_tris…..---------------//

While(true)
{
Index++;
Delay_ms(10); // cái này nó quyết định tốc dộ dịch chuyển của chúng ta.
If(index>=32) index=0; // để làm nó chạy đi chạy lại.
}

}
//---------------------------- END -------------------//



Trong phần dưa dử liệu vào 595 chúng ta sẻ viết lại tý như sau:
//--------------------------code ----------------------//
#int_timer2
void timer2()
{
INT i,y ;
Int ic=2; //---------- ở đây ta tăng lên 2 con Led Matrix.
for(i=0;i<8;i++)
{
//------------------- vòng lặp đưa dử liệu vào 595-----//
for(y=0;y<8*ic;y++)
{
DATA=bit_test(buffer_mh[0][index*y],i); // đưa giá trị vào 959
SHIFT_CLOCK=1;
SHIFT_CLOCK=0;

//------------ hoàn thiện các phần còn lại nhé------------------//
//------------------------- END ------------------------------//
• Ghi chú:
Để giúp các bạn dể hiểu hơn mình sẻ đính kèm phần protues mô phỏng của mình lên cho cách bác về tìm hiểu nhé.


Đây là lần đầu tiền mình chia sẻ các bài mình biết có gì sai sốt mong người thông cảm và chỉ bảo thêm.

lambaotrung 20-04-2012 05:18 PM

ở bài viết trên em chỉ có thể làm chử chạy từ trái sáng hoặc từ phải sang. nhưng làm từ trên chạy xuống hay từ dưới chạy lên thi mình phải làm cách nào.... có bạn nào biết chỉ giúp em.

vuduyhieu15 17-07-2012 12:00 AM

minh cung moi tim hieu ve cai nay b cho minh hoi c5 va c4,c3 dung lam gi? và minh cũng không thấy khai báo biến ở trên

long91 04-10-2012 12:45 AM

sao nhieu cai khac nhau vay

long91 04-10-2012 01:35 AM

ban co viet ro dk ko

msh_mta 30-01-2013 03:06 PM

cảm ơn bạn rất nhiều..bài viết rất ý nghĩa..\
mình có một thắc mắc trong ví dụ của bạn như sau..mong bạn giải thích hộ mình..bạn giải thích hộ mình đoạn code sau như thế nào với..
enable_interrupts(global);
enable_interrupts(int_timer2);
setup_timer_2(t2_div_by_4,255,1);
set_timer2(0);
tại sao phải dùng ngắt ở đây hả bạn

khongquangduy 24-05-2013 07:55 PM

có ai biết led matrix thực tế chân các cột các hàng đc đấu nối như thế nào không

sipeogit 07-01-2014 01:32 PM

code của ban khi chỉnh sừa thì báo thiếu file khaibao.c . ban có thế up lên không

illusion 23-02-2014 11:33 AM

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG,NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use fast_io(b)
#use fast_io(d)
#use delay(clock=20000000)
int buffer_mh[32]={0xc3,0xe7,0xff,0xdb,0xc3,0xc3,0xc3,0xc3,0xc3,0xc 7,0xcf,0xcb,0xdb,0xf3,0xe3,0xc3,0x3f,0x63,0x63,0x6 3,0x63,0x3f,0x03,0x03,0x3e,0x7f,0x63,0x63,0x73,0x7 30,0xff,0xfe
};
#bit SHIFT_CLOCK=0x06.1
#bit LATCH_CLOCK=0x06.3
#bit c4=0x7.4
#bit c3=0x07.3
#bit c5=0x07.5
int data;

#int_timer2
void timer2()
{
INT i,y ;
for(i=0;i<8;i++)
{
//------------------- vòng l?p dua d? li?u vào 595-----//
for(y=0;y<8;y++)
{
DATA=bit_test(buffer_mh[y],i); // dua giá tr? vào 959
SHIFT_CLOCK=1;
SHIFT_CLOCK=0;
}
// khi dã n?p d? 8 bit vào 595.
LATCH_CLOCK=1; // lúc này chúng ta cho 595 xu?t ra 8 chân Q.
LATCH_CLOCK=0;
//-----------------------------------------------------------------//
//--------------- cách quát hàng b?ng 595/--------------//
// cách này s? giúp ti?t ki?m chân cho PIC, cách vi?t tuong t? trên//
for(y=0;y<8;y++)
{
c4=bit_test(~hang[i],y);
c3=1;
c3=0;
}
c5=1;
c5=0;
//----------------------------- END --------------------------------------//




Cho em hỏi cái dòng c4=bit_test(~hang[i],y); chổ ~hang[i],y);
là sao vậy?? và e phải viết thế nào để xuất ra được?? em mới học còn mập mờ quá :(

illusion 24-02-2014 02:21 PM

ai giúp em về cái này cái với á á .... :p


Múi giờ GMT. Hiện tại là 01:58 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam