//* ****************************************************************************
//* ****************************************************************************
//
//    210728 8x8 Dot LED
//
//	  PIC16F18345, MAX7219
//
//    2021/07/28
//
//    injayu
//
//* ****************************************************************************
//* ****************************************************************************

#include    <16f18345.h>                 //* »ç¿ë PIC
#fuses      HS,NOMCLR                    //* 20M Å©¸®½ºÅ» »ç¿ë
#use        delay (clock = 20000000)     //* 20M Å©¸®½ºÅ» »ç¿ë

//*** LCD ¸¦ À§ÇÑ ÇÉ ¼³Á¤ ******************************************************
#pin_select		U1TX = PIN_B7       //* TX ÇÉÀ» B7À¸·Î ¼³Á¤
#pin_select		U1RX = PIN_B5       //* RX ÇÉÀ» B5·Î ¼³Á¤
#use			         rs232 (baud=19200, parity=N, xmit=PIN_B7, rcv=PIN_B5)   //* UART ¼³Á¤


//******************************************************************************
//*** MAX7219 ÇÉ ¼³Á¤ ***********************************************************
#define CLK_PIN     PIN_C7                      //* MAX7219 CLOCK ÇÉÀ» C7¿¡ ¿¬°á
#define CS_PIN      PIN_C6                      //* MAX7219 CS(LOAD) ÇÉÀ» C6¿¡ ¿¬°á
#define DIN_PIN     PIN_C5                      //* MAX7219 DIN ÇÉÀ» C5¿¡ ¿¬°á

#define ENABLE      output_low(CS_PIN)          //* È°¼ºÈ­ Á¤ÀÇ
#define DISABLE     output_high(CS_PIN)         //* ºñÈ°¼ºÈ­ Á¤ÀÇ

#define CLK_L       output_low(CLK_PIN)         //* Clock Low Á¤ÀÇ
#define CLK_H       output_high(CLK_PIN)        //* Clock High Á¤ÀÇ

int8    datFont [50][8] = {                             //* È­¸é ±Û¾¾ Á¤ÀÇ (2Â÷¿ø ¾î·¹ÀÌ)
            {0x3C,0x42,0x99,0xA5,0x81,0xA5,0x42,0x3C},  //* Good 
            {0x3C,0x42,0xBD,0x81,0x81,0xA5,0x42,0x3C},  //* Bad      
            {0x08,0x14,0x22,0x41,0x41,0x49,0x36,0x00},  //* Heart
            {0x00,0x08,0x14,0x22,0x3A,0x36,0x00,0x00},  //* Heart   
            {0x00,0x00,0x08,0x1C,0x14,0x00,0x00,0x00},  //* Heart   
            {0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00}   //* Heart            
        } ;  

//* ****************************************************************************
//* *** MAX7219 ÇÔ¼ö ************************************************************
void write_byte_MAX7219 (int8 byData)           //* 1 ¹ÙÀÌÆ® Data MAX7219¿¡ ¾²±â
{   int8 idxBit ;
    
    for (idxBit = 0;idxBit < 8;idxBit++) {
        rotate_left(& byData, 1) ;              //* MSB¸¦ LSB·Î ¸¸µé±â
        output_bit (DIN_PIN, (byData & 0x01)) ; delay_us (5) ; //* ³¡ÀÚ¸® 0,1 ±¸ºÐÇÏ¿© Ãâ·Â
        CLK_H ; delay_us (5) ; CLK_L ; delay_us (5) ;  //* Ŭ·° À» ¿Ã·È´Ù ³»¸² (óÀ½Àº ³»·Á°¡ ÀÖÀ½))
    }
}

void write_MAX_7219 (int8 valAddr, int8 valData)  //* MAX7219¿¡ ÁÖ¼Ò¿Í µ¥ÀÌŸ º¸³»±â
{   ENABLE ; delay_us(5) ;                          //* MAX7219 È°¼ºÈ¯
    write_byte_MAX7219 (valAddr) ;                  //* MAX7219 ÁÖ¼Òº¸³»±â
    write_byte_MAX7219 (valData) ;                  //* µ¥ÀÌŸ (Value) º¸³»±â
    DISABLE ; delay_us (5) ;                        //* MAX7219 ºñÈ°¼ºÈ­
}

void write_one_frame (int8 frmData)   //* Á¦ÀÏ ¹ØÁÙºÎÅÍ Á¦ÀÏ À­ ÁÙ±îÁö È­¸é Ãâ·Â
{   int8 idx_dig ;
    
    for (idx_dig = 0;idx_dig < 8;idx_dig++) {
        write_MAX_7219 (idx_dig+1, datFont[frmData][idx_dig]) ; //* Digit ÁÖ¼Ò¿Í ÇØ´ç °ªÀ» MAX7219¿¡ ¾²±â
    }
}

void init_MAX7219 (void)            //* MAX7219 ÃʱâÈ­
{   DISABLE ; CLK_L ;
    write_MAX_7219 (0x0C, 0x01) ;     //* Shutdown Mode, 01:Normal Operation, 00: Shutdown
    write_MAX_7219 (0x0A, 0x04) ;     //* Light Intensity
    write_MAX_7219 (0x0B, 0x07) ;     //* Scan Limit
}

//******************************************************************************
//*** Start Main Function ******************************************************
void main (void)
{   int8 idx_no ;

    init_MAX7219 () ;
    
    delay_ms (1000) ;
    printf ("$#BL_100;") ; delay_ms (20) ;
    printf ("$#CLR_LCD;") ; delay_ms (20) ;
    
    while (1) {
        for (idx_no = 0;idx_no <= 4;idx_no++) {
            write_one_frame (idx_no) ;
            printf ("$2,1, No. : %2d;", idx_no) ;
            delay_ms (500) ;
        }
    }
}
//*** End Function *************************************************************
//******************************************************************************