You are on page 1of 12

ĐiÊu khi n ma trn 8*8 dch ch

ViӃt bӣi Administrator


Thӭ bҧy, 17 Tháng 1 2009 12:33
Bài này tôi giӟi thiӋu vӟi các pác làm led ma trұn 8x8 đơn giҧn dùng chip Psoc.

HiӋn thӏ chӳ " BIENDT" ta quét cӝt

   

1 LED ma trұn 8*8. HiӋn này trên thӏ trưӡng có loҥi LED 8*8 hai mҫu đӓ và xanh

Xác đӏnh cho chân LED ma trұn. Ta dùng đӗng hӗ xác đӏnh cũng đưӧc . Vì mӛi ma trұn LED
đưӧc cҩu tҥo bӣi bӣi các hàng và các cӝt trong đó các hàng là cӵc Anot cӫa LED và cӝt là Katot
cӫa LED.
Hay các pác có thӇ xem hình dӟi đây đӇ xác đӏnh:

ĐӇ như trên thì thӭ tӵ chân như sau: Đây là LED hai mҫu đӓ (D) và xanh (X) vӟi hàng chung
hay Anot chung!

Nhìn trên thӭ tӵ đó thì : H1 D1 X1 H2 D2 X2 H3 D3 X3 H4 D4 X4


H5 D5 X5 H6 D6 X6 H7 D7 X7 H8 D8 X8

Ӓ đây tôi chӍ dùng mҫu đӓ thôi!


     
Vӟi mҥch trên tôi dùng

+ A1015 đӇ kích dòng cho các hàng


+ ULN2803 đӇ әn đӏnh dòng đӇ đèn sáng đӅu

     
  
Tҥi mӛi thӡi điӇm ta chӍ có mӝt đèn LED trên 1 cӝt sáng do ta quét 8 cӝt vӟi tҫn sӕ nhanh do mҳt
con ngưӡi có sӵ lưu ҧnh nên tҥi mӝt thӟi điӇm ta sӁ nhìn thҩy toàn bӝ kí tӵ. ĐӇ cho đèn D1 sáng
ta phҧi cho vào hàng 1 điӋn áp 5V và cӝt 1 điӋn áp âm.

Đӕi vӟi mҥch trên do ta sӱ dөng A1013 nên chân điӅu khiӇn vào Bazo phҧi là 0V. Nên ta phҧi
tính các ký tӵ hiӋn thӏ ӣ mӭc 0.tӭc là mӝt mҧng kí tӵ gӗm 9 phҫn tӱ trong đó có 1 phҫn tӱ đưa tҩt
cҧ các hàng vӅ 0 V đӇ tҳt toàn bӝ hàng đó!

ĐӇ làm chӳ chҥy ta phҧi thêm 1 biӃn vào đӇ hiӋn thӏ các kí tӵ ra hàng!
|

| |
]  ÷ 
Ma trұn LED tӭc Dot Matrix LED là tұp hӧp nhiӅu đèn LED đưӧc bӕ trí thành
dҥng ³ma trұn´ hình chӳ nhұt hoһc vuông vӟi sӕ hàng là a và sӕ cӝt là b. Ma trұn
LED đưӧc dùng rҩt nhiӅu trong các ӭng dөng hiӇn thӏ như các biӇn quҧng cáo, hiӇn
thӏ thay thӃ LCD hoһc thұm chí dùng hiӇn thӏ video«ĐӇ giҧm sӕ lưӧng các đưӡng
điӅu khiӇn, trong các ma trұn LED các LED đưӧc nӕi chung vӟi nhau theo hàng và
cӝt. Sӕ lưӧng LED trên ma trұn LED là axb trong khi sӕ lưӧng ngõ ra bҵng tәng sӕ
hàng và cӝt: a + b. ViӋc điӅu khiӇn 1 ma trұn LED kích thưӟc lӟn đòi hӓi thiӃt kӃ
mӝt mҥch driver và điӅu khiӇn rҩt phӭc tҥp. Vӟi mөc đích giúp bҥn đӑc làm quen
khái niӋm ma trұn LED, trong phҥm vi bài này tôi chӍ trình bày thao tác vӟi 1 ma
trұn LED có kích thưӟc 7x5 (7 hàng, 5 cӝt). ma trұn LED 7x5 thưӡng đưӧc dùng
đӇ hiӇn thӏ các ký tӵ trong bҧng mã ASCII thay cho Text LCD. Tuy nhiên, bҥn có
thӇ ghép các ma trұn LED này lҥi đӇ hiӇn thӏ các loҥi hình ҧnh bҩt kǤ có đӝ phân
giҧi thҩp. Hình 1 mô tҧ mӝt cҩu trúc cӫa mӝt ma trұn LCD 7x5 vӟi 12 ngõ ra đưӧc
đһt tên tӯ C0«C4 và D0«D6 (C đҥi diӋn cho Control line và D là Data line).

