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 ).
6.1) Bảng led hiển thị
Trước khi xây dựng các hiệu ứng hiển thị ta cần xác định xem bảng led cần
điều khiển có kích thước như thế nào và phải xác định được bảng led được xây
dựng như thế nào. Khi hiểu rõ cách xây dựng bảng led ta mới có thể điều khiển cấp
nguồn cho bảng led. Trong đồ án này chúng em xây dựng một bảng led gồm 6 ma
trận led 8x8 hai màu ( xanh, đỏ) anot chung được bố tí thành hai hàng mỗi hàng 3
ma trận :
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
i<j
i>23
Nạp giá trị cho M 1
Gán các phần tử
M2 =0
Gán i=0
M2[23-j]=M1[j]
j=j+1
Hiển thị ma trận
Gán j=0
i=i+1
F
FT
T
Hình 6 - Lưu đồ thuật toán hiệu ứng dịch trái
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 .
Hình 6 - Mô phỏng hiệu ứng dịch lên
78
Bắt đầu
J>23
i>7
Nạp giá trị cho M1
Gán các phần tử
M2 =0
i=0
M2[j]=M1[j]>>(8-i)
J=J+1
Hiển thị
J=0
i=i+1
F
F
T
T
Hiển thị
J=0
M2[j]=M1[j]<<(i-8)
J=J+1
J>23
i=i+1
T
i>15
F
FT
Hình 6 - Lưu đồ thuật toán hiệu ứng dịch lên
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ự).
Hình 6 - Mô phỏng hiệu ứng hiển thị từng chữ
81
Bắt đầu
j>5
i>3
Nạp giá trị cho M1
Gán các phần tử
M2 =0
i=0
M2[i*6+j]=M1[i*6+j]
j=j+1
Hiển thị
j=0
i=i+1
F
FT
T
Hình 6 - Lưu đồ thuật toán hiệu ứng hiển thị tưng ký tự
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