Professional Documents
Culture Documents
ORG
Số a b c d e f g dp Mã Số dp g f e d c b a Mã
hex hex
0 0 0 0 0 0 0 1 1 0x03 0 1 1 0 0 0 0 0 0 0xC0
1 1 0 0 1 1 1 1 1 0x9F 1 1 1 1 1 1 0 0 1 0xF9
2 0 0 1 0 0 1 0 1 0x25 2 1 0 1 0 0 1 0 0 0xA4
3 0 0 0 0 1 1 0 1 0x0D 3 1 0 1 1 0 0 0 0 0xB0
4 1 0 0 1 1 0 0 1 0x99 4 1 0 0 1 1 0 0 1 0x99
5 0 1 0 0 1 0 0 1 0x49 5 1 0 0 1 0 0 1 0 0x92
6 0 1 0 0 0 0 0 1 0x41 6 1 0 0 0 0 0 1 0 0x82
7 0 0 0 1 1 1 1 1 0x1F 7 1 1 1 1 1 0 0 0 0xF8
8 0 0 0 0 0 0 0 1 0x01 8 1 0 0 0 0 0 0 0 0x80
9 0 0 0 0 1 0 0 1 0x09 9 1 0 0 1 0 0 0 0 0x90
Số a b c d e f g dp Mã Số dp g f e d c b a Mã
hex hex
0 1 1 1 1 1 1 0 0 0xFC 0 0 0 1 1 1 1 1 1 0x3F
1 0 1 1 0 0 0 0 0 0x60 1 0 0 0 0 0 1 1 0 0x06
2 1 1 0 1 1 0 1 0 0xDA 2 0 1 0 1 1 0 1 1 0x5B
3 1 1 1 1 0 0 1 0 0xF2 3 0 1 0 0 1 1 1 1 0x4F
4 0 1 1 0 0 1 1 0 0x66 4 0 1 1 0 0 1 1 0 0x66
5 1 0 1 1 0 1 1 0 0xB6 5 0 1 1 0 1 1 0 1 0x6D
6 1 0 1 1 1 1 1 0 0xBE 6 0 1 1 1 1 1 0 1 0x7D
7 1 1 1 0 0 0 0 0 0xE0 7 0 0 0 0 0 1 1 1 0x07
8 1 1 1 1 1 1 1 0 0xFE 8 0 1 1 1 1 1 1 1 0x7F
9 1 1 1 1 0 1 1 0 0xF6 9 0 1 1 0 1 1 1 1 0x6F
R1 U1
R2 7
R3 6 a
R4 4 b
PORT
R5 2 c
R6 1 d
R7 9 e
R8 10 f
5 g
E1
E2
dp
3
8
COMMON CATHODE
E1
E2
E1
E2
E1
E2
dp dp dp dp
DATA PORT
3
8
3
8
3
8
3
8
CA CA CA CA
J2
1
2
R13 R14 R15 R16
3
4 Q1 Q2 Q3 Q4
5 c1815 c1815 c1815 c1815
6
7 8k2 8k2 8k2 8k2
8
9 VCC
10
CONTROL PORT
Vào
Delay 5ms
Bật led 2 qua Bật led n qua
PORT CONTROL PORT CONTROL
Delay 5ms
Tắt led 2 qua Đưa dữ liệu led n
PORT CONTROL ra PORT DATA
Hàm quét led phải được gọi ra liên tục trong thân hàm main, các tác vụ
khác không được trì hoãn quá lâu vì như vậy sẽ làm việc quét led gián đoạn gây
nhấp nháy led.
Thực hành:
Yêu cầu 1: Hãy soạn thảo và biên dịch chương trình với yêu cầu hiển thị
1 số có 4 chữ số ví dụ 2010.
Chương trình gợi ý:
Bai2_1_A : Thực hành quét led. Sử dụng file mô
phỏng BAI2_1.dsn
#define CONTROL PORTB
#define DATA PORTC
char i ;
char temp[4];
// MA LED 7 DOAN CATHODE CHUNG
char seven_seg_code[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
Trong chương trình trên, hàm Num2Digit chịu trách nhiệm tách các ký
số của 1 số có 4 chữ số. Sau đó, trong hàm quét led, các ký số này sẽ được
dùng để tra cứu mã led 7 đoạn tương ứng được khai báo trong mảng
seven_seg_code.
Thử thay đổi thời gian trì hoãn trong hàm quét led từ 5ms thành 500ms
để hiểu rõ nguyên tắc quét led.
Yêu cầu 2: Hãy viết chương trình kết hợp dùng phím đơn và quét led 7
đoạn, chương trình có khả năng khi ấn phím 1 thì tăng giá trị hiển thị 1 đơn vị,
ấn phím 2 thì giảm 1 đơn vị.
Chương trình tham khảo:
Bai2_1_B : Chương trình kết hợp quét led và chống
dội phím. Sử dụng file mô phỏng BAI2_1.dsn
#define CONTROL PORTB
#define DATA PORTC
char key, pr, flag, i, j;
unsigned int number;
char temp[4];
// MA LED 7 DOAN CATHODE CHUNG
char seven_seg_code[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// HAM TACH CAC KY SO TRONG CHU SO CAN HIEN THI
void Num2Digit(unsigned int in_number){
temp[3]=in_number/1000;
temp[2]=(in_number%1000)/100;
temp[1]=((in_number%1000)%100)/10;
temp[0]=((in_number%1000)%100)%10;
return;
}
// HAM QUET LED 7 DOAN
void Seven_Seg_Scan(){
for (i=0;i<=3;i++){
// TRA CUU KY SO CHUYEN THANH MA LED
DATA=seven_seg_code[temp[i]];
CONTROL=~0x08>>i;
delay_ms(1);
CONTROL=0xFF;
}
}
//HAM DOC PHIM - TRA VE VI TRI PHIM DUOC AN - MUC TAC DONG PHIM LA THAP
char Button_Read(){
if(Button(&PINA,0,1,0)) return 1;
if(Button(&PINA,1,1,0)) return 2;
return 0;
}
case 2:number--;
// GIOI HAN GIA TRI TRONG 4 CHU SO
if(number>=9999) number=9999;
break;
}
}
}
}
Trong chương trình tham khảo trên, các hàm delay của chương trình
chống dội cũng như quét led đều giảm tối thiểu để đảm bảo tần số quét đủ để
đánh lừa thị giác của chúng ta. Tuy nhiên, việc giảm delay có thể làm cho hàm
chống dội không còn tốt nữa. Mặt khác, đây chỉ mới là chương trình đơn giản
với 2 chức năng chỉ khai thác được 1 phần nhỏ tài nguyên vi điều khiển. Vì vậy
cần cải tiến chương trình để vi điều khiển xử lý nhịp nhàng giữa chống dội
phím và quét led. Ta sẽ dùng phương pháp sử dụng ngắt được trình bày ở các
chương sau để khắc phục nhược điểm của hàm delay.
U3 U4 U5 U6
A 7 A 7 A 7 A 7
B 6 a B 6 a B 6 a B 6 a
C 4 b C 4 b C 4 b C 4 b
D 2 c D 2 c D 2 c D 2 c
E 1 d E 1 d E 1 d E 1 d
F 9 e F 9 e F 9 e F 9 e
G 10 f G 10 f G 10 f G 10 f
DP 5 g DP 5 g DP 5 g DP 5 g
E1
E2
E1
E2
E1
E2
E1
E2
pt pt pt pt
3
8
3
8
3
8
3
8
7Seg 7Seg 7Seg 7Seg
LED2
LED3
LED4
U7 U8 U10 U11
A 7 A 7 A 7 A 7
B 6 a B 6 a B 6 a B 6 a
C 4 b C 4 b C 4 b C 4 b
D 2 c D 2 c D 2 c D 2 c
E 1 d E 1 d E 1 d E 1 d
F 9 e F 9 e F 9 e F 9 e
G 10 f G 10 f G 10 f G 10 f
DP 5 g DP 5 g DP 5 g DP 5 g
E1
E2
E1
E2
E1
E2
E1
E2
pt pt pt pt
3
8
3
8
3
8
3
8
7Seg 7Seg 7Seg 7Seg
Q5 Q6 Q7 Q8
PNP BCE VCC PNP BCE VCC PNP BCE VCC PNP BCE VCC
LED5
LED6
LED7
LED8
PORT U1 U2
1 RCLK_1 11 9 U9 11 9
SRCLK_1 SRCLK SDO SRCLK_2 SRCLK SDO
2 SDI_1
3 14 15 1 18 A 14 15 R1 8.2K LED1
SRCLK_1 SDI_1 SDI QA IN1 OUT1 SDI_2 SDI QA
4 1 2 17 B 1 R2 8.2K LED2
RCLK_2 QB IN2 OUT2 QB
5 12 2 3 16 C 12 2 R3 8.2K LED3
SDI_2 RCLK_1 RCLK QC IN3 OUT3 RCLK_2 RCLK QC
6 3 4 15 D 3 R4 8.2K LED4
SRCLK_2 QD IN4 OUT4 R9 QD
7 4 5 14 E 4 R5 8.2K LED5
8 R10 10 QE 5 6 IN5 OUT5 13 F 10 QE 5 R6 8.2K LED6
VCC CLR QF IN6 OUT6 VCC CLR QF
9 6 7 12 G 6 R7 8.2K LED7
VCC QG IN7 OUT7 QG
10 10K 13 7 8 11 DP 13 7 R8 8.2K LED8
G QH IN8 OUT8 10K G QH
J1 VCC 10
74HC595 COM 74HC595
ULN2803
+Bước 3: Tạo xung đồng hồ tại chân của vi điều khiển nối vào chân RCLK
(chân 12) của IC 74595.
Sau đây là lưu đồ giải thuật xuất dữ liệu ra IC 74595:
Vào
Đủ 8 lần Chưa
hay chưa?
Đủ
Tạo xung clock cấp
vào chân RCLK
Thoát
Ví dụ: Viết chương trình hiển thị dãy số gồm 8 chữ số bất kỳ ra 8 led 7
đoạn với cách bố trí như sơ đồ hình 6.
Ta dùng dãy IC 74595 thứ nhất để xuất dữ liệu là mã led. Dùng dãy IC
74595 thứ 2 để xuất dữ liệu chọn led.
Do dãy IC 74595 được mắc nối tiếp nên khi xuất dữ liệu phải sắp xếp
sao cho dữ liệu của IC cuối dãy được xuất trước
char seven_seg_code[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//char temp[8]={1,2,3,4,5,6,7,8}; // MẢNG CHỨA GIÁ TRỊ CẦN HIỂN THỊ
char temp[9]="12345678"; // MẢNG CHỨA GIÁ TRỊ CẦN HIỂN THỊ
char i;
//HÀM GHI DỮ LIỆU VÀO IC 74595
void Ic74595_Write(char dat, char ic, char bits){
signed char func_count; //BIẾN ĐẾM
if(ic==1){ //CHỌN GHI VÀO DÃY IC THỨ NHẤT
for(func_count=bits-1;func_count>=0;func_count--){
sdo1=(dat>>func_count)&0x01; // LẤY TỪNG BIT
clk1=1; //TẠO XUNG DỊCH
clk1=0;
}
lat1=1; //TẠO XUNG CHỐT
lat1=0;
}
if(ic==2){ // CHỌN GHI VÀO IC THỨ HAI ĐỘ RỘNG 8 BIT
for(func_count=bits-1;func_count>=0;func_count--){
sdo2=(dat>>func_count)&0x01; // LẤY TỪNG BIT
clk2=1; //TẠO XUNG DỊCH DỮ LIỆU
clk2=0;
}
lat2=1; //TẠO XUNG CHỐT DỮ LIỆU
lat2=0;
}
}
// HÀM QUÉT LED 7 ĐOẠN
void Seven_Seg_Scan(char leds){
if(i++>=leds) i= 0; // MỖI LẦN GỌI HÀM CHỈ QUÉT 1 LED CÓ THỨ TỰ TĂNG DẦN
// XÓA ĐỊA CHỈ LED
Ic74595_Write(0xFF,2,8);
// TRA CỨU MẢNG CHỨA MÃ LED VÀ GHI VÀO IC(DÃY IC) 74595 THỨ NHẤT
Ic74595_Write(seven_seg_code[temp[i]-48],1,8);
// GHI DỮ LIỆU ĐIỀU KHIỂN(ĐỊA CHỈ LED) VÀO IC(DÃY IC) 74595 THỨ 2
Ic74595_Write(~(0x01<<i),2,8);
delay_ms(1);
}
void main(){
DDRC=0xff;
while(1){
Seven_Seg_Scan(8);
}
}
Mảng chứa giá trị cần hiển thị là 1 chuỗi ký tự, vì vậy khi dùng từng ký
số để tra cứu vào mảng chứa mã led, ta phải chuyển từ mã ASCII ra số
nguyên(trừ đi 48 đơn vị).
Hàm quét led có đặc điểm, mỗi lần quét led chỉ quét 1 led, lần tiếp theo
sẽ quét led kế tiếp, mục đích là để thời gian thực thi hàm không quá lâu. Tuy
nhiên, số lần gọi hàm phải dày hơn chương trình quét 1 lần tất cả led.
Trên đây chỉ là một hướng làm tiết kiệm chân IO vào ứng dụng quét led.
Có rất nhiều phương pháp khác nhau để kết hợp vi điều khiển và IC số, các bạn
có thể tự tìm hiểu thêm với nguyên lý quét led như trên.
+Quét cột là cấp dữ liệu cho từng cột kết hợp với việc chọn cột để hiển
thị dữ liệu tương ứng.
+Quét hàng là cấp dữ liệu cho từng hàng kết hợp với việc chọn hàng để
hiển thị dữ liệu tương ứng.
Như đã nghiên cứu ở phần led 7 đoạn, để mở rộng khả năng điều khiển
led, ta sẽ dùng IC 74595 để cung cấp dữ liệu hiển thị và dữ liệu điều khiển.
Phương pháp quét được trình bày trong bài viết này là phương pháp quét
hàng, phương pháp quét cột các bạn có thể tự phát triển.
Sau đây là sơ đồ module led ma trận:
Bước 1: Bấm vào nút để chọn font chữ nếu muốn hiển thị tin nhắn,
kích cỡ chữ phải bằng 8 vì chiều cao ma trận led là 8. Font chữ nên chọn là
Time New Roman vì nó đơn giản, phù hợp với kích cỡ ma trận nhỏ.
Bước 2: Bấm vào thẻ Character input, mục Output size bỏ check tại
Auto set, chọn Width là 32 (mỗi led ma trận có chiều rộng 8 bit, 4 led ma trận
ghép lại là 32 bit) và chọn Height là 8 (mỗi led ma trận có chiều cao 8 bit). Sau
khi chọn xong ta có 1 vùng trống kích thước 32x8, ta có thể tùy ý vẽ 1 hình
dạng bất kỳ bằng việc bấm chuột trái vào vùng này.
Bước 3: Nếu muốn hiển thị tin nhắn thì ta gõ tin nhắn vào ô Char input.
Sau đó dùng các tọa độ tại mục Offset để di chuyển tin nhắn vào vị trí cần thiết.
Ngoài ra có thể sử dụng các công cụ trong menu bên trái để chỉnh sửa hiển thị.
Bước 4: Sau khi chuẩn bị xong hình ảnh muốn hiển thị, ta chọn phương
Bước 5: Xuất dữ liệu, ta bấm vào nút , ở thẻ One font data output
ta sẽ nhận được 1 dãy mã hex. Gồm 32 phần tử được sắp xếp như sau:
Dữ liệu hàng 1 của led 1, dữ liệu hàng 1 của led 2… dữ liệu hàng 1 của
led 4, dữ liệu hàng 2 của led 1,… dữ liệu hàng 2 của led 4,… dữ liệu hàng 4
của led 4.
Như vậy dữ liệu đã được sắp xếp sẵn theo hàng ngang, ta sẽ lấy 32 phần
tử này bỏ vào 1 mảng để tiện cho việc truy xuất, khi xuất dữ liệu chỉ cần xuất
lần lượt ra các IC 74595.
Các bước thực hiện quét led ma trận theo module hình 9.
Bước 1: Dùng hàm xuất dữ liệu cho dãy IC74595 thứ nhất (Ic74595_Write)
xuất theo thứ tự giảm dần dữ liệu hàng của các led từ 4 đến 1(phần tử 3 đến
phần tử 0 của mảng).
Bước 2: Dùng hàm xuất dữ liệu cho dãy IC 74595 thứ 2 xuất dữ liệu chọn hàng
1 cho tất cả các led
Bước 3: Dùng hàm xuất dữ liệu cho dãy IC 74595 thứ 2 xuất dữ liệu trống để
tắt tất cả các led.
Lặp lại các bước từ 1 đến 3 với các dữ liệu hàng và dữ liệu chọn hàng
tăng dần (các phần tử của mảng dữ liệu hàng xuất theo thứ tự: 3-0, 7-4, 11-
8,15-12, 19-16, 23-20, 27-24, 31-28)
Vào
Tăng i
Đủ
Ra
};
//HAM GHI DU LIEU VAO IC 74595
void Ic74595_Write(char dat,char ic,char bits){//bits LÀ BIẾN CHỈ ĐỘ RỘNG DỮ LIỆU
signed char fc; //BIẾN ĐẾM
if(ic==1){ //CHỌN XUẤT RA IC 74595 THỨ NHẤT
for(fc=bits-1;fc>=0;fc--){
dat1=(dat>>fc)&0x01; // TẠO DỮ LIỆU NỐI TIẾP
sclk1=1; //TẠO XUNG DỊCH
sclk1=0;
}
lclk1=1; //TẠO XUNG CHỐT
lclk1=0;
}
if(ic==2){ //CHỌN XUẤT RA IC 74595 THỨ HAI
for(fc=bits-1;fc>=0;fc--){
dat2=(dat>>fc)&0x01; // TẠO DỮ LIỆU NỐI TIẾP
sclk2=1; //TẠO XUNG DỊCH
sclk2=0;
}
lclk2=1; //TẠO XUNG CHỐT
lclk2=0;
}
}
void Ledmatrix_Out(char dat){
signed char i,j,k;
for(i=0;i<=7;i++){
for(j=3;j>=0;j--){
Ic74595_Write(BitmapData[(j+4*i)],1,8); //XUẤT DỮ LIỆU HÀNG
}
Ic74595_Write(0x01<<i,2,8); //XUẤT DỮ LIỆU CỘT
delay_ms(1);
Ic74595_Write(0x00,2,8); //XÓA DỮ LIỆU CỘT
}
}
void main(){
DDRC=0xff;
while(1){
Ledmatrix_Out(BitmapData);
}
}
Để tạo các hiệu ứng, tùy vào quy luật chuyển động của hiệu ứng mà ta
phát triển các hàm hỗ trợ, để tạo thời gian trì hoãn cho mỗi thao tác, ta có thể
dùng vòng lặp để quét liên tục.
Sau đây là chương trình với 1 số hiệu ứng đơn giản.
Yêu cầu : Viết chương trình dịch hiển thị xoay vòng từ trái sang phải và từ trên
xuống dưới.
Chương trình thao khảo :
Bai2_3_B : Cuộn dữ liệu hiển thị
#define sclk1 PORTC0_bit
#define dat1 PORTC1_bit
#define lclk1 PORTC2_bit
#define sclk2 PORTC3_bit
#define dat2 PORTC4_bit
#define lclk2 PORTC5_bit
char i,j,s;
char Dmem[32];
unsigned char BitmapData[]= {
0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,
0x49,0x49,0x49,0x49,
0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,
0x22,0x22,0x22,0x22,
0x14,0x14,0x14,0x14,
0x08,0x08,0x08,0x08,
};
//HAM GHI DU LIEU VAO IC 74595
void Ic74595_Write(char dat, char ic, char bits){
signed char fc; //BIEN DEM
if(ic==1){ //CHON GHI VAO IC 74195 THU NHAT
for(fc=bits-1;fc>=0;fc--){
dat1=(dat>>fc)&0x01; // TAO DU LIEU NOI TIEP
sclk1=1; //TAO XUNG DICH
sclk1=0;
}
lclk1=1; //TAO XUNG CHOT
lclk1=0;
}
if(ic==2){ //CHON GHI VAO IC 74195 THU NHAT
for(fc=bits-1;fc>=0;fc--){
dat2=(dat>>fc)&0x01; // TAO DU LIEU NOI TIEP
sclk2=1; //TAO XUNG DICH
sclk2=0;
}
lclk2=1; //TAO XUNG CHOT
lclk2=0;
}
}
void Dmemloop_vertical(){
char temp,i,j,k;
for(i=0;i<=3;i++){
temp=Dmem[28+i];
for (j=0;j<=6;j++){
Dmem[28+i-4*j]=Dmem[24+i-4*j];
}
Dmem[0+i]=temp;
}
}
void Dmemloop_horizal(){
char i,j;
char temp[4];
for(i=0;i<=7;i++){
for(j=0;j<=3;j++){ // SAO LUU BIT MSB
temp[j]=Dmem[j+4*i]>>7;
}
for(j=0;j<=3;j++){ // DICH TAT CA DU LIEU HANG DI 1 BIT
Dmem[j+4*i]=Dmem[j+4*i]<<1;
}
Dmem[0+4*i]=Dmem[0+4*i]|temp[3];
Dmem[1+4*i]=Dmem[1+4*i]|temp[0];
Dmem[2+4*i]=Dmem[2+4*i]|temp[1];
Dmem[3+4*i]=Dmem[3+4*i]|temp[2];
}
}
void Ledmatrix_Out(char dat[],long time){
signed char i,j;
long k;
for(k=0;k<=time/8;k++){
for(i=0;i<=7;i++){
for(j=3;j>=0;j--){
Ic74595_Write(dat[(j+4*i)],1,8); //GHI DU LIEU HANG
}
Ic74595_Write(0x01<<i,2,8);
delay_ms(1);
Ic74595_Write(0x00,2,8); //XOA DU LIEU DIEU KHIEN HANG
}
}
}
void main(){
DDRC=0xff;
for(i=0;i<=31;i++){
Dmem[i]=BitmapData[i];
}
while(1){
for(i=0;i<=7;i++){
Ledmatrix_Out(Dmem,100);
Dmemloop_vertical();
}
for(i=0;i<=15;i++){
Ledmatrix_Out(Dmem,100);
Dmemloop_horizal();
}
}
}
Việc tạo hiệu ứng trong ví dụ trên thực chất là biến đổi giá trị hiển thị
thông qua một mảng chứa giá trị tạm thời (Dmem). Các thao tác byte và bit
được hình thành dựa trên quy luật thay đổi cần thiết của hiệu ứng.
Ngoài ra, ta có thể tạo hiệu ứng hiển thị bằng cách can thiệp vào quá
trình ghi dữ liệu xuất qua IC 74595.
Dữ liệu dành cho việc hiển thị cho led ma trận là rất lớn nên chiếm dụng
nhiều Flash ROM để lưu trữ và nhiều RAM khi xử lý hiển thị.
Trong 2 phần quét led 7 đoạn và quét led ma trận, tôi đã giới thiệu hàm xuất
dữ liệu bằng IC 74595. Hàm này thực chất là 1 dạng chuyển dữ liệu nối tiếp
thành song song. MikroC cung cấp cho ta 1 hàm tương tự nằm trong thư viện
Software SPI Library, thư viện này gồm có 2 hàm :
Ngoài ra, vi điều khiển AVR còn hỗ trợ truyền thông nối tiếp bằng phần cứng.
Một số chân nhập xuất có nhiệm vụ riêng là hỗ truyền nhận dữ liệu nối tiếp.
MikroC cung cấp cho ta các hàm để điều khiển quá trình nhập xuất được hỗ trợ
bởi phần cứng của AVR, các hàm này nằm trong thư viện SPI library.
Các bạn có thể tham khảo thêm cách sử dụng và cấu hình các hàm này trong
phần Help của MikroC.
Cũng như công việc quét led 7 đoạn, việc quét led ma trận vẫn gặp phải
vấn đề chớp nháy khi xử lý chung với phím hoặc 1 ngoại vi khác cần thời gian
xử lý dài và không cố định vì việc quét led đòi hỏi hàm quét led phải được gọi
ra liên tục và đều đặn. Ở bài sau, tôi sẽ trình bày cách khắc phục hiện tượng
trên.
Lưu ý: Các file mô phỏng chỉ nhằm mục đích minh họa các ví dụ,
không có giá trị sử dụng thực tế. Một vài gợi ý để cải tiến hoạt động của
mạch cho phù hợp với thực tế.
+Trong thực tế, led ma trận thường nhận dữ liệu hiển thị(dữ liệu hàng)
vào các chân anode chung, khi đó ta phải cấp dòng cho từng hàng chứ không
phải nhận dòng vì vậy ULN2803 sẽ thay bằng loại IC thúc dòng hoặc đơn giản
hơn là dùng 8 transistor PNP đệm dòng cho IC 74595. Lúc này, dữ liệu điều
khiển và dữ liệu hiển thị cũng phải lấy đảo từng bit để hiển thị cho phù hợp.
+Việc xuất dữ liệu điều khiển (xuất địa chỉ) bằng IC 74595 hầu như ít sử
dụng . Thay vào đó người ta thường dùng IC giải mã “n đường sang 2n đường”
mà trong trường hợp này có thể dùng IC 74138. Khi đó dữ liệu điều khiển là 3
bit tạo địa chỉ cho IC 74138 (tuần tự từ 0-7).
+Tuy cách xuất dữ liệu như trình bày ở trên có thể mở rộng ra khá
nhiều led ma trận mà không tốn thêm chân I/O, nhưng không nên điều khiển
cùng lúc quá nhiều led ma trận. Lý do thứ nhất là cần đảm bảo tần số quét cũng
như lưu ý đến độ trễ truyền của các IC để các led không bị nhấp nháy, thứ 2 là
tốn nhiều bộ nhớ. Nên thiết kế các module điều khiển led riêng biệt.