Professional Documents
Culture Documents
ĐỒ ÁN
TỐT NGHIỆP ĐẠI HỌC
Đề tài:
THIẾT KẾ BẢNG QUẢNG CÁO LED SỬ DỤNG
VI ĐIỀU KHIỂN ATMEGA 16
MODULE ĐIỀU KHIỂN HIỂN THỊ
Hà nội, 5-2009
BỘ GIÁO DỤC VÀ ĐÀO TẠO CỘNG HÒA XÃ HÔI CHỦ NGHĨA VIỆT NAM
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Độc lập - Tự do - Hạnh phúc
-------------------------------------------------- ---------------------------------
Họ và tên sinh viên: .…PHẠM MINH ĐỨC……... Số hiệu sinh viên: …20040847…
Khoá:………...49.……….Khoa: Điện tử - Viễn thông Ngành: ……………….........
1. Đầu đề đồ án:
Thiết kế bảng quảng cáo LED sử dụng vi điều khiển ATMEGA16
Module điều khiển hiển thị
2. Các số liệu và dữ liệu ban đầu:
……………………………………..……………………………………………..……..……………………………
……………………………………………………………………………………………………………………………….
…..………………………..…………………………………………………………………………………….
………………………………………………………………………………………………………………………………
……..….
………………………………………………………………………………………………………………………………
………..….……………………………………………………………………………………………
4. Các bản vẽ, đồ thị ( ghi rõ các loại và kích thước bản vẽ ):
………………………………………………………………………………………………………………………..….
…………………………………………………………………………………………………………………………..
……….………………………………………………………………………………………………………….
5. Họ tên giảng viên hướng dẫn: …………… NGUYỄN TIẾN DŨNG ..……………………
Sinh viên đã hoàn thành và nộp đồ án tốt nghiệp ngày tháng năm
Cán bộ phản biện
2
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
---------------------------------------------------
Họ và tên sinh viên: ............. PHẠM MINH ĐỨC ............ Số hiệu sinh viên: .....20040847......
Ngành: .................................................................................................. Khoá: .............. 49 .........................
Giảng viên hướng dẫn:....................... TS. NGUYỄN TIẾN DŨNG ....................................................
Cán bộ phản biện: .......................................................................................................................................
1. Nội dung thiết kế tốt nghiệp:
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
......................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
...................................................................................................................................................................................................
..........................................................................
Quảng báo được sử dụng trong rất nhiều lĩnh vực của đời sống xã hội . Hầu
như đi đâu ta cũng có thể thấy những bảng quảng cáo với nhiều hình thức khác
nhau. Với mục đích làm nổi bật lên sản phẩm của mình cả khi trời sáng hay tối
người ta đã sử dụng rộng rãi các bảng quảng cáo điện tử. Bảng quảng báo điện tử có
nhiều loại , được sử dụng trong nhiều lĩnh vực khác nhau , có khả năng hiển thị hình
ảnh và màu sắc phong phú . Tuy nhiên do điều kiện có hạn nên trong đồ án này
chúng em mong muốn tìm hiểu về nguyên lý thiết kế một bảng quảng cáo điện tử có
khả năng điều khiển hiển thị các kí tự theo như mong muốn và thiết kế một module
led quảng báo cỡ nhỏ để thử nghiệm.
Đầu tiên chúng em xin cảm ơn sự hướng dẫn chỉ bảo tận tình của thầy
Nguyễn Tiến Dũng . Thầy đã cung cấp cho chúng em các tài liệu về đề tài giúp
chúng em dễ dàng hơn trong quá trình tìm hiểu đồ án . Trong quá trình làm thực
hiện đồ án thầy đã chỉ bảo chúng em mỗi khi gặp khó khăn để đồ án có thể hoàn
thành.
Chúng em cũng xin cảm ơn các thầy cô giáo trong khoa đã tận tình dạy dỗ
chúng em trong nhưng năm học vừa qua đã giúp chúng em có những kiến thức cơ
sở để làm đồ án này.
Sinh viên
4
Tóm tắt đồ án
Nội dung chính của đồ án là việc điều khiển hiển thị led ma trận. Khi điều
khiển hiển thị led ma trận có 2 phương pháp cấp nguồn theo từng hàng hay từng
cột. Đồ án sẽ tập trung trình bày về phương pháp cấp nguồn theo từng cột . Việc cấp
nguồn cho các cột được thực hiện bằng cách sử dụng IC giải mã 74HC138 , cấp
nguồn cho các hàng trong cột được thực hiện bằng cách sử dụng bộ ghi dịch
74HC595. Dữ liệu mã hóa cấp nguồn cho các hàng trong cột được gửi ra bộ ghi
dịch thông qua việc sử dụng SPI của vi điều khiển. Việc điều khiển thời gian cấp
nguồn cho ma trận tạo tốc độ quét được thực hiện bằng cách sử dụng bộ định thời.
Phần cuối của đồ án sẽ trình bày về cách tạo một số hiệu ứng cho ma trận led khi sử
dụng phương pháp cấp nguồn theo cột.
Project abstract
The main content of this project is led matrix display control. There has two
power supply methods for controlling the led matrix : row by row or column by
column . In this project , I will introduce the column once. When using this method,
the 74HC138 decoder is used to power for each column and the 74HC595 shift
register is used to power every row in the column which is chosen by 74HC138.
The data which is coded the power suply for every row in each column is tranfered
to the shift register by using the SPI of the microcontroller. Timing to power the led
matrix can be done by using the timer/counter of the microcontroller. This is the
simple method to controll the scan rate for led matix display. Some led matrix
display effects will be presented in the final part of this document.
5
Mục lục
Lời nói đầu...............................................................................................................4
Phần mở đầu..........................................................................................................10
6
4.2.1) Chức năng của 74HC595..............................................................50
4.2.2) Sử dụng 74HC595để cấp nguồn cho các hàng của ma trận.........51
4.3) Truyền dữ liệu cấp nguồn cho hàng sử dụng SPI....................................54
4.3.1) Atmega16 SPI..............................................................................54
4.3.2) Thiết lập SPI truyền dữ liệu cho 74HC595...................................58
4.3) Kết luận...................................................................................................59
Kết luận..................................................................................................................84
7
Danh sách các hình vẽ
8
Danh sách các công thức
9
Phần mở đầu
Quảng cáo luôn là một trong các vấn đề đóng vai trò quan trọng trong sự
phát triển của một công ty, doanh nghiệp hay thậm chí là của một cửa hàng. Quảng
cáo tốt sẽ đem lại nhiều lợi ích to lớn. Cũng chính vì vậy mà không ngạc nhiên khi
hàng năm các doanh nghiệp đã đầu tư rất nhiều vào vấn đề này. Một trong những
biện pháp được ưa dùng hiện nay đó là sử dụng bảng quảng cáo bằng đèn LED, vì
sự đơn giản, hiện đại, bắt mắt, chi phí hợp lý cũng như tính hiệu quả của nó. Những
bảng thông tin, cổng chào hay những bảng LED quảng cáo với màu sắc sặc sỡ, bắt
mắt, gây nhiều chú ý chắc hẳn đã không còn xa lạ đối với người dân, nhất là người
dân đô thị.
Quảng cáo bằng đèn LED hiện nay được ứng dụng rất rộng rãi trong nhiều
ngành, nhiều lĩnh vực. Nó không chỉ giới hạn bởi việc hiển thị các dòng chữ, các
biển hiệu nhấp nháy mà còn có thể hiển thị các hình ảnh đồ họa, các hình ảnh full
colour và đặc biệt là có thể hiển thị được cả video. Nó cũng không chỉ giới hạn
trong việc quảng cáo trong nhà (indoor), bán ngoài trời (semi – outdoor ) mà còn có
thể quảng cáo ở cả ngoài trời, ngay giữa ban ngày với độ sáng và độ sắc nét cao.
(Chương I sẽ giới thiệu chi tiết hơn về vấn đề quảng cáo bằng đèn LED).
Tuy nhiên do còn hạn chế về nhiều mặt nên trong đồ án này chúng em chỉ
giới hạn ở việc hiển thị các dòng chữ được truyền từ máy tính xuống với định dạng
font tiếng anh đã lưu sẵn trong bộ nhớ Flash của AVR và một số hiệu ứng hiển thị
cơ bản.
Trong 2 chương đầu tiên của đồ án chúng em sẽ giới thiệu chung về quảng
cáo bằng bảng LED, giới thiệu hệ thống cũng như sơ lược về vi điều khiển AVR và
họ ATMega 16. Các chương tiếp theo chúng em sẽ trình bày về đóng góp của mình
10
cho đề tài. Các khối khuếch đại công suất và giao tiếp máy tính sẽ được bạn Bùi
Lưu Quỳnh và Nghiêm Xuân Quyền sẽ trình bày nên trong đồ án này em sẽ tập
trung trình bày về việc điều khiển hiển thị, chốt dữ liệu cho ma trận :
- Chương 3 sẽ trình bày về nguyên tắc cơ bản khi điều khiển ma trận led
- Chương 4 sẽ trình bày cề cách sử dụng các IC thông dụng để điều khiển cấp
nguồn cho ma trận led
- Chương 5 sẽ trình bày về cách tạo tần số quét cho ma trận sử dụng timer
- Chương 6 sẽ trình bày về giải thuật tạo một số hiệu ứng hiển thị kí tự trên
ma trận led.
Đồ án đã hoàn thành có thể điều khiển hiển thị các ký tự trên ma trận gồm có
2x3 ma trận led 8x8, có khả năng lựa chọn màu sắc, tốc độ quét, hiệu ứng hiển thị
cho ma trận đồng thời có khả năng mở rộng cho các ma trận kích thức lớn hơn.
11
Chương 1 : Giới thiệu chung
Quảng cáo là hình thức tuyên truyền, giới thiệu thông tin về sản phẩm, dịch
vụ, công ty hay ý tưởng. Quảng cáo là những nỗ lực nhằm tác động tới hành vi, thói
quen mua hàng của người tiêu dùng hay khách hàng bằng cách cung cấp những
thông điệp bán hàng theo cách thuyết phục về sản phẩm hay dịch vụ của người bán.
Các nhà hàng, công ty, doanh nghiệp … tham gia các hoạt động quảng cáo không
ngoài mục đích quảng bá hình ảnh, giới thiệu sản phẩm, dịch vụ, thông tin … của
họ để từ đó thu hút được thêm các khách hàng tiềm năng, nâng cao tính cạnh tranh
và đem lại nhiều nguồn lợi cho công ty. Một chiến dịch quảng cáo tốt sẽ góp phần
tích cực vào sự phát triển của doanh nghiệp vì thế cũng có thể nói rằng, quảng cáo
đã, đang và vẫn sẽ tiếp tục đóng một vai trò quan trọng trong cuộc sống của xã hội
loài người hiện nay.
Trên thế giới, quảng cáo hiện nay đã phát triển tới những trình độ cao, tuy
nhiên ở Việt Nam - do còn nhiều hạn chế - nên đa số các sản phẩm quảng cáo vẫn
còn ở trình độ thấp. Các sản phẩm quảng cáo để có thể đến với khách hàng tiềm
năng cần phải được truyền tải qua cac hương tiện truyền thông, như: báo in, tạp chí,
đài phát thanh, truyền hình, báo điện tử.
12
Truyền hình.
Internet.
Báo chí.
Phát thanh.
Quảng cáo trực tuyến.
Quảng cáo qua bưu điện.
Quảng cáo trên các phương tiện vận chuyển.
Quảng cáo qua các trang vàng.
Quảng cáo trên tờ rơi, áp phích, pano hay băng rôn.
Quảng cáo trên bao bì sản phẩm.
Quảng cáo qua các thư gửi trực tiếp.
Quảng cáo truyền miệng.
Quảng cáo bằng đèn LED.
13
điện tử) trong khi khối n tích điện dương (thiếu hụt điện tử và thừa lỗ trống). Ở biên
giới hai mặt tiếp giáp, một số điện tử bi lỗ trống thu hút và khi chúng tiến lại gần
nhau, chúng có xu hướng kết hợp với nhau tạo thành các nguyên tử trung hòa. Quá
trình này có thể giải phóng năng lượng dưới dạng ánh sáng (hay các bức xạ điện từ
có bước sóng gần đó). Tùy theo mức năng lượng giải phóng là cao hay thấp mà
bước sóng ánh sáng phát ra khác nhau (tức màu sắc của LED sẽ khác nhau). Mức
năng lượng (và màu sắc của LED) hoàn toàn phụ thuộc vào cấu trúc năng lượng của
các nguyên tử chất bán dẫn. Thông thường LED có điện thế phân cực thuận cao hơn
các loại đi ốt khác khoảng 1,5 đến 3V nhưng điện thế phân cực ngược ở LED lại
không cao.
Đèn LED có những ứng dụng rất phong phú và rộng rãi : làm bộ phận hiển
thị trong các thiết bị điện, điện tử, trang trí, làm đèn giao thông, các đèn LED phát
ra tia hồng ngoại được dùng trong các thiết bị điều khiển từ xa trong điện tử dân
dụng… thậm chí ngày nay người ta đã và đang nghiên cứu đèn LED phát ánh sáng
trắng để thay thế cho các thiết bị chiếu sáng thông thường như đèn sợi đốt, đèn
neon, đèn compact…Điều này là hoàn toàn có thể và có lẽ là sẽ thành hiện thực
trong một tương lai không xa. Đây chắc chắn sẽ là một bước tiến quan trọng trong
ngành công nghiệp năng lượng vì hiện tại đèn LED trắng có tuổi thọ tới 50.000 giờ
sử dụng, gấp 50 lần so với bóng đèn 60W. Điều này có nghĩa là chúng có thể thắp
sáng liên tục trong vòng gần 6 năm. Hơn thế nữa chúng dùng điện áp thấp nên
không gây cháy nổ mà tiết kiệm điện hơn nhiều so với bóng đèn khác. Một trong
những ứng dụng quan trọng và phổ biến hiện nay của đèn LED chính là trong lĩnh
vực quảng cáo : bảng quảng cáo bằng đèn LED.
14
quảng cáo trong nhà (indoor) và ngoài trời (outdoor) cho hiệu quả cao cũng như gây
sự chú ý đồng thời truyền đạt thông tin đến khách hàng và người đi đường.
Bảng điện tử có thông tin thay đổi được còn được gọi là bảng quang báo hay
màn hình điện tử LED, có nhiều màu sắc, nhiều cách hiển thị sinh động, dễ dàng
thu hút sự chú ý của mọi người. Do dễ dàng thay đổi thông tin trên bảng điện tử nên
đây được xem là phương tiện truyền đạt thông tin hiện đại, nhanh chóng.
Bảng LED quảng cáo được sử dụng cả indoor, outdoor và semi-outdoor :
Bảng indoor sử dụng tốt trong nhà, không sử dụng ngoài trời được vì
không đủ độ sáng và không chịu được mưa nắng.
Bảng outdoor có độ sáng cao, kết cấu chắc chắn, chịu được mưa nắng.
Bảng semi-outdoor có độ sáng cao, sử dụng tốt ngoài trời nhưng chịu
mưa nắng kém nên bảng quảng cáo loại này thường được đặt ở dưới
mái hiên nhà.
Trong lĩnh vực quảng cáo, ứng dụng của đèn LED được thể hiện dưới nhiều
hình thức khác nhau như :
Bảng thông tin điện tử là sản phẩm của ngành công nghệ cao với nhiều ưu
điểm nổi bật đã trở thành một phần không thể thiếu trong nhiều lĩnh vực của cuộc
sống. Điểm nổi bật của bảng thông tin điện tử là khả năng thay đổi thông tin và
phương thức trao đổi thông tin. Với nhiều tính năng độc đáo, bảng thông tin điện tử
(bảng quang báo, bảng điện tử, bảng LED) luôn thu hút được đông đảo sự chú ý
quan sát của nhiều người. Do đó, nó là sản phẩm đắc dụng cho các chương trình
quảng cáo, các bản tin chứng khoán, tài chính…
Cũng vì tính tiện lợi mà bảng thông tin điện tử được ứng dụng rộng rãi ở
nhiều nơi với nhiều mục đích khác nhau như: khách sạn, nhà hàng, trung tâm
thương mại, trụ sở công ty, ngân hàng, sân bay, hiệu vàng, sàn giao dịch chứng
khoán, giao thông hay tại các cổng trào của các tỉnh và thành phố…
15
Được thiết kế rất khoa học nên bảng thông tin điện tử rất dễ dàng khi sử
dụng, có thể điều khiển bằng bàn phím chuyên dụng, bằng nút bấm, điều khiển từ
xa hay máy tính… Không những thế, nó còn rất tiện lợi trong sản xuất, lắp đặt.
Ngoài ra bảng thông tin điện tử còn có các thuộc tính ưu việt khác như : điện
áp thấp, tính ổn định cao, cường độ sáng mạnh, thay đổi nội dung nhanh, dễ dàng,
kỹ xảo hiển thị đa dạng.
Biển hiệu, biển vẫy gây chú ý cho khách đi đường.
Là loại biển quảng cáo điện tử sử dụng đèn LED siêu sáng được lập trình
bằng vi điều khiển tạo nên các hiệu ứng hiển thị khác nhau gây ấn tượng mạnh mẽ
và sự chú ý đặc biệt đối với người đi đường.
Là sản phẩm của ngành công nghệ cao với nhiều ưu điểm nổi bật đã trở
thành một phần quan trọng trong nhiều lĩnh vực cuộc sống. Bảng có khả năng thể
hiện đa dạng các hình bằng chữ, logo và các hình ảnh đồ họa. Có thể đặt màu sắc
khác nhau cho từng dòng chữ hoặc từng chữ, điều chỉnh được tốc độ kỹ xảo. Là
phương thức quảng cáo hình ảnh Logo, giới thiệu về sản phẩm một cách cô đọng
súc tích nhất.
Các loại bảng tỷ giá: bảng giá vàng, bảng giá ngoại tệ, bảng tỷ giá
ngân hàng…
Là bảng thông tin điện tử thiết kế chuyên dụng cho từng ngành (đặc biệt là
ngân hàng), sản phẩm được sử dụng rộng rãi ở các sở giao dịch, phòng giao dich…,
là phương tiện tốt giúp cho việc trao đổi tỷ giá nhanh, thuận tiện. Bảng có nhiều
tính năng dễ sử dụng và thay đổi thông tin qua máy tính.
16
Sản phẩm màn hình Full Colour là dòng sản phẩm mới, ứng dụng những
công nghệ khoa học tiên tiến nhất của ngành LED hiện nay. Sản phẩm được ứng
dụng trong mọi lĩnh vực của xã hội như văn hóa, truyền thông, thể thao, du lịch.
Hiển thị nhiều màu sắc, sắc nét trung thực và sống động là sản phẩm chủ yếu
phục vụ cho lĩnh vực quảng bá thương hiệu, sản phẩm đa dạng về chủng loại, có thể
dùng indoor, outdoor hay semi-outdoor.
Sản phẩm có khả năng hiển thị được tất cả các dạng thông tin quảng cáo,
trình diễn các hình ảnh động, chiếu một đoạn phim video như một màn hình Ti Vi
lớn và còn hơn thế nữa có thể kết nối trực tuyến với mạng máy tính. Sản phẩm cũng
được thiết kế để lắp đặt cả trong nhà lẫn ngoài trời.
Bảng thông tin điện tử dùng cho thị trường chứng khoán:
Khác với đặc trưng hiển thị LED quảng cáo bình thường, đây là bảng hiển thị
thông tin dữ liệu động, thông tin được cập nhật liên tục. Màn hình lớn có thể chia ra
thành nhiều vùng để hiển thị theo từng nhóm thông tin chứng khoán như: tên công
ty, các tiêu đề và các thông số đấu giá, ảnh logo… Thông tin hiển thị được chia
thành các kịch bản chạy song song với nhau trên cùng hoặc khác phân vùng hiển
thị. Thông tin chứng khoán được cập nhật một cách tự động lên bảng điện tử. Màu
sắc thông tin hiển thị trên bảng điện tử thay đổi theo từng mã chứng khoán và phụ
thuộc vào sự tăng giảm giá của mã chứng khoán đó. Điều này giúp cho mọi người
theo dõi thông tin chứng khoán một cách dễ dàng hơn.
Không chỉ có vậy ngày nay bảng LED quảng cáo còn được ứng dụng trong
nhiều ngành, lĩnh vực khác nữa như : bảng thông tin nghiệp vụ cho ngành du lịch,
bưu điện điện tử, ngân hàng điện tử, bảng kết quả xổ số kiến thiết, bảng tỷ số thi
17
đấu thể thao, bảng điện tử dùng cho tín hiệu giao thông… với kiểu dáng phong phú,
thiết kế hiện đại và hiệu ứng bắt mắt cho hiệu quả cao trong lĩnh vực quảng cáo.
Tuy nhiên, do hạn chế về nhiều mặt cũng như ảnh hưởng của suy thoái kinh
tế toàn cầu nên hiện nay ở Việt Nam xuất hiện không nhiều các bảng, biển quảng
cáo hiển thị video, nhưng các bảng quảng cáo hiển thị dạng text dùng để giới thiệu,
quảng bá thương hiệu hay để hiển thị thông tin về các loại hình dịch vụ, sản phẩm
(mức lãi xuất ở ngân hàng, thông tin tại sàn giao dịch chứng khoán, thông tin về
thời gian biểu tại sân bay, kết quả các trận bóng …) … thì vẫn đang phát triển mạnh
mẽ. Đặc điểm ưu việt của loại hình này là dễ dàng thay đổi, cập nhật nội dung cần
hiển thị bằng phần mềm.
18
Giao tiếp máy tính
Led ma trận
Khối giao tiếp với máy tính : có chức năng trao đổi dữ liệu giữa máy tính và
vi điều khiển, truyền các dữ liệu như nội dung hiển thị, màu sắc hiển thị, hiệu ứng
hiển thị ...đến vi điều khiển, đồng thời nhận các dữ liệu đó tại vi điều khiển để có
thể điều khiển hiển thị như mong muốn. Do đó, khối này khi thực hiện gồm có một
phần mềm sử dụng trên máy tính có chức năng giao tiếp với người dùng để chọn
các thông số cần truyền tới vi điều khiển và một số thủ tục để nhận dữ liệu tại vi
điều khiển. Các dữ liệu này sẽ được khối điều khiển hiển thị xử lý để có thể điều
khiển ma trận LED hiển thị nội dung cũng như hiệu ứng mong muốn.
19
Khối điều khiển hiển thị : có chức năng xử lý các dữ liệu mà máy tính
truyền tới để tạo ra các dữ liệu về mức logic cần cấp cho các led trong từng cột
đồng thời điều khiển quá trình cấp nguồn cho led ma trận . Khối này được xây dựng
bằng các thủ tục xử lý dữ liệu trên vi điều khiển . Khi nhận được dữ liệu về chuỗi
ký tự cần hiển thị thì khối này sẽ tạo dữ liệu về mức logic cần cấp cho led ma trận.
Khi nhận được dữ liệu về màu sắc, hiệu ứng hiển thị thì khối này sẽ xác định thủ tục
gửi dữ liệu cho các khối chốt dữ liệu hàng và cột.
Khối chốt dữ liệu hàng : có chức năng chốt các giá trị logic cấp nguồn cho
các hàng của ma trận. Khối này gồm một chuỗi các bộ 74HC595 mắc nối tiếp. Dữ
liệu về mức logic của các hàng và tín hiệu báo chốt dữ liệu sẽ được khối điều khiển
hiển thị gửi đến. Các dữ liệu này sẽ được chốt lại tại đầu ra của khối cho đến khi dữ
liệu mới được yêu cầu chốt.
Khối chốt dữ liệu cột : có chức năng chốt các giá trị logic cấp nguồn cho các
cột của ma trận. Khối này được thực hiện bằng cách sử dụng IC 74HC138. Dữ liệu
về mức logic của các cột sẽ được khối điều khiển hiển thị gửi đến phù hợp với dữ
liệu của các hàng để có thể hiển thị đúng như mong muốn. Các dữ liệu này sẽ được
chốt lại tại đầu ra của khối cho dến khi dữ liệu mới được yêu cầu chốt.
Khối khuếch đại công suất hàng : có chức năng đảm bảo cấp đủ nguồn cho
các hàng của led ma trận, đồng thời hạn chế dòng chạy qua các chân của các IC
chốt dữ liệu hàng. Để đảm bảo chức năng này khối này gồm các IC ULN2803 mắc
nối tiếp với các IC 74HC595.
Khối khuếch đại công suất cột : có chức năng đảm bảo cấp đủ nguồn cho
các cột của led ma trận, đồng thời hạn chế dòng chạy qua các chân của các IC chốt
dữ liệu cột. Để đảm bảo chức năng này khối được xây dựng gồm các transistor
B562. Cực B của các transistor được điều khiển bởi IC 74HC138.
20
Chương 2 : Giới thiệu về vi điều khiển AVR Atmega16
21
Tốc độ làm việc 16MPIS, với thạch anh 16 MHz.
On_chip 2 cycle multipler.
Bộ nhớ :
ISP Flash với khả năng 10.000 lần ghi xóa.
EEROM.
RAM.
Giao tiếp JTAG :
Khả năng quét toàn diện theo chuẩn JTAG.
Hỗ trợ khả năng Debug onchip
Hỗ trợ lập trình Flash, EEROM, fuse…
Lock bit qua giao tiếp JTAG
Ngoại vi :
Timer/ counter 8 bit với các chế độ : so sánh và chia tần số.
Timer/counter 16 bit với các chế độ : so sánh, chia tần số, capture,
PWM.
Timer thời gian thực (Real time Clock) với bộ dao động riêng biệt.
Các kênh PWM.
Kênh biến đổi ADC 10 bit.
Hỗ trợ giao tiếp I2C.
Bộ giao tiếp nối tiếp lập trình được USART.
Giao tiếp SPI.
Watch_dog timer với bộ dao động on_chip riêng biệt.
Những thuộc tính đặc biệt :
Power on reset và Brown-out detection.
Chế độ hiệu chỉnh bộ sai số cho bộ dao động RC on chip
Các chế độ ngắt ngoài và trong đa dạng.
6 mode sleep : Idle, ADC noise reduction, tiết kiệm năng lượng,
power-down, standby, extended standby.
Các phần mềm lập trình cho AVR :
22
AVRStudio, Code Vision. Các phần mềm này có hỗ trợ phần nạp và
Debug on chip.
Ngoài ra có thể dùng chương trình nạp PonyProg2000, Winpic800 …
23
Hình 2 - Cấu trúc bộ nhớ AVR
Bộ nhớ dữ liệu (data memory) : đây là phần chứa các thanh ghi quan trọng
nhất của chip. Bộ nhớ dữ liệu trên các chip AVR có độ lớn khác nhau tùy theo mỗi
chip. Tuy nhiên về cơ bản bộ nhớ này được chia làm các phần :
Tệp thanh ghi (Register file) : gồm 32 thanh ghi 8 bit có địa chỉ tuyệt
đối từ 0x0000 đến 0x001F. Các thanh ghi này được đặt tên là từ R0
đến R31. Chúng có đặc điểm :
• Được truy cập trực tiếp trong các instruction.
• Các toán tử, phép toán thực hiện trên các thanh ghi này chỉ cần
một xung Clock.
• Tệp thanh ghi được kết nối trực tiếp với bộ xử lý trung tâm,
CPU chip.
• Chúng là nguồn chứa các số hạng trong các phép toán và cũng
là đích chứa kết quả
Các thanh ghi vào ra (thanh ghi I/O hay còn gọi là vùng
nhớ I/O) là cổng giao tiếp giữa CPU với thiết bị ngoại vi. Tất cả các
24
thanh ghi điều khiển, trạng thái … của thiết bị ngoại vi đều nằm ở
đây.
RAM ngoại (External RAM) : các chip vi điều khiển
AVR cho phép người dùng có thể gắn thêm RAM ngoài để chứa biến,
vùng này thực chất chỉ tồn tại khi nào người sử dụng gắn thêm bộ nhớ
ngoài vào chip.
EEPROM (Electrical Erasable Programmable ROM) là
một phần quan trọng của các chip AVR mới, vì là ROM nên bộ nhớ
này không bị xóa ngay cả khi không cấp nguồn nuôi chip, rất thích
hợp cho các ứng dụng lưu trữ dữ liệu.
25
Hoạt động :Các lệnh được chứa trong bộ nhớ chương trình Flash Memory
dưới dạng các thanh ghi 16 bit. Bộ nhớ chương trình được truy cập trong mỗi chu
kỳ xung Clock và một lệnh chứa trong Program memory được load vào thanh ghi
lệnh (instruction Register), thanh ghi lệnh tác động cũng như lựa chọn tệp thanh ghi
cũng như RAM cho ALU thực thi. Trong khi thực thi chương trình, địa chỉ của
dòng lệnh đang thực thi được quyết định bởi bộ đếm chương trình – PC (Program
Counter).
AVR có ưu điểm là hầu hết các lệnh đều được thực thi trong một chu kỳ
xung nhịp, vì thế mà trong một số trường hợp dù nguồn clock của AVR nhỏ hơn
một số loại vi điều khiển khác (như PIC) nhưng thời gian thực thi vẫn nhanh hơn.
Atmega16 [3] là bộ vi điều khiển CMOS 8 bit tiêu thụ điện năng thấp dựa
trên kiến trúc RISC (Reduced Intruction Set Computer). Vào ra Analog – digital và
ngược lại. Với công nghệ này cho phép các lệnh thực thi chỉ trong một chu kì xung
nhịp, vì thế tốc độ xử lý dữ liệu có thể đạt đến 1 triệu lệnh trên giây ở tần số 1 Mhz.
26
Vi điều khiển này cho phép người thiết kế có thể tối ưu hoá chế độ độ tiêu thụ năng
lượng mà vẫn đảm bảo tốc độ xử lí.
Sơ đồ khối
Atmega16 có tập lệnh phong phú về số lượng với 32 thanh ghi làm việc đa
năng. Toàn bộ 32 thanh ghi đều được nối trực tiếp với ALU (Arithmetic Logic
Unit), cho phép truy cập 2 thanh ghi độc lập bằng một chu kì xung nhịp. Kiến trúc
đạt được có tốc độ xử lý nhanh gấp 10 lần vi điều khiển dạng CISC (Complex
Intruction Set Computer) thông thường.
27
Khi sử dụng vi điều khiển Atmega16, có rất nhiều phần mềm được dùng để
lập trình bằng nhiều ngôn ngữ khác nhau đó là: Trình dịch Assembly như AVR
studio của Atmel, Trình dịch C như win AVR, CodeVisionAVR C, ICCAVR. C -
CMPPILER của GNU… Trình dịch C đã được nhiều người dụng và đánh giá tương
đối mạnh, dễ tiếp cận đối với những người bắt đầu tìm hiểu AVR, đó là trình dịch
CodeVisionAVR C. Phần mềm này hỗ trợ nhiều ứng dụng và có nhiều hàm có sẵn
nên việc lập trình tốt hơn.
28
Tốc độ xử lí lệnh đến 8 MIPS ở 8 MHz nghĩa là 8 triệu lệnh trên
giây.
Bộ định thời gian thực (RTC) với bộ dao động và chế độ đếm
tách biệt
2 bộ Timer 8 bit và 1 bộ Timer 16 bit với chế độ so sánh và chia
tần số tách biệt và chế độ bắt mẫu.
4 kênh điều chế độ rộng xung PWM.
Có đến 13 interrupt ngoài và trong.
Bộ so sánh Analog.
Bộ lập trình Watch dog timer.
6 chế độ ngủ : Idle, ADC Noise Reduction, Power-save, Power-
down, Standby và Extended Standby.
Giao tiếp nối tiếp Master/Slave SPI.
29
GND: Nối mass.
PortA (PA7…PA0): PortA nhận vào tín hiệu Analog và chuyển
đổi qua tín hiệu Digital. Ngoài ra PortA có thể được tách ra làm vào ra 2
hướng 2 bit nếu bộ chuyển đổi A/D không được sử dụng. Khi các chân
PA0 đến PA7 là các lối vào và được đặt xuống chế độ thấp từ bên ngoài,
chúng sẽ là nguồn dòng nếu các điện trở nối lên nguồn dương được kích
hoạt. Các chân của Port A ở vào trạng thái có điện trở cao khi tín hiệu
Reset ở chế độ tích cực hoặc ngay cả khi không có tín hiệu xung đồng
hồ.
Port A cung cấp các đường địa chỉ/dữ liệu vào/ra hoạt động theo kiểu đa
hợp kênh khi dùng bộ nhớ SRAM ở bên ngoài.
PortB,D : tương tự như PortA.
PortC (PC7…PC0): tương tự như PortA. Nhưng nếu cho phép
giao diện JTAG, thì các chân PC5, PC3, PC2 sẽ hoạt động ngay cả khi
reset lại tín hiệu.
Reset: Lối vào đặt lại. Bộ vi điều khiển sẽ được đặt lại khi chân
này ở chế độ thấp trong hơn 50ns, các xung ngắn hơn không tạo ra tín
hiệu đặt lại.
XTAL1: Lối vào bộ khuếch đại đảo và lối vào mạch tạo xung
nhịp bên trong.
XTAL2: Lối ra bộ khuếch đại đảo : XTAL1 và XTAL2 lần lượt
là lối vào và lối ra của một bộ khuếch đại đảo. Bộ khuếch đại này được
bố trí để làm bộ tạo dao động trên chip. Một bộ tinh thể thạch anh hoặc
một bộ cộng hưởng gốm có thể được sử dụng. Để điều khiển bộ vi điều
khiển từ một nguồn xung nhịp bên ngoài, chân XTAL2 để trống, còn
chân XTAL1 được nối với bộ dao động bên ngoài.
AREF : Là chân chuyển đổi tín hiệu analog cho bộ chuyển đổi
A/D.
AVCC : Là chân nguồn cho Port A và cho bộ chuyển đổi A/D.
Nó có thể tự kết nối với nguồn chính ngay cả khi ADC không được sử
dụng.
30
2.2.2) CPU
Kiến trúc AVR nói chung, các chức năng chính của CPU đảm bảo sự thực thi
chính xác process. CPU phải có khả năng truy xuất bộ nhớ, thực hiện tính toán, điều
khiển thiết bị ngoại vi và các kênh ngắt.
Trong thứ tự thực hiện song song, AVR sử dụng kiến trúc Harvard với bộ
nhớ tách rời giữa hai luồng process và dữ liệu. Các chỉ lệnh trong bộ nhớ process
được thực hiện với những mức pipeline đơn. Trong khi một lệnh dang thực thi, lệnh
tiếp theo sẽ được tìm nạp trước từ bộ nhớ process. Khái niệm này cho phép các lệnh
sẽ được thực hiện trong mọi chu kỳ xung. Bộ nhớ process là hệ thống bộ nhớ Flash
lập trình lại được. Truy xuất nhanh thanh ghi File chứa 32*8 bit thanh ghi làm việc
đa năng với một chu kỳ xung đơn truy xuất thời gian. Điều này cho phép bộ tính
toán ALU làm việc đơn chu kỳ.
6 trong 32 thanh ghi có thể sử dụng như 3 địa chỉ gián tiếp thanh ghi con trỏ
cho không gian địa chỉ dữ liệu. Nó cũng có thể được sử dụng như con trỏ của bộ
nhớ process Flash.
Một lệnh AVR có 16 bit đơn định dạng word.
Mỗi địa chỉ bộ nhớ process chứa 16 hoặc 32 lệnh.
Bộ nhớ process Flash được chia ra làm 2 khu vực, khu vực khởi động
process và khu vực ứng dụng process. Cả hai khu vực được thiết kế bảo vệ các bit
ghi và đọc/ghi.
Trong khi các ngắt và process con được gọi, địa chỉ trả về của Counter
process (PC) được lưu trữ trong Stack. Stack được định phần trong dữ liệu tổng
quát SRAM, vì vậy kích thước STACK được hạn chế bởi kích thước SRAM tổng
và cách sử dụng của nó. Tất cả các process sử dụng phải khởi tạo giá trị đầu cho
Stack Poiter trước khi process con hoặc ngắt được gọi. Stack Poiter được đọc/ghi
được sử dụng trong không gian I/O. Dữ liệu SRAM có thể dễ dàng được truy xuất
qua 5 cách đánh địa chỉ khác nhau hộ trợ trong kiến trúc AVR. Không gian bộ nhớ
trong kiến trúc AVR là tất cả những bản đồ bộ nhớ phổ biến tuyến tính. Một module
ngắt linh hoạt có những thanh ghi điều khiển trong không gian I/O với một ngắt
31
toàn cục cho phép ngắt trong thanh ghi trạng thái. Tất cả các ngắt đều có vector ngắt
riêng biệt trong bảng vector ngắt. Địa chỉ vector ngắt càng thấp quyền ưu tiên ngắt
càng cao.
Không gian bộ nhớ I/O chứa 64 địa chỉ cho các chức năng ngoại vi CPU như
thanh ghi điều khiển,SPI, và một số chức năng I/O khác.
32
Chứa thông tin về kết quả của các tính toán được thực thi gần nhất. Chú
ý Status Register được thay đổi sau tất cả các phép tính toán trong ALU.
Bit 7 6 5 4 3 2 1 0
I T H S V N Z C
Bit 7-I : cho phép ngắt toàn cục. Không cho phép người sử dụng
tự ý xóa. Chỉ bị xóa khi có ngắt mới xuất hiện và được chỉ dẫn bởi RETI
cho những ngắt kế tiếp. Có thể được đặt hoặc được xóa bởi SEI và CLI.
Bit 6-T : bit lưu trữ. Có thể chép từ BST sang BLD và ngược lại.
Bit 5-H : Cờ nhớ nửa H sử dụng để nhớ nửa hữu ích trong phép tính số
BCD.
Bit 4-S : tín hiêu bit S = N ⊕ V
Bit 3-D : 2 cờ tràn
Bit 2-N : cờ phủ định.
Bit 1-Z : cờ zero
Bit 0-C : cờ nhớ.
33
Một toán hạng ngõ ra 16 bit và một kết quả ngõ vào 16 bit.
Bit 15 14 13 12 11 10 9 8
SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8
SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0
Bit 7 6 5 4 3 2 1 0
Read/Write R/W R/W R /W R/W R/W R/W R/W R/W
R/W R/W R /W R/W R/W R/W R/W R/W
Khởi tạo 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Thanh ghi Stack Poiter luôn trỏ đến đỉnh của ngăn xếp.
Stack Poiter trỏ đến ngăn xếp dữ liệu SRAM lưu trữ những process con
và những ngắt cục bộ. Khoảng trống trong SRAM phải được định nghĩa bởi
process trước bất kỳ process con nào gọi nó thực thi hoặc ngắt nào được hoạt
động. Stack Poiter giảm đi 1 khi dữ liệu được đẩy lên trên Stack với lệnh
PUSH, và giảm đi 2 khi trả về địa chỉ được đẩy lên trên Stack với sự gọi
process con hoặc ngắt được gọi. Stack Poiter tăng lên 1 khi dữ liệu được đưa ra
34
khỏi Stack với lệnh POP, và tăng lên 2 khi dữ liệu được đưa ra khỏi Stack trả về
từ process con RET hoặc trả về từ ngắt RETI.
Stack Poiter AVR được bổ xung như 2 thanh ghi 8 bit trong không gian
I/O. Số lượng các bít được sử dụng là sự thi hành phụ thuộc. Chú ý không gian
dữ liệu trong bổ xung của kiến trúc AVR nhỏ nên chỉ sử dụng thanh ghi SPL,
trong trường hợp này không có thanh ghi SPH.
Khi AVR thoát khỏi 1 ngắt, nó sẽ luôn trả về process chính và thực thi hơn
một lệnh trước khi tạm dừng ngắt. Chú ý thanh ghi trạng thái không tự động lưu trữ
35
khi vào một thủ tục ngắt và cũng không tự phục hồi khi thoát ra khỏi thủ tục. Khi sử
dụng lệnh CLI để cấm các ngắt thì ngắt sẽ không trực tiếp bị cấm. Không có ngắt
được thực thi sau lệnh CLI ngay cả khi xuất hiện đồng thời với lệnh. Xem ví dụ
sau :
Ghi bằng Assembly
Ghi bằng C
Ghi bằng C
36
lên trên Stack. Vector ngắt nhảy đến ngắt trong process con và lệnh ngắt này sẽ đưa
ra 3 chu kỳ xung. Nếu một ngắt xuất hiện trong khi thực thi nhiều chu trình lệnh,
thì lệnh sẽ được trước khi ngắt được thực hiện. Nếu một ngắt xuất hiện khi MCU ở
chế độ ngủ, ngắt thực thi yêu cầu thời gian tăng bởi 4 chu kỳ xung.
Trở về từ ngắt process con đưa rad 4 chu kỳ xung bộ đếm chương trình sẽ
được đưa ra từ Stack, Stack Poiter tăng thêm 2 và I-bit trong SREG được lập.
2.2.3) Bộ nhớ
Phần này mô tả các bộ nhớ khác nhau trong Atmega16. Kiến trúc AVR có 2
bộ nhớ chính : bộ nhớ dữ liệu và bộ nhớ process. Bổ xung thêm vào đặc tính AVR
một bộ nhớ EEPROM lưu trữ dữ liệu.
37
Có tới 1120 địa chỉ ô nhớ cho bộ nhớ nhập xuất, thanh ghi file và SRAM
nội. 96 đường địa chỉ đầu tiên dành riêng cho thanh ghi file và bộ nhớ vào ra và còn
1024 đường địa chỉ còn lại cho SRAM nội.
38
Atmega16 chứa 512 byte bộ nhớ dữ liệu EEPROM. Nó được tổ chức như
một không gian dữ liệu riêng biệt, mỗi byte đơn có thể đọc và ghi. EEPRAM có khả
năng thực hiện 100.000 chu kỳ ghi/xóa. Truy xuất giữa EEPRAM và CPU được mô
tả theo đặc tả thanh ghi địa chỉ, thanh ghi dữ liệu và thanh ghi điều khiển EEPROM.
Bit 15 14 13 12 11 10 9 8
- - - - - - - EEAR8
EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0
Bit 7 6 5 4 3 2 1 0
Read/Write R R R R R R R R/W
R/W R/W R/W R/W R/W R/W R/W R/W
Khởi tạo 0 0 0 0 0 0 0 X
X X X X X X X X
MSB LSB
39
EEPROM ghi hoạt đọng, thanh ghi EEDR chứa dữ liệu ghi tới EEPROM trong
địa chỉ đưa bởi thanh ghi EEAR. Cho hoạt động đọc EEPROM, EEDR chứa dữ liệu
đọc ngoài từ EEPROM tại địa chỉ đưa bởi EEAR.
40
Ghi dữ liệu mới EEPROM tới EEAR (tùy chọn).
Ghi logic 1 tới bit EEMWE trong khi ghi EEWE trong EECR về 0.
Trong 4 chu kỳ xung đồng hồ sau khi lập EEMWE ghi logic 1 cho
EEWE.
41
Chương 3 : Nguyên tắc điều khiển led ma trận
Led ma trận bao gồm các led đơn được xếp thành hàng và cột . Các led đơn
trong cùng một hàng thì được nối chung anot (catot) còn trong cùng một cột thì
được nối chung catot (anot). Do đó để các led có thể sáng ta phải cấp nguồn cho led
như sau : cấp mức cao (thấp) cho hàng và mức thấp (cao) cho cột.
Với cách sắp xếp như trên tại một thời điểm ta không thể hiển thị một kí tự
(với trên 2 hàng 2 cột) trên ma trận. Do đó để có thể hiển thị một kí tự trên led ma
42
trận thì ta phải lợi dụng hiện tượng lưu ảnh trên võng mạc. Ta phải để cho từng
hàng (cột) của kí tự lần lượt kiện thị trên led ma trận với tần số cao. Trước tiên ta
phải xác định mức logic cần cấp cho từng hàng (cột) của led ma trận để hiển thị ký
tự rồi lưu các giá trị logic này lại. Sau đó khi cần hiển thị ký tự thì ta lần lượt đưa
các giá trị này ra các chân cấp nguồn cho hàng (cột) đồng thời cấp nguồn cho cột
(hàng) tương ứng với nó.
Để cụ thể hơn ta xét ví dụ hiển thị chữ R trên led ma trận 8x8 theo cách quét
lần lượt từng cột ma trận. Do quét theo từng cột nên ta sẽ phải xác định mức logic
cần cấp cho tất cả các led trong từng cột. Giả thiết các led cùng hàng mắc chung
anot, các led trong cùng một cột mắc chung catot. Khi đó nếu muốn một led nào đó
trong cột sáng thì ta phải cấp điện áp mức cao vào hàng tương ứng.
H H H H
H H
H H
H H H H
Nhìn vào
H H
bảng trên ta thấy
muốn hiển thị chữ H H
43
Cột 4: H , L , L , H , L , H , L , L
Cột 3: H , L , L , H , H , L , L , L
Cột 2: H , L , L , H , L , L , L , L
Cột 1: H , H , H , H , H , H , H , L
Các led trong các cột khác được cấp điện áp mức thấp .
Các giá trị này cần được lưu lại trong bộ nhớ của vi điều khiển để khi cần ta
có thể lấy ra. Ta có thể lưu các giá trị này thành từng byte trong bộ nhớ theo trật tự
từ hàng 1 tới hàng 8 hay ngược lại. Ví dụ cột 1 ta lưu theo thứ tự từ hàng một tới 8
thì lưu giá trị 0F8H còn nếu ngược lại thì là 7FH .
Việc mã hóa font phụ thuộc vào cách cấp nguồn cho ma trận led. Nếu ta cấp
nguồn cho từng cột của ma trận led sáng lần lượt thì font chữ phải lưu các giá trị
logic mã hóa cách cập nguồn cho tất cả các led trong cột đó. Giả sử ta mã hóa font 6
cột 8 hàng ( 5 cột mã hóa chữ 1 cột tạo khoảng cách 2 chữ kế tiếp) như đã nêu trong
nguyên tắc điều khiển led thì mỗi kí tự cần 6 byte dữ liệu để lưu.
Để tiện cho việc truy xuất dữ liệu ta có thể khai báo 1 mảng trong bộ nhớ
Flash của Atmega16 lưu các dữ liệu này. Khi đó địa chỉ đầu của dữ liệu mã hóa 2
ký tự gần nhau thì cách nhau cách nhau 6. Vì vậy khi biết được vị trí của 1 kí tự
trong font thì ta có thể xác định địa chỉ của dữ liệu mã hóa kí tự đó. Trên cơ sở đó
ta có thể dễ dàng xuất dữ liệu của kí tự cần hiển thị ra .
Sau khi xác định được các mức logic cần cấp cho ma trận led thì ta có thể
tiến hành điều khiển quá trình cấp nguồn cho led ma trận để có được hình ảnh như ý
muốn. Việc cấp nguồn cho led ma trận phụ thuộc vào cách mã hóa dữ liệu (theo
từng hàng hay theo từng cột của ma trận). Nếu dữ liệu mã hóa là các hàng trong 1
cột (hàng) thì tại một thời điểm ta chỉ cấp nguồn cho một cột (hàng . Quá trình điều
khiển hiển thị led ma trận 8x8 theo từng cột (hàng) bao gồm các bước sau :
- B1: Lấy mẫu dữ liệu : lấy các dữ liệu về mức logic cần cấp cho các cột
(hàng) của ma trận
- B2: Bắt đầu với cột i=1.
44
- B3: Cấp nguồn cho cột i
- B4: Xuất dữ liệu tương ứng với cột đó ( đã được lấy mẫu từ trước) để cấp
nguồn cho các hàng của ma trận
- B5: i=i+1 ; quay lại bước 2 nếu i>8 ,nếu không thì quay lại bước 3
Bắt đầu
i=1
i=i+1
T F
i>8
Tóm lại để điều khiển led ma trận ta đầu tiên ta cần phải xác định được
phương pháp cấp nguồn cho ma trận ( cấp nguồn theo từng cột hay từng hàng ). Sau
khi đã xác định được phương pháp cấp nguồn ta cần phải xây dựng font chữ cho
phù hợp với cách cấp nguồn. Từ đây ta có thể tiến hành điều khiển việc cấp nguồn
cho ma trận để dòng chữ trên ma trận hiển thị như mong muốn.
46
Chương 4: Điều khiển cấp nguồn cho led ma trận
Chương này sẽ trình bày về cách điều khiển cấp nguồn cho ma trận sử dụng
phương pháp cấp nguồn theo từng cột. Việc điều khiển cấp nguồn cho các cột được
thực hiện bằng cách sử dụng IC 74HC138. Các hàng của ma trận sẽ được cập nguồn
bằng cách sử dụng bộ ghi dịch 74HC595. Các dữ liệu mã hóa font được truyền nối
tiếp từ vi điều khiển tới bộ ghi dịch bằng cách sử dụng SPI .
IC 74HC138 là bộ giả mã 3 đầu vào ( A0,A1,A2) 8 đầu ra phủ định (Y0 đến
Y7 ). Nó có 3 đầu vào cho phép : 2 đầu vào tích cực thấp ( E1 , E 2 ) và một đầu vào
tích cực mức cao (E3). Tất cả các đầu ra của 74HC138 sẽ ở mức cao trừ khi E1 , E 2
ở mức thấp và E3 ở mức cao. Khi các đầu vào E1 , E 2 ở mức thấp và E3 ở mức cao
thì đầu ra của 74HC138 sẽ được quyết định bởi đầu vào .
47
Bảng 4 - Chức nămg hoạt động của 74HC138
Theo nguyên tắc quét ma trận led thì tại mỗi thời điểm ta chỉ cấp nguồn cho
một cột của ma trận do đó có thể dung 74HC138 để cấp nguồn cho các cột của ma
trận . Các đầu vào ( A0,A1,A2) của 74HC138 sẽ được nối với các chân của vi điều
khiển, các đầu ra của 74HC138 được nối với các cột của ma trận led thông qua một
cổng phủ định ( hoặc các bộ đệm dòng cấp nguồn cho cột ), còn các chân E1 , E 2
được nối đất, E3 nối dương nguồn .Thông qua việc gửi tín hiệu từ vi điều khiển tới
các chân đầu vào của 74HC138 ta có thể chọn được cột cần cấp nguồn .
48
Hình 4 - Ghép nối 74HC138 với vi diều khiển dể cấp nguồn cho cột của ma trận
Khi mở rộng ma trận ta tăng thêm số lượng IC để cấp nguồn cho tất cả các
cột, các IC này có thể cùng nối chung hoặc riêng chân điều khiển. Hoặc chỉ sử dụng
một IC nhưng cấp nguồn đồng thời cho tất cả các ma trận, khi đó một chân của IC
sẽ được nối với các cột của các ma trận khác nhau .
49
4.2) Điều khiển cấp nguồn cho hàng dùng 74HC595
50
Bảng 4 - Chức năng hoạt động của 74HC595
4.2.2) Sử dụng 74HC595để cấp nguồn cho các hàng của ma trận
Khi dùng 74HC595 để cấp nguồn cho ma trận led ta nối các đầu ra song song
của 74HC595 với các chân cấp nguồn cho hàng của ma trận. Đồng thời phải sử
51
dụng 3 chân của vi điều khiển để nối với các chân DS,SH_CP,ST_CP của
74HC595. Các bit dữ liệu mã hóa mức logic cần cấp cho các hàng của 1 cột ma trận
sẽ được truyền liên tiếp DS của 74HC595. Để đồng bộ bit thì vi điều khiển mỗi khi
xuất 1 bit tới chân DS sẽ phát một xung có sườn dương vào chân SH_CP. Sau khi
truyền xong hết dữ liệu, để các led trên cột sáng thì ta phải chuyển dữ liệu trong
thanh ghi dịch vào các đầu ra của 74HC595 bằng cách cấp 1 xung sườn dương vào
chân ST_TP. Chú ý để IC có thể hoạt động và đẩy dữ liệu ra các chân đầu ra thì
chân OE phải nối đất, chân MR nối dương nguồn.
Hình 4 - Ghép nối 74HC595 với vi điều khiển để cấp nguồn cho hàng của ma
trận
Khi mở rộng ma trận led ta ghép nhiều 74HC595 nối tiếp nhau: các chân
SH_CP được nối chung với 1 nguồn cấp xung, các chân ST_CP cũng được nối
chung với nhau, đầu ra Q7’ của IC phía trước được nối với đầu vào DS của IC tiếp
theo. Khi đó dữ liệu sẽ được dịch đồng bộ từ IC này sang IC khác và đầu ra của các
IC cũng được chốt đồng bộ.
52
Hình 4 - Ghép nối tiếp các IC 74HC595
53
4.3) Truyền dữ liệu cấp nguồn cho hàng sử dụng SPI
Ở chế độ Slave, chân Slave Select ( SS ) phải đặt là đầu vào .Khi chân này bị
kéo xuống mức thấp thì SPI sẽ hoạt động, chân MISO có thể đặt làm đầu ra, các
chân khác là đầu vào. Khi chân SS được kéo lên mức cao ở mức cao SPI ngừng
nhận dữ liệu từ bên ngoài vào. Chân SS có tác dụng đồng bộ byte, gói giúp cho bộ
54
đếm bit của slave đồng bộ với bộ phát xung của master. Khi SS bị kéo lên mức cao
thì SPI slave sẽ tái lập lại mức logic truyền và nhận, đồng thời xóa dữ liệu đã nhận
trong thanh ghi dịch.
Ở chế độ Master, ta có thể đặt SS làm đầu ra hay vào tùy ý :
Nếu SS được đặt làm đầu ra thì nó không làm ảnh hưởng tói SPI , nó chỉ có tác
dụng điều khiển mức logic cho chân SS của SPI slave.
Nếu SS được đặt làm đầu vào thì nó phải được giữ ở mức cao để đảm bảo các
hoạt động của SPI master. Nếu SPI bị kéo xuống mức thấp bởi thiết bị ngoại vi thì
nó sẽ hiểu đó là một Master khác nên sẽ đặt lại SPI ở chế độ Slave và bắt đầu truyền
dữ liệu. Để tránh xung đột trong quá trình này SPI tiến hành các thủ tục sau:
- Xóa bit MSTR trong thanh ghi SPCR để SPI ở chế độ Slave. Do đó các chân
MOSI và SCK trở thành đầu vào.
- Thiết lập mức cao cho cờ SPIF trong thanh ghi SPCR. Nếu ngắt SPI và ngắt
toàn cục được cho phép thì quá trình ngắt sẽ được thực hiện.
55
Bit 4 - MSTR : Master/Slave Select
Bit có tác dụng chọn chế độ cho SPI : Master nếu ở mức cao, Slave nếu ở mức
thấp. Nếu chân SS được đặt làm đầu vào thì khi chân này bị kéo xuống mức thấp thì
MSTR sẽ bị xóa và SPIF được thiết lập mức cao. Do dó người dùng sẽ phải đặt
MSTR trở lại mức cao nếu muốn tiếp tục sử dụng chế độ Master.
Bit 3 – CPOL :Clock Polarity:
Khi bit này được ghi 1 thì SCK ở mức cao khi rỗi, ngược lại thì SCK ở mức
thấp khi rỗi.
56
SPI2X SPR1 SPR0 Tần số SCK
0 0 0 fosc/4
0 0 1 fosc/16
0 1 0 fosc/64
0 1 1 fosc/128
1 0 0 fosc/2
1 0 1 fosc/8
1 1 0 fosc/32
1 1 1 fosc/64
Bit 7 6 5 4 3 2 1 0
Read/Write R R R R R R R R/W
Khởi tạo 0 0 0 0 0 0 0 0
MSB LSB
57
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Khởi tạo X X X X X X X X
Do việc giao tiếp giữa vi điều khiển và 74HC595 chỉ là quá trình truyền dữ
liệu từ vi điều khiển đến 74HC595 nên ta có thể thiết lập cho SPI ở chế độ master
với cách sắp xếp dữ liệu theo trật tự bit có trọng số cao thì mã hóa cho hàng ở trên
và các đầu ra của 74HC595 cũng được nối với các chân của ma trận led theo trật tự
trên thì ta đặt bit DORD=0 .
Các giá trị cần nạp cho thanh ghi :
58
SPCR=0x50
SPSR=0x00
Sau đó trong chương trình mỗi khi muốn gửi 1 byte nào đó ra ta có thể dùng
lệnh trong CodeVisionAVR :
spi(byte) ;
Lệnh này cho phép gửi 1 byte từ vi điều khiển qua chân MOSI tới thiết bị
ngoại vi.Sau đó nếu muốn chốt dữ liệu ta cần phải sử dụng 1 thủ tục để gửi 1 sườn
dương tới chân ST_CP của 74HC595 thông :
void latchdata( ) {
PORTB.3=0;
PORTB.3=1;
}
Khi cấp nguồn cho ma trận tùy theo kích thước của ma trận mà ta có thể sử
dụng nhiều phương pháp khác nhau. Với các ma trận đủ nhỏ ta có thể sử dụng các
chân của vi điều khiển để trực tiếp điều khiển việc cấp nguồn cho ma trận. Với ma
trận lớn thì cần phải dùng các IC hỗ trợ cho việc điều khiển cấp nguồn cho ma trận.
Khi cấp nguồn cho ma trận theo từng cột thì ta có thể sử dụng các IC có tác dụng
chọn kênh để cấp nguồn cho ma trận, tại mỗi thời điểm mỗi IC này chỉ cấp nguồn
cho 1 cột của ma trận . Đối với các hàng trong cột thì ta có thể dùng các bộ ghi dịch
để cấp nguồn. Khi cấp nguồn thì ta cần chú ý việc cấp phát dữ liệu của các hàng
phải tương ứng với cột được cấp nguồn.
59
Chương5: Tạo tần số quét cho ma trận
Để đảm bảo cho hình ảnh hiển thị rõ nét thì ta cần phải điều chỉnh tần số hiển
thị cho phù hợp . Tần số hiển thị càng cao thì hình ảnh càng rõ nét . Dùng bộ định
thời của vi điều khiển giúp ta có thể điều khiển tần số hiển thị của ma trận led. Mỗi
khi ngắt định thời được thực hiện thì ta sẽ cho một cột của ma trận sáng . Qua đó ta
có thể tính được tần số hiển thị của ma trận bằng 1/8 tần số ngắt. Chương sẽ giới
thiệu về một số chế độ của Timer1 và các thanh ghi dùng để thiết lập chế độ , sau đó
sẽ trình bày về cách thiết lập thanh ghi dùng cho việc điều khiển tần số quét led ma
trận.
60
Khối bắt tín hiệu đầu vào khá dễ sử dụng ở chế độ thường nhưng cần phải
chú ý tới khoảng thời gian lớn nhất giữa các sự kiện ngoài, khoảng thời gian này
phải không vượt quá độ phân giải của bộ đếm. Nếu khoảng thời gian giữa các sự
kiện quá dài ta có thể dùng ngắt tràn hay tăng độ rộng xung đếm để có thể mở rộng
độ phân giải cho khối này .
b) Chế độ CTC ( clear timer on compare) :
Trong chế độ CTC (WGM13:0 = 4 hoặc 12), thanh ghi ICR1 hoặc OCR1A
được sử dụng tạo độ phân giải cho bộ đếm. Trong chế độ CTC bộ đếm bị xóa về 0
khi giá trị bộ đếm (TCTN1) trùng với giá trị của thanh ghi OCR1A (WGM13:0 = 4)
hoặc ICR1 (WGM13:0 = 12). Thanh ghi OCR1A hoặc ICR1 định nghĩa giá trị đỉnh
cho bộ đếm.
Một ngắt có thể phát ra khi giá trị bộ đếm đạt tới giá trị TOP bởi cùng sử
dụng cờ OCF1A hoặc ICF1. Nếu ngắt được cho phép, thủ tục điều khiển ngắt có thể
được sử dụng để cập nhập lại giá trị TOP. Thay đổi TOP bằng giá trị gần với
BOTTOM khi bộ đếm đang chạy với độ rộng xung lớn phải thực hiện cẩn thận .
Nếu giá trị mới ghi cho OCR1A hoặc ICR1 thấp hơn so với giá trị của TCNT, bộ
đếm sẽ không bắt được thời điểm đạt giá trị TOP. Do đó nó sẽ đếm tới giá trị MAX
(0xFFF) rồi quay về 0x0000 trước khi có thể có thể gặp đượcgiá trị TOP. Để có thể
tạo sóng đầu ra trong chế độ CTC, đầu ra OC1A có thể lật mức logic của nó mỗi khi
bắt gặp giá trị top bằng cách thiết lập các bit chọn chế độ so sánh đầu ra COM1A1:0
61
= 01. Giá trị của chân OC1A sẽ không được cập nhật nếu ta không thiết lập nó là
đầu ra (DDR_OC1A=1). Sóng phát ra từ chân OCA1 sẽ có tần số cực đại của fOC1 A
= f clk _ I /O khi OCR1A được lập về 0x0000. Tần số của sóng được tính như sau:
Công thức 5 - Quan hệ giữa tần số đầu ra với tần số timer ở chế dộ CTC
f clk _ I / O
f OCnA =
2.N .(1 + OCRnA)
N thể hiện độ chia tần ,có thể là các giá trị sau : 1, 8, 64, 256, 1024
log(TOP + 1)
RFPWM =
log(2)
62
Hình 5 - Giản đồ thời gian chế độ Fast PWM
Cờ tràn Timer/Counter (TOV1) được lập mỗi khi Counter tới giá trị TOP.
Ngoài ra chân OC1A hoặc ICF1 được thiết lập trong cùng một chu kỳ xung với thời
điểm TOV1 được thiết lập. Nếu ngắt được cho phép, thủ tục điều khiển ngắt có thể
được sử dụng để cập nhập lại TOP và các giá trị so sánh. Khi thay đổi các giá trị
TOP ta phải chắc chắn giá trị TOP mới lớn hơn hoặc bằng giá trị của tất cả các
thanh ghi so sánh nếu không sẽ không có sự gặp nhau giữa TCNT1 và OCR1x .
Thủ tục cập để nhập lại ICR1 khác với 0CR1A khi sử dụng để định nghĩa giá
trị TOP. Thanh ghi ICR1 không có 2 bộ đệm. Nếu ICR1 thay đổi tới 1 giá trị thấp
hơn TCNT1 khi bộ đếm đang chạy thì nó sẽ đếm tớ giá trị MAX (0xFFFF) và quay
lại giá trị 0x0000 . OCR1A có bộ đẹm kép nên có thể ghi lên nó bất kỳ lúc nào. Khi
OCR1A I/O được ghi, giá trị ghi sẽ được đưa vào trong thanh ghi đệm OCR1A.
Thanh ghi so sánh OCR1A sẽ cập nhập lại ghía trị trong thanh ghi đệm tại chu kỳ
sau khi TCNT1 đạt giá trị TOP.
Trong chế độ fast PWM, khối so sánh cho phép tạo ra 1 dạng sóng tại chân
OC1x. Thiết lập các bit COM1x1:0 tới 2 có thể tạo ra một dạng PWM không đảo và
một PWM đảo bằng cách thiết lập COM1x1:0 lên 3. Giá trị tại chân OC1x chỉ quan
sát được nếu chân này được thiết lập là đầu ra (DDR_OC1x). Dạng sóng PWM
được sinh ra khi thiết lập (xóa) chân OC1x tại thời điểm OCR1x = TCNT1 và xóa
(thiết lập) OC1x tại thời điểm bộ đếm bị xóa ( từ TOP về BOTTOM).
63
Tần số PWM tại đầu ra có thể được tính theo hàm:
Công thức 5 - Quan hệ giữa tần số đầu ra với tần số timer ở chế độ Fast PWM
log(TOP + 1)
fOCnxPWM =
log(2)
N thể hiện độ chia tần ,có thể là các giá trị sau : 1, 8, 64, 256, 1024
d) Chế độ Phase Correct PWM
Chế độ này hoạt động dựa trên hai sườn lên xuống.Bộ đếm sẽ đếm liên tục từ
giá trị BOTTOM đến giá trị MAX và sau đó từ giá trị MAX đến giá trị
BOTTOM.Trong chế độ so sánh không đảo chân so sánh (OCx) sẽ bị xóa khi giá trị
TCNTx bằng giá trị OCRx trong quá trình đếm lên và sẽ được thiết lập bằng 1 khi
giá trị so sánh xuất hiện trong quá trình đếm xuống.Chế độ so sánh đảo thì các giá
trị là ngược lại.Với hoạt động hai sườn xung này thì chế độ này không tạo ra được
tần số nhỏ như chế độ một sườn xung. Nhưng do tính cân đối của hai sườn xung thì
nó tốt hơn cho điều khiển động cơ .
Chế độ phase correct PWM hoạt động cố định là 8 bít.Trong chế độ này bộ
đếm sẽ tăng cho đến khi đạt giá trị MAX, khi đó nó sẽ đổi chiều đếm. Biểu đồ thời
gian sau đây mô tả hoạt động của hoạt động quá trình:
Bit 7 6 5 4 3 2 1 0
COM1A1/ COM1A0/ Mô tả
COM1B1 COM1B0
0 0 Port hoạt động thông thường.Không kết nối
OC1A/OC1B.
0 1 Lật trạng thái OC1A/OC1B
1 0 Xóa OC1A/OC1B
1 1 Thiết lập OC1A/OC1B
65
Bit3,2 : cưỡng chế so sánh ở các chế độ không điều chế xung.
Bit1,0 : Được sử dụng kết hợp với các bít WGM12 và WGM13 để xác định chế độ
của bộ định thời :
Bảng 5 - Các chế độ điều chế xung
Chế WGM13 WGM12 WGM11 WGM10 Chế độ hoạt động của timer TOP Cập nhật Thiết lập
độ OCR1X cờ TOV1
13 1 1 0 1 Reserved - - -
14 1 1 1 0 Fast PWM ICR1 TOP TOP
2.TCCR1B:
Bit 7 6 5 4 3 2 1 0
66
Bit 7 ICNC1: Khi bit này được ghi1 thì các tín hiệu vào từ chân ICP1 sẽ được lọc
nhiễu. Bộ lọc nhiễu cần 4 lần lấy mẫu liên tiếp có giá trị bằng nhau ở chân ICP1. Do
đó tín hiệu vào bị trễ 4 chu kỳ giao động so với khi không lọc nhiễu.
Bit 6 ICES1 : Bit này lựa chọn sườn kích hoạt sự kiện tại chân ICP1. Khi bit này
được ghi 0 thì sườn âm được sử dụng để kích hoạt Khi bit này được ghi 1 thì sườn
dương được sử dụng.
Bit 4,3 WGM13,2 : Cùng với WGM11,0 để để xác định chế độ của bộ định thời
3.TCNT1H/L:
Bit 7 6 5 4 3 2 1 0
TCNT1[15:8]
TCNT1[7:0]
67
Lưu giá trị của bộ đếm. Có khả năng truy nhập trực tiếp để ghi và đọc thông
qua việc sử dụng thanh ghi tạm thời. Việc thay đổi thanh ghi này trong khi bộ đếm
đang hoạt động có thể bỏ qua một lần gặp nhau giữa TCNT1 và các thanh ghi
OCR1x .
4.OCR1AH/L:
Bit 7 6 5 4 3 2 1 0
OCR1A[15:8]
OCR1A[7:0]
5.OCR1BH/L:
Bit 7 6 5 4 3 2 1 0
OCR1B[15:8]
OCR1B[7:0]
Các thanh ghi OCR1x được liên tục so sánh với thanh ghi TCNT1 . Mỗi khi bằng
nhau có thể tạo ra 1 ngắt so sánh đầu ra hay để thay đổi dạng sóng tại các chân đầu
ra OC1x .
6.TIMSK:
Bit 7 6 5 4 3 2 1 0
68
Read/Write R/W R/W R R/W R/W R/W R/W R/W
Khởi tạo 0 0 0 0 0 0 0 0
Các bit 7,6,1,0 dùng cho các timer khác của Atmega16.
Bit 5 - TICIE1 : Khi bit này được thiết lập thành 1 và ngắt toàn cục (global
interrupt) được cho phép thì ngắt bộ đếm đầu vào Timer/couter1 (Timer/Counter1
Input Capture interrupt) được cho phép. Vector ngắt tương ứng sẽ được thực thi khi
cờ ICF1 trong thanh ghi TIFR được thiết lập.
Bit4 - OCIE1A : Khi bit này được thiết lập thành 1 và ngắt toàn cục (global
interrupt) được cho phép thì ngắt so sánh đầu ra 1A (Timer/Counter1 Output
Compare A Match Interrupt) được cho phép. Vector ngắt tương ứng sẽ được thực
hiện khi cờ OCF1A trong thanh ghi TIFR được thiết lập.
Bit3 - OCIE1B : Khi bit này được set thành 1 và ngắt toàn cục (global interrupt)
được cho phép thì ngắt so sánh đầu ra 1B (Timer/Counter1 Output Compare B
Match Interrupt) được cho phép. Vector ngắt tương ứng sẽ được thực thi khi cờ
OCF1B trong thanh ghi TIFR được thiết lập .
Bit2 – TOIE1 : Khi bit này đượcset thành 1 và ngắt toàn cục (global interrupt) được
cho phép thì ngắt cờ tràn bộ định thời 1 (Timer/Counter1 overflow interrupt) được
cho phép. Vector ngắt tương ứng sẽ được thực thi khi cờ TOV1 trong thanh ghi
TIFR được thiết lập .
7.TIFR:
Bit 7 6 5 4 3 2 1 0
69
Các bit 7,6,1,0 dùng cho các timer khác của Atmega16.
Bit5 - ICF1 : Cờ này được thiết lập khi xảy ra sự kiện tại ngõ vào (Input Capture)
của chân ICP1. Khi thanh ghi ICR1 (InputCapture Register) được thiết lập bởi các
bit WGMn3:0 để sử dụng như một giá trị đỉnh thìcờ ICF1 sẽ được thiết lập khi bộ
đếm đạt tới giá trị đỉnh. Cờ ICF1 sẽ tự động xóa khi ngắt tương ứng được thực thi,
hoặc có thể xóa hay thiết lập bằng cách ghi một giá trị logic vào vị trí của nó.
Bit4 - OCF1A : Cờ này được thiết lập ngay sau khi giá trị bộ đếm (TCNT1) bằng
với giá trị thanh ghi OCR1A (Output Compare Register A). Chú ý là một so sánh
cưỡng bức (FOC1A) sẽ không thiết lập cờ này. Cờ OCF1A sẽ tự động xóa khi ngắt
tương ứng được thực thi, hoặc có thể xóa hay thiết lập bằng cách ghi một giá trị
logic vào vị trí của nó.
Bit 3 - OCF1B : Cờ này được thiết lập ngay sau khi giá trị bộ đếm (TCNT1) bằng
với giá trị thanh ghi OCR1B (Output Compare Register B). Chú ý là một so sánh
cưỡng bức (FOC1B) sẽ không thiết lập cờ này. Cờ OCF1B sẽ tự động xóa khi ngắt
tương ứng được thực thi, hoặc có thể xóa hay thiết lập bằng cách ghi một giá trị
logic vào vị trí của nó.
Bit 2 - TOV1 : Việc thiết lập cờ này phụ thuộc vào thiết lập của các bit WGMn3:0,
trong chế độ bình thường và CTC cờ TOV1 được thiết lập khi bộ định thời tràn.
70
Tần số của thạch anh là 11.0592MHz do đó số chu kì dao động trong
khoảng thời gian trên là :
11.0592 x 2083= 23040lần
Đây cũng là số chu kì mà timer phải đếm để cấp nguồn cho led các cột của ma trận.
Để đơn giản trong việc điều khiển cấp nguồn cho led ma trận ta dùng ngắt
Timer1 chế độ CTC ngắt khi bộ đếm đạt giá trị TOP=OCR1A . Do không cần lấy
sóng đầu ra nên ta có thể gán 0x10 cho thanh ghi TIMSK , gán 0x00 cho thanh ghi
TCCR1A , gán 0x0M cho TCCR1B với M là một trong các giá trị sau :9,A,B,C,D.
Do đó khi dùng ngắt chế độ CTC thì ta cần nạp giá trị 23115 cho thanh ghi
OCR1A nếu không chia tần số dao động ( các bit CS12:0 của TCCR1B dược gán
001). Với các độ chia tần khác của Timer ta có thể nạp các giá trị sau:
Để thay đổi tốc độc quét cho ma trận ta có thể thay đổi các giá trị của các
thanh ghi OCR1A và TCCR1B ( các bit CS12,11,10 của TCCR1B) .
71
Chương 6: Hiệu ứng hiển thị bảng led
Để tạo các hiệu ứng thì ta phải quét ma trận led sao cho hình ảnh hiển thị
trên ma trận đạt được như mong muốn. Do đó ta chỉ cần điều khiển việc đưa dữ
liệu vào các chân của ma trận một cách hơp lý là có thể tạo ra được hiệu ứng mong
muốn . Để thực hiện điều này ta có thể dùng 2 mảng dữ liệu, 1 mảng để lưu dữ liệu
của hình ảnh ( chưa có hiệu ứng ), 1 mảng lưu dữ liệu của hình ảnh tức thời để đưa
ra hiển thị. Mảng thứ 2 được xây dựng bằng cách xử lí lại dữ liệu của mảng thứ
nhất. Nguyên tắc chung cho việc điều khiển led ma trận tạo hiệu ứng là sau khi 1
hình ảnh được hiển thị thì ta lấy mẫu cho hình ảnh tiếp theo rồi cho hiển thị hình
ảnh đó ( dữ liệu mã hóa các hình ảnh này được lưu ở mảng thứ 2 ).
72
Hình 6 - Bảng led hiển thị
Các ma trận được xoay sao cho các anot của led được nối chung theo từng
cột. Mỗi cột có 8 led 2 màu, các catot của led xanh được nối với đầu ra của IC
74HC595 thứ nhất thông qua bộ dệm dòng ULN2803, còn các catot của led đỏ được
nối với IC 74HC595 thứ hai. Hai IC 74HC595 được mắc nối tiếp nhau, đầu ra nối
tiếp Q7’ của IC thứ nhất được nối với đầu vào của IC thứ 2. Đầu ra Q7’ của IC thứ
2 sẽ được nối với giắc cắm để mở rộng sang các led ma trận tiếp theo. Với cách bố
trí như trên, đế của ma trận led mỗi ma trận led sẽ có 8 chân đầu vào cấp nguồn
( cho từng cột ), 2 chân đầu vào cấp nguồn cho các IC, 3 chân đầu vào nối với
74HC595 ( DS, SH_CP, ST_CP), và 5 chân đầu ra để nối với các ma trận led khác
gồm 2 chân nguồn và 3 chân nối với 74HC595.
Với cách tổ chức ma trận như trên phải cấp nguồn cho ma trận led theo từng
cột. Dữ liệu cấp nguồn cho các hàng khi gửi nối tiếp thông qua SPI cần phải gửi
theo thứ tự: dữ liệu cho ma trận led phía sau được gửi ra trước và sau khi đã gửi hết
dữ liệu cho tất cả các ma trận thì mới chốt dữ liệu tại đầu ra của các IC 74HC595.
Mỗi ma trận cần dữ liệu của 2 màu, IC chứa dữ liệu màu xanh ở phía trước nên ta sẽ
phải truyền dữ liệu cho màu đỏ trước rồi mới đến màu xanh.
Các phần tiếp theo của chương này sẽ tình bày về cách tạo các hiệu ứng hiển
thị cho bảng led gồm 3 ma trận led có cấu tạo như trên. Tuy nhiên ta có thể sử dụng
các thuật toán này khi mở rộng ma trận với kích thước lớn hơn.
73
6.2) Dịch trái, phải
Với cách tổ chức dữ liệu mã hóa kí tự theo từng cột thì việc điều khiển hiển
thị cho các ký tự dịch trái , phải trên led ma trận là khá đơn giản .
Giả sử ta muốn hình ảnh dịch sang trái thì ta chỉ việc đưa dữ liệu của cột bên
phải của hình ảnh trước ra để hiển thị cho cột hiện tại của hình ảnh sau (cột 1 của
hình ảnh mới là cột 2 của hình ảnh cũ … ) .
Cụ thể với ma trận 8 hàng 24 cột ta có thể làm như sau :
- Dùng một mảng để lưu dữ liệu của toàn bộ hình ảnh khi không dịch
chuyển. Mảng này cần có kích thước 24 bytes ( lưu dữ liệu của 24 cột ).
- Dùng một mảng khác để lưu dữ liệu của các hình ảnh tức thời , hình ảnh
này có kích thước bằng với hình ảnh trên (24 bytes).
- Tại thời điểm đầu tiên thì hình ảnh tức thời sẽ lưu giá trị 0 cho tất cả các
cột ( ma trận tắt ). Tại thời điểm thứ 2 ta gán giá trị của cột 1 của mảng thứ nhất và
cột 24 của mảng thứ 2 . Tại thời điểm tiếp theo ta gán giá trị của cột 1,2 của mảng
thứ nhất vào cột 23,24 của mảng thứ 2... Cứ như thế khi lần lượt hiển thị và lấy mẫu
lại hình ảnh ta sẽ thấy hình ảnh trên ma trận led dịch từ trái sang phải.
74
Hình 6 - Mô phỏng hiệu ứng dịch trái
75
Bắt đầu
M2[23-j]=M1[j]
j=j+1
F
i<j
i=i+1
T F
i>23
Khi mở rộng kích thước của ma trận hay số lượng các ký tự làm vượt quá
kích thước của ma trận thì ta vẫn có thể sử dụng phương pháp trên nhưng với giá trị
giới hạn không phải là 23 mà là số cột của ma trận hay số cột cần để hiển thị hết
toàn bộ các ký tự.
76
Ngoài ra ta cũng có thể xếp 2 mảng thành một, mảng ở sau, mảng 2 ở trước
rồi cứ mỗi lần hiển thị ta là phép gán dịch trái các dữ liệu trong mảng M[i]=M[i+1],
bắt đầu với i=0, gán M[2n-1]=0 với n là số cột hiển thị. Dữ liệu đưa ra hiển thị là n
giá trị đầu của mảng.
Hiệu ứng dịch phải cũng tương tự như dịch trái nhưng phải thay phép gán
trong vòng lặp j thành M2[j]=M1[n-j]. Ta cũng có thể gom 2 mang làm một, mảng
1 ở trước mảng 2 ở sau, cứ mỗi lần hiển thị ta gán M[i] = M[i-1] nhưng bắt đầu với
i = 2n-1và gán M[0]=0 ; dữ liệu đưa ra hiển thị là n giá trị sau của mảng.
77
6.3) Dịch lên xuống
Với cách tổ chức dữ liệu mã hóa kí tự theo từng cột thì việc điều khiển hiển
thị cho các ký tự dịch lên xuống có thể thực hiện bằng cách dịch bit các dữ liệu mã
hóa hình ảnh của từng cột .
Cụ thể với ma trận 8 hàng 24 cột cho hình ảnh dịch lên ta có thể làm như
sau:
- Dùng một mảng để lưu dữ liệu của toàn bộ hình ảnh khi không dịch
chuyển. Mảng này cần có kích thước 24 bytes ( lưu dữ liệu của 24 cột ).
- Dùng một mảng khác để lưu dữ liệu của các hình ảnh tức thời , hình ảnh
này có kích thước bằng với hình ảnh trên (24 bytes).
- Tại thời điểm đầu tiên thì hình ảnh tức thời sẽ lưu giá trị 0 cho tất cả các
cột ( ma trận tắt ). Tại thời điểm thứ 2 ta cần gán bit mã hóa hàng trên cùng của
mảng 1 ( MSB ) vào hàng dưới cùng của mảng 2 ( LSB ). Do đó ta cần phải dịch
phải các bit trong từng byte dữ liệu của mảng 1 đi 7 bit rồi gán vào mảng 2. Tại thời
điểm tiếp theo ta dịch phải 6 bit . Cứ như vậy hình ảnh sẽ dịch dần lên. Tuy nhiên
nếu chi dịch như vậy thì thình ảnh chỉ dịch đến khi ra giữa ma trận. Để hình có thể
tiếp tục dịch lên thì ta phải dịch trái dữ liệu đi từ 1 bit cho đến 7 bit . Sau khi dịch
trái hết thì lại gán 0 cho tất cả các bit của ma trận .
78
Bắt đầu
i=0
Hiển thị
J=0
M2[j]=M1[j]>>(8-i)
J=J+1
F
J>23
i=i+1
F
i>7
Hiển thị
J=0
M2[j]=M1[j]<<(i-8)
J=J+1
F
J>23
i=i+1
T F
i>15
79
Khi mở rộng ma trận chu trình gán giá trị hiển thị sẽ phứa tạp hơn do kích
thước dữ liệu cần gán cho một cột của ma trận tăng lên. Khi đó ta có thể chia dữ
liệu đem ra hiển thị thành nhiều mảng với mỗi mảng đại diện cho 1 “ dòng ” của ma
trận. Phần tử đầu tiên của mỗi mảng sẽ chứa dữ liệu cho cột đầu tiên của mỗi dòng.
Cứ mỗi lần dịch ta có thể gán Mt[i] = ( Mt[i]<<j ) | ( Md[i]>>(8-j) ). Với Mt là
dòng trên, Md là dòng dưới .
Hiệu ứng dịch xuống cũng tương tự như dịch lên nhưng khác ở chiều của
phép dịch bit và số lần dịch bit ta có thể thay chiều của phép dịch và số bit dịch đổi
từ (8-i) thành i .
80
6.4) Hiển thị từng kí tự
Với cách tổ chức dữ liệu mã hóa kí tự theo từng cột thì việc điều khiển cho
các ký tự lần lượt hiện trên bảng led có thể thực hiện bằng cách lấy mẫu lần lượt
thêm từng ý tự một .
Cụ thể với ma trận 8 hàng 24 cột cho hiển thị tưng ký tự một ta có thể làm như sau :
- Dùng một mảng để lưu dữ liệu của toàn bộ hình ảnh khi không dịch
chuyển. Mảng này cần có kích thước 24 bytes ( lưu dữ liệu của 24 cột ).
- Dùng một mảng khác để lưu dữ liệu của các hình ảnh tức thời, hình ảnh này
có kích thước bằng với hình ảnh trên (24 bytes).
- Tại thời điểm đầu tiên thì mảng lưu hình ảnh tức thời được gán 0 để tắt tất
cả các led. Sau đó tại các thời điểm tiếp theo ta lần lượt gán từng 6 bytes của mảng
1 vào mảng 2 để đưa ra hiển thị ( do cứ 6 bytes thì mã hóa 1 ký tự).
81
Bắt đầu
Hiển thị
j=0
M2[i*6+j]=M1[i*6+j]
j=j+1
F
j>5
i=i+1
T F
i>3
82
6.5) Kết luận
Việc sử dụng 2 mảng dữ liệu một mảng lưu toàn bộ khung hình, một mảng
lưu hình ảnh tức thời sẽ giúp việc tạo các hiệu ứng đơn giản hơn. Xử lý các dữ liệu
trên mảng thứ nhất rồi lưu vào mảng thứ 2 để đưa ra hiển thị sẽ cần một lượng bộ
nhớ lớn khi số lượng ký tự và kích thước của font chữ tăng. Do đó khi tạo các hiệu
ứng và điều khiển hiển thị cần phải chú ý đến kích thước bộ nhớ. Nếu cần có thể
dùng thêm các bộ nhớ ngoài hoặc chọn các vi điều khiển có bộ nhớ đủ lớn để có thể
tạo hiệu ứng cần thiết. Các bảng điện tử thông dụng thường chỉ hiển thị một nội
dung cố định nên ta có thể sử dụng bộ nhớ flash (có kích thước khá lớn ) để lưu giá
trị của mảng thứ nhất, thậm chí có thể lưu toàn bộ các khung cần hiển thị. Khi đó ta
chỉ cần điều khiển việc xuất dữ liệu theo địa chỉ để hiển thị.
Đối với phương pháp cấp nguồn theo từng cột thì việc tạo các hiệu ứng dịch
trái, dịch phải khá đơn giản và việc mở rộng ma trận không ảnh hưởng nhiều đến
việc gán dữ liệu nhưng với các hiệu ứng dịch lên xuống khá phức tạp khi mở rộng
ma trận. Tuy nhiên nếu chỉ sử dụng một hiệu ứng cho ma trận thì với hiệu ứng dịch
lên, xuống ta có thể chọn phương pháp cấp nguồn theo từng hàng. Khi đó cần phải
xây dựng font chữ theo tưng hàng và phải xắp xếp lại các ma trận led ( xoay 90 độ
so với khi cấp nguồn theo cột ).
83
Kết luận
Module điều khiển hiển thị đã hoàn thành , và đạt được những kết quả
sau:
- Có khả năng điều khiển hiển thị 2 chuỗi ký tự trên hai hàng ma trận,
có khả năng điều khiển hiển thị ma trận có đọ rộng lớn hơn.
- Có khả năng hiển thị các dòng ký tự với ba màu xanh, đỏ và cam.
- Có khả năng điều khiển hiển thị các ký tự với một số hiệu ứng cơ
bản. Thuật toán điều khiển hiển thị hiệu ứng có thể sử dụng khi mở rộng ma trận và
có thể làm cơ sở để tạo các hiệu ứng phức tạp hơn.
- Có khả năng thay đổi tần số quét ma trận .
Tuy nhiên module vẫn còn một số giới hạn :
- Có thể hiển thị các ký tự trên hai dòng nhưng lại độc lập với nhau.
Do đó khi gặp phải một số yêu cầu về việc hiển thị 2 dòng chữ có độ tương quan
nhất định thì cần phải thay đổi về việc điều khiển xuất dữ liệu.
- Tuy có thể thay đổi màu của dòng chữ hiển thị nhưng lại chưa điều
khiển được màu sắc của từng ký tự. Vấn đề này có thể dễ dàng khắc phục khi hiển
thị các ký tự tĩnh, nhưng khi cần điều khiển các ký tự động thì sẽ khó khăn trong
việc điều khiển màu sắc.
- Do quá trình điều khiển hiển thị cần có giai đoạn lấy mẫu lại dữ liệu
nên khi điều khiển hiển thị ma trận có kích thước lớn có thể gây ảnh hưởng đến việc
điều khiển tần số quét .
Trong đề tài có thể có một số vấn đề hợp lý hay chưa tối ưu về các thuật toán
điều khiển hiển thị và sử dụng bộ nhớ của vi điều khiển. Do đó em rất mong có sự
góp ý của các thầy cô và các bạn để đồ án có thể hoàn thiện hơn.
84
Tài liệu tham khảo
[1] Steven F. Barrett and Daniel J. Pack, Atmel AVR Microcontroller Primer:
Programming and Interfacing, Morgan & Claypool, 2008
85
Phụ lục A: Sơ đồ ghép nối hệ thống điều khiển led ma trận
86
SCK
220v
MOSI
OC0
10
COM
11 15 1 18
SH_CP Q0 1B 1C
14 1 2 17
DS Q1 2B 2C
2 3 16
Q2 3B 3C
TR1
12 3 4 15
ST_CP Q3 4B 4C
4 5 14
Q4 5B 5C
TRAN-2P5S
5 6 13
Q5 6B 6C
6 7 12
MR Q7 8B 8C
13 9
OE Q7'
U1
U4
10
ULN2803
COM
11 15 1 18
74HC595
SH_CP Q0 1B 1C
14 1 2 17
DS Q1 2B 2C
2 3 16
Q2 3B 3C
12 3 4 15
ST_CP Q3 4B 4C
4 5 14
Khoi cap nguon cho IC
Q4 5B 5C
U2
U5
ULN2803
10
74HC595
COM
11 15 1 18
1
SH_CP Q0 1B 1C
14 1 2 17
DS Q1 2B 2C
2 3 16
470uF
Q2 3B 3C
VI
12 3 4 15
ST_CP Q3 4B 4C
4 5 14
Q4 5B 5C
5 6 13
Q5 6B 6C 2
6 7 12 GND
Hình A - Khối cấp nguồn
Q6 7B 7C
7805
10 7 8 11
MR Q7 8B 8C
13 9
OE Q7'
VO
U3
ULN2803
74HC595
33pF
87
KHỐI GIAO TIẾP VỚI MÁY TÍNH:
C3
1nF
5 4
P1
ERROR C2- C2+
6
VS-
2
VS+
9
RI
4 8 9
DTR R2IN R2OUT
8 7 10
CTS T2OUT T2IN
3 13 12
TXD R1IN R1OUT RXD
7 14 11
RTS T1OUT T1IN TXD
2
RXD
6
DSR C1- C1+
1
DCD
3 1
COMPIM
C6
1nF
Giao tiep may tinh
C[0..7]
C1
C4
C0
C2
C3
C5
C6
C7
A1
A2
A3
A4
A6
A7
A8
A5
B1
A1
A4
A5
A3
A6
A7
A8
A2
88
KHỐI ĐIỀU KHIỂN TRUNG TÂM VÀ QUÉT CỘT:
C[0..7]
C2
C4
C0
C1
C3
C5
C7
C6
15
14
13
12
11
10
9
7
U8
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74HC138
E1
E2
E3
C
A
B
1
2
3
6
4
5
C2 U7
9 22
RESET PC0/SCL
23
PC1/SDA
33pF 13 24
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
C1 40
PC4/TDO
27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
33pF 37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0 TXD
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3 21
PB2/INT2/AIN0 PD7/OC2
4
OC0 PB3/OC0/AIN1
5
PB4/SS
6
KHoi dieu khien trung tam va chon cot MOSI
7
PB5/MOSI
30
PB6/MISO AVCC
8 32
SCK PB7/SCK AREF
ATMEGA16
89
Phụ lục B: Mã chương trình nạp cho vi điều khiển
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <spi.h>
62,65,65,65,62,0, //0 1
17,33,127,1,1,0, //1 2
35,69,73,73,49,0, //2 3
34,65,73,73,54,0, //3 4
12,20,36,79,4,0, //4 5
114,73,73,73,70,0, //5 6
62,73,73,73,38,0, //6 7
65,66,68,72,112,0, //7 8
54,73,73,73,54,0, //8 9
50,73,73,73,62,0, //9 10
63,68,68,68,63,0, //A 11
127,73,73,73,54,0, //B 12
62,65,65,65,34,0, //C 13
127,65,65,65,62,0, //D 14
127,73,73,73,65,0, //E 15
127,72,72,72,64,0, //F 16
62,65,73,73,46,0, //G 17
127,8,8,8,127,0, //H 18
65,65,127,65,65,0, //I 19
70,65,65,126,64,0, //J 20
127,8,20,34,65,0, //K 21
127,1,1,1,1,0, //L 22
127,32,24,32,127,0, //M 23
127,32,16,8,127,0, //N 24
62,65,65,65,62,0, //O 25
127,68,68,68,56,0, //P 26
62,65,69,66,61,0, //Q 27
127,68,68,74,49,0, //R 28
50,73,73,73,38,0, //S 29
64,64,127,64,64,0, //T 30
126,1,1,1,126,0, //U 31
124,2,1,2,124,0, //V 31
127,2,12,2,127,0, //W 33
65,34,28,34,65,0, //X 34
90
96,16,15,16,96,0, //Y 35
67,69,73,81,97,0, //Z 36
4,42,42,42,28,0, //a 37
126,18,18,18,12,0, //b 38
28,34,34,34,20,0, //c 39
12,18,18,20,126,0, //d 40
28,42,42,16,0,0, //e 41
4,62,72,64,32,0, //f 42
24,37,37,37,30,0, //g 43
126,16,16,16,14,0, //h 44
0,92,2,2,4,0, //i 45
4,2,2,92,0,0, //j 46
126,8,20,34,0,0, //k 47
124,2,2,2,0,0, //l 48
30,32,30,32,30,0, //m 49
62,8,16,62,0,0, //n 50
28,34,34,34,28,0, //o 51
31,36,36,36,24,0, //p 52
24,36,36,36,31,0, //q 53
0,30,32,32,24,0, //r 54
18,42,42,42,36,0, //s 55
0,32,124,34,4,0, //t 56
60,2,2,2,60,0, //u 57
56,4,2,4,56,0, //v 58
56,2,12,2,56,0, //w 59
34,20,8,20,34,0, //x 60
48,8,14,8,48,0, //y 61
34,38,42,50,34,0, //z 62
0,0,0,0,0,0, //
255};
void LatchData(){
SCL=0;
SCL=1;
}
91
void lm1() {
for (i=0;i<=sokt1-1;i++){
for (j=0;j<=5;j++) {
dong1[i*6+j]=~FONT[chuoi1[i]*6+j+1];
}
}
for (i=0;i<=sokt2-1;i++){
for (j=0;j<=5;j++) {
dong2[i*6+j]=~FONT[chuoi2[i]*6+j+1];
}
}
}
void lm2(){
for (i=0;i<=sokt1*6-1;i++){
dong1[i+sokt1*6]=dong1[i];
//dong1[i]=0;
dong1[i]=255;
}
for (i=0;i<=sokt2*6-1;i++){
dong2[i+sokt2*6]=dong2[i];
//dong2[i]=0;
dong2[i]=255;
}
void xulychuoi(){
for (i=0;i<sokt1;i++) {
if ((chuoi1[i]>47)&&(chuoi1[i]<58)) chuoi1[i]=chuoi1[i]-48;
else if ((chuoi1[i]>64)&&(chuoi1[i]<91)) chuoi1[i]=chuoi1[i]-55;
else if ((chuoi1[i]>96)&&(chuoi1[i]<123)) chuoi1[i]=chuoi1[i]-60;
else chuoi1[i]=62;
}
for (i=0;i<sokt2;i++) {
if ((chuoi2[i]>47)&&(chuoi2[i]<58)) chuoi2[i]=chuoi2[i]-48;
else if ((chuoi2[i]>64)&&(chuoi2[i]<91)) chuoi2[i]=chuoi2[i]-55;
else if ((chuoi2[i]>96)&&(chuoi2[i]<123)) chuoi2[i]=chuoi2[i]-60;
else chuoi2[i]=62;
}
}
void shiftleft(){
for (i=0;i<sokt1*12-1;i++){
dong1[i]=dong1[i+1];
}
92
//dong1[sokt1*12-1]=0;
dong1[sokt1*12-1]=255;
for (i=0;i<sokt2*12-1;i++){
dong2[i]=dong2[i+1];
}
//dong2[sokt2*12-1]=0;
dong2[sokt2*12-1]=255;
}
void shiftright(){
tg= dong1[sokt*12-1];
for (i=sokt1*12-1;i>0;i--){
dong1[i]=dong1[i-1];}
dong1[0]=tg;
tg= dong2[sokt*12-1];
for (i=sokt2*12-1;i>0;i--){
dong2[i]=dong2[i-1];}
dong2[0]=tg;
}
if (k<8)
for (i=0;i<=sokt*6-1;i++){
dong1[i]=0xFF;
dong2[i]=(dong1[i+sokt*6]>>(8-k))|(0xFF<<k);
}
else if ((k>7)&&(k<16)) {
m=k-8 ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]>>(8-m))|(0xFF<<m);
dong2[i]=(dong1[i+sokt*6]<<m)|(dong2[i+sokt*6]>>(8-m));
} }
else if ((k>15)&&(k<24)) {
m=k-16 ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]<<m)|(dong2[i+sokt*6]>>(8-m));
dong2[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
} }
else {
m=k-24 ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
dong2[i]=0xFF;
93
} }
/*
if ( k>=8) {
for (i=0;i<=sokt*6-1;i++){
m=k-8;
dong1[i]=(dong1[i+sokt*6]<<m)|(0xFF>>(8-m));
dong2[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
} }
if (k<8) {
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]>>(8-k))|(0x7F<<k);
dong2[i]=(dong2[i+sokt*6]>>(8-k))|(0x7F<<k);
} }
*/
if (k>23) {
m=k-24;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=0xFF;
dong2[i]=(dong1[i+sokt*6]>>m)|(0x7F<<m);
} }
if ((k>15)&&(k<=23)) {
m=k-16;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]>>m)|(0xFF<<(8-m));
dong2[i]=(dong1[i+sokt*6]<<(8-m))|(dong2[i+sokt*6]>>m);
} }
if ((k>7)&&(k<16)) {
m=k-8;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]<<(8-m))|(dong2[i+sokt*6]>>m);
dong2[i]=(dong2[i+sokt*6]<<m)|(0xFF<<(8-m));
} }
if (k<8){
m=8-k ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
dong2[i]=0xFF;
} }
/*
94
if ( k>8) {
for (i=0;i<sokt*6;i++){
m=k-8;
dong2[i]=(dong2[i+sokt*6]>>m)|(0x7F<<(8-m));
dong1[i]=(dong1[i+sokt*6]>>m)|(0x7F<<(8-m));
} }
if (k<=8) {
for (i=0;i<sokt*6;i++){
dong2[i]=(dong2[i+sokt*6]<<(8-k))|(0xFF>>k);
dong1[i]=(dong1[i+sokt*6]<<(8-k))|(0xFF>>k);
} }
*/
}
void tungchu () {
for (i=0;i<k*6;i++){
dong1[i]=dong1[sokt*6+i];
dong2[i]=dong2[sokt*6+i];
}
}
void hienthi() {
switch (col){
// 2do1do
case 0 :
spi(0x00);
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
break;
// 2xanh1do
case 1 :
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
95
spi(dong2[c]);
spi(0x00);
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
break;
// 2cam1do
case 2 :
spi(dong2[c+16]);
spi(dong2[c+16]);
spi(dong2[c+8]);
spi(dong2[c+8]);
spi(dong2[c]);
spi(dong2[c]);
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
break;
// 2do1xanh
case 3 :
spi(0x00);
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
spi(0x00);
break;
// 2xanh1xanh
case 4 :
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
96
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
spi(0x00);
break;
// 2cam1xanh
case 5 :
spi(dong2[c+16]);
spi(dong2[c+16]);
spi(dong2[c+8]);
spi(dong2[c+8]);
spi(dong2[c]);
spi(dong2[c]);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
spi(0x00);
break;
// 2do1cam
case 6 :
spi(0x00);
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(dong1[c+16]);
spi(dong1[c+16]);
spi(dong1[c+8]);
spi(dong1[c+8]);
spi(dong1[c]);
spi(dong1[c]);
// 2xanh1cam
case 7 :
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(0x00);
spi(dong1[c+16]);
97
spi(dong1[c+16]);
spi(dong1[c+8]);
spi(dong1[c+8]);
spi(dong1[c]);
spi(dong1[c]);
break;
// 2cam1cam
case 8 :
spi(dong2[c+16]);
spi(dong2[c+16]);
spi(dong2[c+8]);
spi(dong2[c+8]);
spi(dong2[c]);
spi(dong2[c]);
spi(dong1[c+16]);
spi(dong1[c+16]);
spi(dong1[c+8]);
spi(dong1[c+8]);
spi(dong1[c]);
spi(dong1[c]);
break;
default: break;
}
}
void hieuung() {
switch (eff){
// hienbt
case 0 :
lm1();
break;
// dichtrai
case 1 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
shiftleft();
}
if (k==sokt*12) {
lm1();
lm2();
k=0;
98
}
break;
// dichphai
case 2 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
shiftright();
}
if (k==sokt*12) {
lm1();
lm2();
k=0;
}
break;
// dichlen
case 3 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
UP(k);
}
if (k>=32) {
lm1();
lm2();
k=0;
/* if (t==sokt*8){
k++;
UP(k);
}
if (k==16) {
lm1();
lm2();
k=0;
}
*/
}
break;
99
// dichxuong
case 4 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
down(k);
}
if (k>=32) {
lm1();
lm2();
k=0;
}
break;
// tungchu
case 5 :
if (t==200){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
tungchu();
}
if (k>sokt) {
lm1();
lm2();
k=0;
}
break;
default: break;
}
}
hienthi();
LatchData();
PORTC=c+8;
PORTA=c+8;
100
c++;
t++;
if (c==8) c=0;
hieuung();
void main(void){
lm1();
lm2();
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: clk/256 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=tocdo_quet;
OCR1BH=0x00;
OCR1BL=0x00;
/*UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;*/
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
DDRB=0xFF;
DDRC=0xFF;
DDRA=0xFF;
101
SCL=1;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: clk
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x00;
while (1){
unsigned char temp1,temp2,length;
int i;
temp1 = getchar();
if (temp1=='A')
{
TIMSK=0x00;
//Nhan chuoi ky tu hang 1
//tinh do dai chuoi
temp1 = getchar()-48;
temp2 = getchar()-48;
length = temp1*10 + temp2;
sokt1=length;
//Nhan chuoi ky tu
if (length >=1){
for( i=0;i<length;i++)
{
chuoi1[i] = getchar();
}
//Nhan chuoi ky tu hang 2
//tinh do dai chuoi
temp1 = getchar()-48;
temp2 = getchar()-48;
length = temp1*10 + temp2;
sokt2=length;
//Nhan chuoi ky tu
if (length >=1){
for( i=0;i<length;i++)
{
chuoi2[i] = getchar();
}
//Nhan mau
col = getchar() - 48;
102
//Nhan hieu ung
eff = getchar() - 48;
//Nhan Toc do quet
temp1 = getchar()-48;
temp2 = getchar()-48;
tocdo_quet = temp1*10 + temp2;
//Nhan toc do chay
temp1 = getchar()-48;
temp2 = getchar()-48;
tocdo_chay = temp1*10 + temp2;
xulychuoi();
lm1();
lm2();
t=0;
c=0;
TIMSK=0x10;
}
}
}
}
}
103