Bây giờ thì bắt tay vào việc nhé. Trước tiên hướng tới thành quả cuối cùng để lấy hứng thú làm việc.
Và dưới đây là schematic của tutorial này nhé:
(em đang không vào được mạng qua đường chính thống, phải đi qua proxy nên không xài chức năng upload file của diễn đàn được, các bác chịu khó down rapidshare
http://rapidshare.com/files/133103844/Orcad.rar
Vậy ta đã giải quyết xong vấn đề cấp nguồn, giờ còn việc đưa data ra các chân Đ1 - Đ8, X1 – X8 của 3 con led ma trận. Ta sẽ cần 6 con IC dịch 74HC595. Nguyên lý làm việc của con này mong các bác tham khảo ở datasheet. Em chỉ tóm tắt thế này. Chân DATA_IN là đường dữ liệu vào (bit dữ liệu nối tiếp). Một xung SCK sẽ làm bit này đi vào thanh ghi dịch trong bụng con 74HC595. Sau 8 bit liên tục thì thanh ghi dịch này sẽ đầy. Tiếp tục đưa bit thứ 9 vào thì bit đầu tiên sẽ bị lòi ra chân số 9 và bit này lại là bit đầu tiên của IC 74HC595 tiếp theo (chân 9 của IC trước nối chân 14 của IC sau). Ta sẽ phải đưa liên tục 8 x 6 = 48 bit để xuất đủ dữ liệu cho 2 màu xanh và đỏ.
Tuy nhiên cần lưu ý là thanh ghi dịch mới chỉ thay đổi trong bụng con 74HC595 thôi chứ chưa đưa ra các chân. Muốn đưa dữ liệu từ các thanh ghi dịch này ra các chân 74HC595 thì cần đưa một xung vào chân RCK (chân số 12).
Các bác để ý là 6 chân SCK của 6 IC 74HC595 nối nhau và đưa về MCU, 6 chân RCK cũng tương tự. Chân G (enable) được nối mass và chân MR (chân reset) nối lên nguồn.
Trong tutorial này, để tiết kiệm thời gian cho em và cho các bác, em chỉ cắm 3 con 74HC595 phục vụ cho việc sáng các led đỏ. Các bác có thể làm với cả 6 IC dịch để sáng được cả các led xanh nếu muốn.
Các bác xem hình ảnh khi cắm xong 3 con 74HC595 này, hơi rối một chút nhưng bác sỹ bảo không sao:
Rồi, đưa cả con MCU vào luôn nhé, ở đây em dùng ATMEGA8515. Schematic các bác xem ở bài trước. Bác nào xài PIC thông cảm nhé, bữa nào em rảnh em làm lại cái này với PIC vậy
Oái, sao tự nhiên nó sáng mấy cái led vậy, chắc con ATMEGA8515 của em đang chạy chương trình cũ của nó. Các bác đừng quan tâm nhé.
Vậy là phần cứng đã xong, em để 1,2 ngày để các bác viết thử phần mềm. Các bác cần lưu ý là em không sử dụng điện trở hạn dòng nhé. Thông thường người ta sẽ hạn dòng bằng điện trở 220-330 ohm ở các chân Đ1 - Đ8 trước khi nối vào IC 74HC595. Vì em sử dụng phương pháp quét hàng, mỗi hàng chỉ sáng trong thời gian rất ngắn nên sẽ không ảnh hưởng gì đến tuổi thọ của led. Tuy nhiên khi lần đầu tiên làm với led ma trận các bác sẽ không tránh khỏi việc ngâm điện 5V giữa 2 đầu của led. Em mách các bác một chiêu nho nhỏ, thay vì nối thẳng chân E của các transistor B562 lên nguồn, các bác hãy nối qua một điện trở khoảng 330 ohm. Sau khi chương trình của ta tốt rồi, ta sẽ bỏ các điện trở này đi.
Các bài viết tiếp theo của em sẽ viết về cách hiển thị dữ liệu lên
module led ma trận, cách tạo phông chữ bằng phần mềm Microsoft Excel, cách tạo các hiệu ứng dịch chữ, tăng giảm độ sáng, cách làm chữ hiện lên, biến mất... Các bác từ từ đón xem.
Hôm nay ta bắt đầu viết những chương trình đầu tiên, từ cái dễ đến cái khó. Không thể nào có thể viết một phát mà có ngay một dòng chữ chuyển động ngay được. Giống như ta tập đi, từng bước một.
Ban đầu ta sẽ làm sao để bảng led ma trận của ta hiển thị được cứ một điểm sáng lại có một điểm tắt như sau:
Chương trình em sẽ viết rất đơn giản như sau (áp dụng với
module led full):
#include <mega8515.h>
#include <delay.h>
#define SCK PORTB.7 //Chân cấp xung để đưa data vào trong thanh ghi dịch
#define DATA PORTB.5 //Chân đưa data vào thanh ghi dịch
#define SCL PORTB.3 //Khi data đã vào trong thanh ghi dịch, đưa một xung ra chân này để đưa data từ thanh ghi dịch ra các chân của IC74HC595
//Bốn chân sau đây điều khiển việc cấp nguồn ra các hàng của led ma trận
#define A PORTC.0;
#define B PORTC.1;
#define C PORTC.2;
#define OE1 PORTC.3;
unsigned char i,j;
void Data_in(unsigned char k){ // k là bit dữ liệu vào có giá trị là 0 hoặc 1;
DATA=k; // DATA đưa dữ liệu vào thanh ghi dịch
SCK=0; // Tạo ra một xung ở chân SCK
SCK=1;
}
void LatchData(){
SCL=0; // Sau khi đưa đủ dữ liệu vào các thanh ghi dịch
SCL=1; // ta tạo một xung để đưa dữ liệu từ thanh ghi dịch ra các chân của 74HC595
}
void main(void){
DDRB=0xFF; // Cho PORTB, PORTC là output hết
DDRC=0xFF;
SCK=1; // Ban đầu đưa các chân này lên 1
SCL=1; // Để tạo xung ta sẽ cho nó băng 0 rồi lại bằng 1
while (1){
for (i=0;i<=7;i++){ // 8 hàng, từ hàng 0 đến hàng 7 (H1 - H8)
// Ta có tất cả 8 hàng và 24 cột. Do đó phải đưa 24 bit dữ liệu ra các thanh ghi dịch (vòng lặp for gọi 12 lần, mỗi lần đưa ra 1 bit 1, 1 bit 0)
for (j=1;j<=12;j++){
Data_in(0);
Data_in(1);
}
// Đưa ra thanh ghi dịch xong rồi, đưa data ra các chân của 74HC595
LatchData();
// PortC sẽ đưa ra các số từ 0 đến 7 ở các chân PORTC.0, PORTC.1,.PORTC.2,... Ta cộng thêm 8 để muốn chân PORTC.3 sẽ luôn bằng 1. Con 74HC138 sẽ ở trạng thái tích cực để giải mã từ 3 ra 8.
PORTC=i+8;
// Delay một chút để tạo hiện tượng lưu ảnh của mắt. Các bác hãy thay đổi giá trị này để thấy rõ hiệu ứng quét hàng. Thay số 3 bằng 50 chẳng hạn.
delay_ms(3);
}
};
}
Vậy là xong bài lập trình đầu tiên. Dễ như ăn cháo các bác nhỉ?
(Nguồn: dientuvietnam.net)