Dot Matrix Scrolling Message with MAX6952
MAX6952 เป็นไอซีสำเร็จรูปจากค่าย Maxim เอาไว้สำหรับรับส่งข้อมูลกับไมโครโปรเซสเซอร์ แบบ SPI เพื่อขับ LED dot matrix (common row cathod) ขนาด 5x7 โดยไอซี MAX6952 สามารถขับ LED dot matrix ได้ 4 ชุด ดังรูปวงจร
ในตัวอย่างนี้ ผมเลือก MAX6952 จากโปรแกรมจำลอง Proteus แล้วใช้ PIC16F877 ซึ่งโค๊ดถูกเขียนด้วย CCS C Compiler ทำการขับตัวอักษรจากconst char ID[] ={'B','4','9','1','3','3','0','6'}; แสดงออกที่ Dot matrix
การทำงานของโปรแกรม ไม่มีอะไรมาก เนื่องจากเป็นการใช้ไอซีสำเร็จรูป และการจัดเรียงวงจรก็ไม่ซับซ้อน ปล่อยเป็นหน้าที่ของไอซี MAX6952 ทำหน้าที่ในการรับข้อมูลจาก PIC16F877 แล้วขับไปที่หลอด LED Dot matrix แต่ก็ต้องแลกมาด้วยราคาไอซี ที่มากกว่าไอซี shift register อย่างเช่น 74HC595
#include <16F877.h> // Standard Header file for the PIC16F877 device
#define TxD PIN_C6 // Define Transmitted Data
#define RxD PIN_C7 // Define Received Data
#define CLOCK_SP 8000000 // Clock Speed(8MHz)
#define CLK PIN_D2 //MAX6952 PIN 20
#define CS PIN_D1 //MAX6952 PIN 23
#define DIN PIN_D0 //MAX6952 PIN 21
// Device Specification
#fuses HS // Oscillator mdoe HS
#fuses NOLVP, NOWDT // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT // Code no protection
#use delay (clock=CLOCK_SP) // Use built-in function: delay_ms() & delay_us()
#use rs232(baud=9600, xmit=TxD,rcv=RxD) // Use serial I/O port (RS232)
const char ID[] ={'B','4','9','1','3','3','0','6'};
void Max6952(unsigned char Adress,unsigned char Data)
{
unsigned char y,Result;
for(y=0;y<8;y++)
{
Result = Adress&0x80;
if(Result==0)
{
output_low(DIN);
output_high(CLK);
output_low(CLK);
}
else
{
output_high(DIN);
output_high(CLK);
output_low(CLK);
}
Adress = Adress<<1;
}
for(y=0;y<8;y++)
{
Result = Data&0x80;
if(Result==0)
{
output_low(DIN);
output_high(CLK);
output_low(CLK);
}
else
{
output_high(DIN);
output_high(CLK);
output_low(CLK);
}
Data = Data<<1;
}
return;
}
void main(void)
{
int n = 0;
set_tris_c(0x0F); // D0,D1,D2,D3 are output
output_high(CS);
output_low(DIN);
output_low(CLK);
output_low(CS);
Max6952(0x04,0x01);
output_high(CS);
output_low(CS);
Max6952(0x01,0xFF); //
output_high(CS);
output_low(CS);
Max6952(0x02,0xFF); //
output_high(CS);
output_low(CS);
Max6952(0x03,0x01);
output_high(CS);
output_low(CS);
Max6952(0x07,0x00); // set display
output_high(CS);
output_low(CS);
Max6952(0x20,'B');
output_high(CS);
while(TRUE)
{
output_low(CS);
Max6952(0x20,ID[n]);
output_high(CS);
output_low(CS);
Max6952(0x21,ID[n+1]);
output_high(CS);
output_low(CS);
Max6952(0x22,ID[n+2]);
output_high(CS);
output_low(CS);
Max6952(0x23,ID[n+3]);
output_high(CS);
n = n + 1;
if(n==7)
{
n = 0;
}
delay_ms(700); // Delay 1000 milliseconds
}
}
ผมได้แนบไฟล์ที่เป็น hex และไฟล์ที่เป็นวงจร simulation สำหรับโปรแกรม Proteus มาด้วยลองโหลดไปรันดูนะครับ