cái này dùng tín hiệu logic để điều khiển cho mỗi chân của led rgb nên hiển thị tối đa được 8 màu.
Với dung lượng bộ nhớ hạn chế của con chip AT được sử dụng thì cái code này viết theo kiểu tra bảng rồi hiển thị. Mỗi trạng thái đèn ứng với tưng thời điểm xuất led sẽ gồm 6 byte được dịch, ở đây các màu RBG được tách ra thành các đường data riêng nên thực tế là dịch 2 byte ở mỗi đường.
Sử dụng một ngắt timer làm nhiệm vụ dịch các bit này đầu vào là 3 số 16 bit uint
void xuat_spi(uint R,uint G, uint B)
{
char i;
for(i=0;i<16;i++)
{
PinR= (R&0x8000);
PinG= (G&0x8000);
PinB = (B&0x8000);
shift() //macro
B<<=1;
R<<=1;
G<<=1;
}
Latch() //macro
}
Dùng một timer TF tính thời gian của một frame hay thời gian để quay hết một vòng
Dùng timer TD để xác định thời gian giữa 2 lần dịch spi
Dùng ngắt ngoài để xác định bắt đầu của vòng
Khi có ngắt ngoài xảy ra thì các quá trình sau được thực hiện.
cập nhật thời gian của timer TV.
Đặt TV= 0 cho lần giám sát sau.
Chia TV cho số điểm ảnh trên cái vòng to nhất ví dụ như 20
Giá trị này được cài đạt cho timer TD PRELOAD
Đặt biến status để biết đây là bắt đầu frame
Giảm biến Delay (số frame cần lặp lại để mắt người có thể thấy được và thời gian duy trì của ảnh hiện tại)
Nếu delay = 0 cập nhật biến status để báo hiển thị sang hình mới
/////////////////////////////////
Khi ngắt timer TD xảy ra thì:
(Nạp lại giá trị PRELOAD cho timer nếu timer ko phải chế độ autoload)
Đọc biến status xác định giá trị offset vào bảng dữ liệu và đặt lại biến status
Đọc dữ liệu cần hiển thị
Xuất ra led
............
Thực ra thì cái này nó cũng đơn giản nếu mọi người có ý muốn làm thì vẫn tự làm được> Mình cũng từng làm 1 cái nhưng không phải xoay kiểu đó mà nó tạo thành một phần của hình cầu gồm 24 led RGB Sử dụng 9 con 74HC595 tạo ra ma trận cầu 24x80. Các thức lập trình cũng kiểu như thế nhưng có vài điểm khác.
Mình không đọc trực tiếp bảng dữ liệu rồi xuất thực tế nó đọc một bộ đệm dữ liệu dữ trạng thái của tất cả các điểm ành tại các thời điểm trong một khung hình xác định.
Việc tạo hiệu ứng hay hiển thị được thực hiện trong hàm main. hàm này có nhiệm vụ đọc dữ liệu, thực hiện các thao tác trên cái mảng dữ liệu này.
Có thể lập trình ở hai chế độ là hiển thị text hoặc đồ họa
Ở chế độ text thì 24 led này được xem như là có 3 dòng
Mỗi dòng sẽ có một bộ đệm text để chứa chữ cần hiển thị
Một bộ đệm Font để chứa các thành phần cấu thành nên kí tự hiện hành
Một biến để chỉ vị trí hiện tại trên mỗi dòng
Một biến chỉ số vào bộ đệm text
Một biến chỉ số vào bộ đệm font,....
...............
Còn ở chế độ đồ họa thì xem nó như một ma trận 24x80
vì vậy sẽ có một hàm cơ sở cấp thấp là hàm
Pixel(byte x,byte y,color);
phần còn lại là thư viện đồ họa, mấy cái hàm nhỏ chơi vui thôi
......
VÌ code chiếm phần lớn dung lượng nên các bảng dữ liệu, mã điều khiển hiển thị ko nằm trong bộ nhớ flash mà được lưu trong eeprom.
Vì mấy con eeprom tốc độ khá chậm nên mình thay bằng Sram.
.....
Em càng nâng cấp lên thì dần dần nó thiên về với thiét kế cho hệ VXL nên đã dừng phát triển, quay sang học ARM.
Hết.
Với dung lượng bộ nhớ hạn chế của con chip AT được sử dụng thì cái code này viết theo kiểu tra bảng rồi hiển thị. Mỗi trạng thái đèn ứng với tưng thời điểm xuất led sẽ gồm 6 byte được dịch, ở đây các màu RBG được tách ra thành các đường data riêng nên thực tế là dịch 2 byte ở mỗi đường.
Sử dụng một ngắt timer làm nhiệm vụ dịch các bit này đầu vào là 3 số 16 bit uint
void xuat_spi(uint R,uint G, uint B)
{
char i;
for(i=0;i<16;i++)
{
PinR= (R&0x8000);
PinG= (G&0x8000);
PinB = (B&0x8000);
shift() //macro
B<<=1;
R<<=1;
G<<=1;
}
Latch() //macro
}
Dùng một timer TF tính thời gian của một frame hay thời gian để quay hết một vòng
Dùng timer TD để xác định thời gian giữa 2 lần dịch spi
Dùng ngắt ngoài để xác định bắt đầu của vòng
Khi có ngắt ngoài xảy ra thì các quá trình sau được thực hiện.
cập nhật thời gian của timer TV.
Đặt TV= 0 cho lần giám sát sau.
Chia TV cho số điểm ảnh trên cái vòng to nhất ví dụ như 20
Giá trị này được cài đạt cho timer TD PRELOAD
Đặt biến status để biết đây là bắt đầu frame
Giảm biến Delay (số frame cần lặp lại để mắt người có thể thấy được và thời gian duy trì của ảnh hiện tại)
Nếu delay = 0 cập nhật biến status để báo hiển thị sang hình mới
/////////////////////////////////
Khi ngắt timer TD xảy ra thì:
(Nạp lại giá trị PRELOAD cho timer nếu timer ko phải chế độ autoload)
Đọc biến status xác định giá trị offset vào bảng dữ liệu và đặt lại biến status
Đọc dữ liệu cần hiển thị
Xuất ra led
............
Thực ra thì cái này nó cũng đơn giản nếu mọi người có ý muốn làm thì vẫn tự làm được> Mình cũng từng làm 1 cái nhưng không phải xoay kiểu đó mà nó tạo thành một phần của hình cầu gồm 24 led RGB Sử dụng 9 con 74HC595 tạo ra ma trận cầu 24x80. Các thức lập trình cũng kiểu như thế nhưng có vài điểm khác.
Mình không đọc trực tiếp bảng dữ liệu rồi xuất thực tế nó đọc một bộ đệm dữ liệu dữ trạng thái của tất cả các điểm ành tại các thời điểm trong một khung hình xác định.
Việc tạo hiệu ứng hay hiển thị được thực hiện trong hàm main. hàm này có nhiệm vụ đọc dữ liệu, thực hiện các thao tác trên cái mảng dữ liệu này.
Có thể lập trình ở hai chế độ là hiển thị text hoặc đồ họa
Ở chế độ text thì 24 led này được xem như là có 3 dòng
Mỗi dòng sẽ có một bộ đệm text để chứa chữ cần hiển thị
Một bộ đệm Font để chứa các thành phần cấu thành nên kí tự hiện hành
Một biến để chỉ vị trí hiện tại trên mỗi dòng
Một biến chỉ số vào bộ đệm text
Một biến chỉ số vào bộ đệm font,....
...............
Còn ở chế độ đồ họa thì xem nó như một ma trận 24x80
vì vậy sẽ có một hàm cơ sở cấp thấp là hàm
Pixel(byte x,byte y,color);
phần còn lại là thư viện đồ họa, mấy cái hàm nhỏ chơi vui thôi
......
VÌ code chiếm phần lớn dung lượng nên các bảng dữ liệu, mã điều khiển hiển thị ko nằm trong bộ nhớ flash mà được lưu trong eeprom.
Vì mấy con eeprom tốc độ khá chậm nên mình thay bằng Sram.
.....
Em càng nâng cấp lên thì dần dần nó thiên về với thiét kế cho hệ VXL nên đã dừng phát triển, quay sang học ARM.
Hết.
Comment