/*  Filename     Z82E54FDAT.C
    Description  82E54AE2 Flash-Data Example Program
    Hardware     82E54AE2 + RS232 
    Clock        11.0592 Mhz
    Compiler     Keil PK51 v7.10
    Engineer     Kriangsak B.
    Company      Sila Research Co.,Ltd. 
*/

#include <reg52.h>
#include <absacc.h>
#include <assert.h>
#include <ctype.h>
#include <intrins.h>
#include <math.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

sfr      IFD    = 0xe2;      // 89e58ae sfr
sfr      IFADRH = 0xe3;
sfr      IFADRL = 0xe4;
sfr      IFMT   = 0xe5;
sfr      SCMD   = 0xe6;
sfr      ISPCR  = 0xe7;

/********** BASIC FUNCTION **********/

void dmsec (unsigned int count) {           // mSec Delay
    unsigned int i;                         // for Keil PK51 (Speed x 12) 82E54AE2
    while (count) {
        i = 850; while (i>0) i--;
        count--;
    }
}

unsigned char atohr (unsigned char a) {          // change ascii to hex (R)
    if ((a>='a' && a<='f') || (a>='A' && a<='F')) {
		return ((a + 9) & 0xf);
	}
    else return (a & 0xf);
}

unsigned char atohl (unsigned char a) {          // change ascii to hex (L)
    a = atohr (a);
    a = a << 4;
    return (a);
}

void e54er (unsigned int addr) {                           // 82e54ae2 erase flash (512 byte)

    IFMT = 0x03;             // ap-mem erase mode
    ISPCR = 0x82;            // enable ISP & wait time for 11 Mhz
    IFADRH = (addr >> 8);
    IFADRL = addr;
    SCMD = 0x46;             // sequent command              
    SCMD = 0xb9;
}

void e54wr (unsigned int addr,unsigned char dat) {         // 82e54ae2 write flash  

    IFMT = 0x02;             // ap-mem program mode
    ISPCR = 0x82;            // enable ISP & wait time for 11 Mhz
    IFADRH = (addr >> 8);
    IFADRL = addr;
    IFD = dat;
    SCMD = 0x46;             // sequent command              
    SCMD = 0xb9;
}

unsigned char e54rd (unsigned int addr) {                  // 82e54ae2 read flash  
 
    IFMT = 0x01;             // ap-mem read mode
    ISPCR = 0x82;            // enable ISP & wait time for 11 Mhz
    IFADRH = (addr >> 8);
    IFADRL = addr;
    SCMD = 0x46;             // sequent command              
    SCMD = 0xb9;
    return (IFD);
}

/********** START FUNCTION **********/

void start (void) {              
    SCON = 0x52;             	  // set RS232 parameter
    TMOD = 0x20;
    TH1 = 0xfd;                   // 19200 
    PCON |= 0x80;  
    TR1  = 1;
    dmsec (500);
}

/********** MAIN **********/

void main (void) {
    unsigned int addr;
    unsigned char i,a,b,dat[4];
    start ();

    addr = 0x1800;                                    // display old data in flash
    for (i=0;i<=3;i++) dat[i] = e54rd (addr++);
    addr -= 4; 
    printf ("Data in Flash (0x%04X) = ",addr);
    for (i=0;i<=3;i++) printf ("%02bX ",dat[i]);
    printf ("\r\n");

    printf ("Enter New Data (4 Byte in Hex) :");      // enter new data  
    for (i=0;i<=3;i++) {
        a = getchar ();
        b = getchar ();
        dat[i] = atohl (a) | atohr (b); 
    }        
    printf ("\r\n");

    e54er (addr);                                     // erase page  
    for (i=0;i<=3;i++) e54wr (addr++,dat[i]);         // write data 
    printf ("Power OFF/ON to Check ...\r\n\r\n");
    while (1);
}