Hình 1. Ma trұn LED 7x5.


Bên trong các ô cӫa ma trұn LED là các LED phát sang. Trong mô hình trên,
Cathod (cӵc âm) cӫa các LED trên mӛi hàng đưӧc nӕi chung vӟi nhau và ngõ ra
chung là các ngõ D (Data). Các Anod cӫa các LED trên mӛi cӝt đưӧc nӕi chung
tҥo thành các đưӡng C (Control). Thông thưӡng, các đưӡng D và C đưӧc chӑn sao
sӕ sӕ lưӧng đưӡng D nhiӅu hơn đưӡng C hoһc sao cho sӕ lương các đưӡng D gҫn
nhҩt vӟi sӕ 8, 16, 32«(lũy thӯa cӫa 2). Lý do cӫa viӋc chӑn này nhҵm giҧm kích
thưӟc bӝ font chӭa các ký tӵ hoһc hình ҧnh hiӇn thӏ lên ma trұn LED, bҥn sӁ hiӇu
rõ hơn khi tìm hiӇu các điӅu khiӇn ma trұn LED 7x5 bên dưӟi.

a) b)
Hình 2 mô tҧ cách mà ma trұn LED 7x5 đưӧc dùng đӇ hiӇn thӏ sӕ 4.
Trưӟc hӃt chúng ta sӁ khҧo cách cho sang các LED mà không cҫn quan tâm
đӃn bҧng font. Quan sát cӝt thӭ nhҩt (cӝt C0) trong hình 2a, trong cӝt này chӍ có 2
LED ӣ hàng D2 và D3 là sang, các LED còn lҥi tҳt. ĐiӅu này đưӧc thӵc hiӋn bҵng
cách kích chân C0 (Anod) lên mӭc cao, kéo các chân D2, D3 xuӕng mӭc 0 trong
khi các chân Data khác đưӧc giӳ ӣ mӭc cao. Các cӝt khác đưӧc thӵc hiӋn tương tӵ.
Tuy nhiên, câu hӓi ӣ đây là làm sao hiӇn thӏ các cӝt vӟi các đèn LED sáng khác
nhau trong khi các ngõ Cathod cӫa chúng đӅu đưӧc nӕi chung (thành các chân D).
Ví dө mӝt ngưӡi kéo tҩt cҧ 5 chân C0«C4 lên mӭc cao vào xuҩt tín hiӋu ra các
chân D, khi đó tҩt cҧ các LED trên dùng mӝt hàng sӁ sáng hoһc tҳt như nhau. ³Bí
quyӃt´ ӣ đây chính là kӻ thuұt ³quét´, chúng ta sӁ hiӇn thӏ tuҫn tӵ các cӝt vӟi các
giá trӏ tương ӭng cӫa chúng chӭ không hiӇn thӏ đӗng thӡi. Trong ví dө hiӇn thӏ sӕ
µ4¶, trưӟc hӃt hãy kích chân C0 lên cao trong khi các chân C1«C4 ӣ mӭc thҩp,
xuҩt tín hiӋu ra các chân D đӇ hiӇn thӏ lên cӝt C0. TiӃp theo kéo chân C1 lên cao và
các chân Control khác ӣ mӭc thҩp, xuҩt dӳ liӋu ra các chân D đӇ hiӇn thӏ cӝt
C1«Cӭ như thӃ cho đӃn khi hiӇn thӏ hӃt các cӝt thì quay lҥi cӝt C0. Quá trình này
gӑi là ³quét LED´. Do tӕc đӝ ³quét´ rҩt cao nên chúng ta sӁ không có cҧm giác
³nhҩp nháy´, các cӝt cӫa ma trұn như đưӧc hiӇn thӏ đӗng thӡi. Chú ý là đӝ sáng
cӫa LED phө thuӝc vào sӕ cӝt LED, nӃu bҥn ³quét´ quá nhiӅu cӝt LED, tӍ lӋ thӡi
gian ³ON´ cӫa mӛi cӝt sӁ rҩt nhӓ so vӟi thӡi gian ³OFF´ vì phҧi chӡ quét các cӝt
khác. Vì thӃ nӃu ma trұn LED có nhiӅu cӝt hoһc khi ghép nhiӅu ma trұn, các mҥch
driver cҫn đưӧc sӱ dөng đӇ đҧm bҧo đӝ sáng cӫa LED.
Giҧ sӱ mӛi LED đҥi diӋn cho 1 bit và các LED sáng đҥi diӋn cho giá trӏ nhӏ
phân 1 trong khi các LED tҳt là sӕ 0. Hình 2b thӇ hiӋn mô hình sӕ nhӏ phân cho
trưӡng hӧp hiӇn thӏ sӕ 4 trên ma trұn LED 7x5. NӃu xem mӛi cӝt cӫa ma trұn là 1
con sӕ 7 bit thì 5 giá trӏ cҫn thiӃt đӇ hiӅn thӏ sӕ µ4¶ là: 0x0C, 0x14, 0x24, 0x7F,
0x04. Bӝ 5 giá trӏ này tҥo thành mã font cho ký tӵ µ4¶, chúng sӁ đưӧc đӏnh nghĩa
trưӟc và lưu trong bӝ nhӟ cӫa chip điӅu khiӇn (AVR), mӛi lҫn mӝt ký tӵ đưӧc yêu
cҫu hiӇn thӏ, bӝ font tương ӭng cӫa ký tӵ đó sӁ đưӧc ³load´ ra và xuҩt lҫn lưӧt trên
các đưӡng Data, đây chính là lý do tҥi sao chúng ta gӑi các đưӡng D là các đưӡng
Data. Cách ³quét´ LED tôi vӯa trình bày là cách ³quét ngang´, bҥn có thӇ thӵc
hiӋn ³quét dӑc´ nӃu ӭng dөng yêu cҫu. Trong phương pháp quét dӑc, các chân
hàng chung sӁ đưӧc dùng đӇ chӑn hàng cҫn hiӇn thӏ, dӳ liӋu sӁ xuҩt ra theo tӯng
hàng trên 5 cӝt và lҫn lưӧt thay đәi hàng (hàng 0 trưӟc, đӃn 1«và cuӕi cùng là 6).
So sánh 2 cách quét cho trưӡng hӧp ma trұn LED 7x5, rõ ràng trong cách quét
ngang chúng ta chӍ cҫn quet 5 cӝt cho mӛi lҫn LED nên tӍ lӋ thӡi gian ON sӁ cao
hơn (1/5 so vӟi 1/8 cӫa cách quét dӑc). Mһt khác, nӃu thӵc hiӋn quét dӑc chúng ta
cҫn 8 sӕ sӕ đӇ tҥo thành 1 bӝ font cho mӝt ký tӵ và vì thӃ tӕn nhiӅu bӝ nhӟ hơn cho
viӋc lưu trӳ bҧng font. Trong bài hӑc này tôi thӵc hiӋn theo cách quét ngang và
bҧng font cũng đưӧc xây dӵng cho cách quét này.
]]    ! 
Phҫn này tôi minh hӑa cách hiӇn thӏ ma trұn LED 7x5 bҵng AVR. Chúng ta sӁ
thӵc hiӋn trên duy nhҩt mӝt ma trұn LED, cho các ӭng dөng cҫn nhiӅu LED bҥn
đӑc hãy tӵ phát triӇn tӯ ý tưӣng trong phҫn này. Hãy vӁ mӝt mҥch điӋn mô phӓng
bҵng phҫn mӅm Proteus như trong hình 3.
Hình 3. HiӇn thӏ ma trұn LED bҵng AVR.
Các chân C cӫa ma trұn đưӧc nӕi vӟi các chân trên PORTC cӫa chip AVR
ATmega32, và các chân D đưӧc nӕi vӟi PORTD. Hãy tҥo 1 Project bҵng
Programmer Notepad tên DotMatrix và tҥo 2 file tên font.h cùng dotmatrix.c
trong Project này. File font.h chӭa bҧng font cӫa các ký tӵ và file dotmatrix.c là
file chính cho chương trình demo. List 1 trình là mӝt phҫn nӝi dung cӫa file
font.h và List 2 là nӝi dung file dotmatrix.c.
List 1. Bҧng font.
List 2. Chương trình demo.
ĐiӅu cҫn quan tâm đҫu tiên là kích thưӟc bҧng font, trong ví dө này bҧng
font đưӧc xây dөng cho 223 symbol có mã ASCII tӯ 32 đӃn 255 (do các mã
ASCII trưӟc 32 không có symbol tương ӭng nên có thӇ bӓ qua đӇ tiӃt kiӋm bӝ
nhӟ), mӛi symbol cҫn 5 sӕ 8 bits, như thӃ chúng ta cҫn tәng cӝng 1115 byte cho
bҧng font trong khi kích thưӟc SRAM cӫa chip ATmega32 chӍ là 2KB (2048
byte). NӃu dùng SRAM chӭa bҧng font sӁ rҩt phí phҥm vì đây là 1 bҧng tĩnh,
giá trӏ trong bҧng hoàn toàn không thay đәi mà chӍ đưӧc truy xuҩt đӑc. Vì thӃ
chúng ta có thӇ tұn dөng bӝ nhӟ chương trình (Flash) đӇ lưu bҧng font này.
Dòng đҫu tiên trong List 1 chúng ta include header ³pgmspace.h´ đӇ sӱ dөng
các thao tác trên bӝ nhӟ chương trình. TiӃp theo chúng ta khai báo 1 mҧng tĩnh
có tên font7x5 vӟi kiӇu dӳ liӋu là prog_char tӭc là kiӇu char nhưng chӭa trong
bӝ nhӟ chương trình (Program memory). Giá trӏ chӭa trong mҧng font7x5 chính
là dӳ liӋu cӫa bҧng font, thӵc chҩt mҧng font7x5 là mҧng 1 chiӅu liên tөc, viӋc
tách ra trên nhiӅu dòng có mөc đích giúp ngưӡi đӑc dӉ hình dung khi truy cұp
các giá trӏ cӫa mҧng đӇ xuҩt ra sau này. Bҥn hãy hiӇu rҵng cӭ mӝt tә hӧp 5 sӕ sӁ
tҥo thành mӝt symbol hiӇn thӏ cho ma trұn LED. Dӳ liӋu trong bҧng font đưӧc
sҳp xӃp theo trình tӵ ASCII và đӇ tҥo điӅu kiӋn thuұn lӧi khi truy xuҩt bҧng font
theo mã ASCII cӫa ký tӵ cҫn hiӇn thӏ. Tuy nhiên cҫn chú ý là bҧng font đưӧc
bҳt đҫu cho symbol có mã ASCII là 32 chӭ không bҳt đҫu tӯ mã ASCII 0, vì thӃ
khi truy cұn bҧng font tӯ mã ASCII chúng ta cҫn lҩy mã ASCII trӯ đi 32 đӇ
đưӧc vӏ trí chính xác trong bҧng.

