/*  Filename      ZMAX7219
    Description   EXAMPLE  PROGRAM  FOR  MAX7219
    Hardware     SLAB-51  +  DP-708
    Compiler      Keil PK51 V7.10
    Engineer      Anan Phukittikul
    Company     Sila Research Co.,Ltd. 
*/

#include <reg51.h>
#include <absacc.h>
#include <ctype.h>
#include <intrins.h>
#include <math.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/********** I/O PORT **********/

sbit MXCLK = P1^0;
sbit MXLDB = P1^1;
sbit MXDAT = P1^4;

/**** INT-RAM WORKING AREA ****/

unsigned char DISBUF[8];

/******** SUB FUNCTION ********/

void dmsec (unsigned int count) {      // mSec Delay 11.0592 Mhz 
    unsigned int i;		               // Keil v5.2  (Speed x 1)
    while (count) {
        i = 115; while (i>0) i--;
        count--;
    }
}
void mxbyte (unsigned char add,unsigned char dat) {       // max7219 send one byte 
    unsigned char i;
    for (i=1;i<=8;i++) {               // 8 bit address 
        MXDAT = add & 0x80;
        add = add << 1;
        MXCLK = 1;
        MXCLK = 0;
    }
    for (i=1;i<=8;i++) {               // 8 bit data 
        MXDAT = dat & 0x80;
        dat = dat << 1;
        MXCLK = 1;
        MXCLK = 0;
    }
    MXLDB = 1;                         // load clock 
    MXLDB = 0;
}

void mxset (void) {                    // max7219 setup 
    MXCLK = 0;
    MXLDB = 0;
    mxbyte (0x0f,0);                   // display - normal 
    mxbyte (0x0c,1);                   // shutdown - normal 
    mxbyte (0x09,0);                   // decode - no decode 
    mxbyte (0x0a,5);                   // intensity 
    mxbyte (0x0b,7);                   // scan limit - 8 digit 
}

void mxload (void) {                   // max7219 load to display 
    mxset ();
    mxbyte (1,DISBUF[0]);
    mxbyte (2,DISBUF[1]);
    mxbyte (3,DISBUF[2]);
    mxbyte (4,DISBUF[3]);
    mxbyte (5,DISBUF[4]);
    mxbyte (6,DISBUF[5]);
    mxbyte (7,DISBUF[6]);
    mxbyte (8,DISBUF[7]);
}

unsigned char code SEGTAB[16] = {0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,
                                 0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47};
                                 // max7219 segment code 


/********** MAIN PROGRAM **********/

void main (void) {
    unsigned char i,j,k;
    while (1) {
        k = 0x01;				                           	
        for (j=0;j<=7;j++) {    // Display Segment G -> F -> E -> D -> C -> B -> A -> DP               
            for (i=0;i<=7;i++) DISBUF[i] = k;          
            mxload ();                                 
            dmsec (500);                               
            k = k << 1;                                         
        }
        for (j=0;j<=15;j++) {   // Display 0 - 9,A - F
            	k = SEGTAB[j];
            	for (i=0;i<=7;i++) DISBUF[i] = k;
            	mxload ();
            	dmsec(500);
            	k = k << 1;
      	} 
        }
}


