Dot Matrix Scrolling Message with MAX6952

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 มาด้วยลองโหลดไปรันดูนะครับ