74HC138
Đây là bộ giải mã 3 bit thành 8 đường loại vi mạch hay mạch có 3 ngõvào và 8 ngõ ra, còn được gọi là mạch giải mã nhị phân sang octal (binary to octaldecoder) , với ngõ ra tích cực ở mức 1, 74HC138 có công dụng dịch bit logic 0 từ trên xuống và từ dưới lên theo mã BCD. Nó hay được dùng để hỗ trợ quét.
Bảng nguyên lý 74138
Pin 74138
Vi mạch bên trong 74138
Vấn đề được đề cập ở đây là sử dụng nó mở rộng chân cho 8051. Tuy nhiên chủ yếu là nó dùng cho quét led matrix. Tại sao lại như vậy, bạn hãy xem lại bảng mã của nó bạn sẽ thấy, các chân sẽ lần lượt "độc lập" xuống mức thấp. Vậy nếu sử dụng cho LED MATRIX bạn sẽ có thể trực tiếp quét các hàng vì nó là tích cự mức thấp. Còn nếu bạn muốn quét cột, dĩ nhiên vẫn có thể nhưng bạn phải cho các chân tín hiệu qua cổng NOT và các chân tịc cực thấp sẽ chuyển thành cao là ngược lại. Quá dễ phải không nào. Bây giờ mình sẽ ví dụ sử dụng 8051 điều khiển LED Matrix 8x32 nhé. cần ít nhất 5 PORT (1 PORT điều khiển chung và 4 PORT điều khiển riêng) mà 8051 chỉ có tối đa 4 PORT vậy là chắc chắn sẽ sử dụng mở rộng chân với 74138 rùi nhé. Với 74138 bạn sẽ phải phải nối nguồn chân E1, chân E2 và E3 điều khiển đồng thời nếu không hiểu tại sao mình dùng như vậy các bạn xem lại bảng mã của nó nhẽ. Bài này mình sẽ cho quét hàng và dữ liệu sẽ là tích cực mức cao. Nguyên lý như này nhé trong thời gian cực ngắn mình cho Port 1 xuất data vào matrix 1 đồng thời điều khiển cho 74138 thứ 1 quét hàng của matrix 1 với kiểu tư duy như thế này: dữ liệu thứ nhất đưa vào matrix 1 ( cột 1) đồng thời quét hàng 1 tiếp đó đẩy data 2 vào cột 2 và quét hàng 2 tương tự tới hàng 8 cột 8 và sang matrix 2 cũng tuân theo nguyên lý đó chỉ khác là khi sang matrix khác mình sẽ đẩy cho hàng các matrix kia lên mức cao vậy nên các matrix còn lại không hiển thịi dữ liệu của matrix đang đang dùng đến . Vấn đề mấu chốt ở đây là mình quét cả 8 hàng và 8 cột 1 matrix chỉ với thời gian cực nhỏ cỡ micro giây và với 4 matrix mình chắc chỉ mất vài mili giây, cự kì nhanh và mắt thường không nhận ra các led chớp tắt. Hàm delay trong code mình sử dụng là hàm delay không xác định tuy nhiên nó rất nhỏ, nhỏ hơn cả hàm delay mili giây rất nhiều .
Chương trình
#include <REGX51.H>
unsigned char data1[] = {0xc3,0xc3,0xc3,0xc3,0xdb,0xff,0xe7,0xc3};
unsigned char data2[] = {0x66,0x66,0x66,0x7e,0x7e,0x66,0x7e,0x3c};
unsigned char data3[] = {0x66,0x66,0x66,0x6e,0x7e,0x76,0x66,0x66};
unsigned char data4[] = {0x66,0x66,0x66,0x7e,0x7e,0x66,0x66,0x66};
unsigned char Ic1[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7};
unsigned char Ic2[] = {0x0f, 0x1f, 0x2f, 0x3f, 0x4f, 0x5f, 0x6f, 0x7f};
unsigned char Ic3[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7};
unsigned char Ic4[] = {0x0f, 0x1f, 0x2f, 0x3f, 0x4f, 0x5f, 0x6f, 0x7f};
void delay(int time)
{
while(time--);
}
void main()
{
int i, j, k, l;
while(1)
{
for(i=0; i<8; i++)
{
P3_3=P3_7=1;
P2=Ic1[i];
P1=data1[i];
delay(1);
}
for(k=0; k<8; k++)
{
P3_3=P3_7=1;
P2=Ic2[k];
P1=data2[k];
delay(1);
}
for(j=0; j<8; j++)
{
P2_3=P2_7=1;
P3=Ic3[j];
P1=data3[j];
delay(1);
}
for(l=0; l<8; l++)
{
P2_3=P2_7=1;
P3=Ic4[l];
P1=data4[l];
delay(1);
}
}
}
Chú ý dữ liệu bên trên sử dụng tích cự mức 1 và đẩy vào hàng.
Code mô phỏng
No comments:
Post a Comment