TiӃp theo chúng ta sӁ tìm hiӇu chương trình chính, dòng 3 trong list 2
include file font.h đӇ sӱ dөng bҧng font trong chương trình chính. Các dòng tӯ 5
đӃn 9 đӏnh nghĩa các PORT kӃt nӕi vӟi ma trұn LED, PORTD là Data bus trong
khi PORTC là control lines. Chương trình con void DOTputChar75(uint8_t chr)
trong dòng 11 là thӫ tөc đӑc dӳ liӋu tӯ bҧng font và hiӇn thӏ trên ma trұn LED.
Tham sӕ chr cӫa chương trình này chính là mã ASCII cӫa ký tӵ cҫn hiӇn thӏ trên
ma trұn LED. Dòng 12 khai báo 2 biӃn phө, trong đó biӃn line chӭa tín hiӋu
điӅu khiӇn cho các đưӡng Control. Dòng 13 khai báo mӝt biӃn tҥm tchr dùng
chӭa đӏa chӍ dӳ liӋu cҫn lҩy ra tӯ bҧng font đӇ xuҩt ra các đưӡng Data, vì mã
ASCII là mӝt sӕ 8 bit trong khi sӕ lưӧng dӳ liӋu trong bҧng font lӟn gҩp 5 lҫn
sӕ lương ký tӵ, vì thӃ cҫn khai báo biӃn tchr có kiӇu dӳ liӋu 16 bit. Nӝi dung
chính cӫa đoҥn chương trình này nҵm trong vòng lһp for, biӃn i đҥi diӋn cho sӕ
thӭ tӵ cӫa các chân Control đưӧc cho chҥy tӯ 0 đӃn 4, trong dòng 15
³"#$%"&'()´ xuҩt tín hiӋu điӅu khiӇn ra CTRL_PORT tӭc ra các chân
C. Do biӃn line đưӧc khӣi tҥo bҵng 1 nên ӣ lҫn lһp đҫu tiên giá trӏ
"#$%"&********+, tӭc chân C0 ӣ mӭc cao trong khi các chân còn lҥi
ӣ mӭc thҩp, cӝt đҫu tiên đưӧc chӑn. Sau khi 1 cӝt đã đưӧc chӑn, dòng 16
³"#$%"&,- .#(/# (012345600  7 89:  5: ; '<:)´ đӑc và
xuҩt dӳ liӋu tӯ bҧng font ra các chân Data. Trưӟc hӃt là cách tính đӏa chӍ cӫa dӳ
liӋu trong bҧng font. Như trình bày trong phҫn giҧi thích cho bҧng font, bҧng
này đưӧc chúng ta bҳt đҫu tӯ ký tӵ có mã 32 nên chúng ta cҫn trӯ đi 32 đӇ tham
chiӃu đӃn vӏ trí chính xác trong bҧng font: tchr-32. Ví dө muӕn hiӇn thӏ ký tӵ có
mã chr = 48 (mã cӫa ký tӵ µ0¶), vӏ trí cӫa tә hӧp dӳ liӋu tҥo nên sӕ µ0¶ đưӧc
chӭa trong bҧng font ӣ vӏ trí 16, giá trӏ này đưӧc tính 48-32=16. TiӃp theo, do
mӛi ký tӵ đưӧc tҥo thành tӯ 5 sӕ nên đӏa chӍ thӵc chҩt cӫa sӕ đҫu tiên trong tә
hӧp sӁ là 0 789:5. ĐӇ di chuyӇn trong phҥm vi 5 dӳ liӋu ӭng vӟi 6 cӝt cӫa
ma trұn LED, biӃn i đưӧc cӝng dӗn vào đӏa chӍ này và chúng ta có:   7 89: 
5: ; '. ĐӇ đӑc dӳ dӳ liӋu dҥng byte tӯ bӝ nhӟ chương trình, chúng ta cҫn dùng
hàm pgm_read_byte, hàm này đưӧc đӏnh nghĩa trong header pgmspace.h đưӧc
khai báo trong file font.h. Như vұy saiu khi thӵc hiӋn
³- .#(/# (012345600  7 89:  5: ; '<:´ chúng ta thu đưӧc dӳ liӋu 1
byte tương ӭng vӟi cӝt thӭ i cӫa ký tӵ chr tӯ bҧng font, viӋc cuӕi cùng có thӇ là
xuҩt giá trӏ này ra DATA_PORT. Tuy nhiên, trưӟc khi xuҩt byte đӑc đưӧc ra
DATA_PORT, chúng ta cҫn đҧo các bit cӫa byte này bҵng toán tӱ ³~´, lý do
đưӧc giҧi thích là do các LED trong ma trұn trong ví vө này có các hàng nӕi vӟi
cӵc âm Cathode, đӇ mӝt LED sáng thì giá trӏ cҫn cҩp cho bit D tương ӭng là 0
nghĩa là ngưӧc lҥi so vӟi cách chúng ta tҥo bҧng font (sáng là 1). ChӍ bҵng mӝt
thao tác đơn giҧn là toán tӱ ³~´ chúng có thӇ dӉ dàng vưӧt qua trӣ ngҥi này.
Trong trưӡng hӧp ma trұn LED có các hàng nӕi vӟi cӵc dương Anode thì chúng
ta không cҫn đҧo giá trӏ đӑc vӅ. Dòng 17 thӵc hiӋn dӏch chuyӇn giá trӏ cӫa biӃn
line sang trái 1 vӏ trí, viӋc làm có tác dөng chuҭn bӏ cho lҫn kӃ tiӃp chân C kӃ
tiӃp sӁ đưӧc kích. Hàm delay trong dòng 18 giúp các LED trong cӝt hiӋn tҥi
sáng trong 1 khoҧng thӡi gian trưӟc khi chuyӇn qua cӝt khác.

Chương trình chính trong ví dө này thұt sӵ rҩt đơn giҧn, chúng ta trưӟc hӃt
cҫn khӣi đӝng hưӟng xuҩt nhұp cho các PORT và sau đó gӑi hàm
DOTputChar75() trong vòng lһp vô tұn while(1). Ӣ ví dө trên, ký tӵ µ4¶ đưӧc
xuҩt ra và kӃt quҧ hiӇn thӏ như trong hình 3. Chú ý là hàm DOTputChar75() chӍ
³quét´ qua các cӝt 1 lưӧt, vì thӃ muӕn hiӇn thӏ mӝt ký tӵ trong mӝt khoҧng thӡi
gian chúng ta cҫn gӑi hàm DOTputChar75() lһp lҥi trong khoҧng thӡi gian đó.
|

You might also like