128 lines
No EOL
4.3 KiB
C
128 lines
No EOL
4.3 KiB
C
/*------------------------------------------------------------------*/
|
|
/* --- STC MCU Limited ---------------------------------------------*/
|
|
/* --- STC89-90xx Series MCU ISP/IAP/EEPROM Demo -------------------*/
|
|
/* --- Mobile: (86)13922805190 -------------------------------------*/
|
|
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
|
|
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
|
|
/* --- Web: www.STCMCU.com -----------------------------------------*/
|
|
/* --- Web: www.GXWMCU.com -----------------------------------------*/
|
|
/* If you want to use the program or the program referenced in the */
|
|
/* article, please specify in which data and procedures from STC */
|
|
/*------------------------------------------------------------------*/
|
|
|
|
#include "reg51.h"
|
|
#include "intrins.h"
|
|
#include "eeprom.h"
|
|
#include "delay.h"
|
|
|
|
unsigned int bestScore[10]={0};
|
|
|
|
/*----------------------------
|
|
Disable ISP/IAP/EEPROM function
|
|
Make MCU in a safe state
|
|
----------------------------*/
|
|
void IapIdle()
|
|
{
|
|
IAP_CONTR = 0; //Close IAP function
|
|
IAP_CMD = 0; //Clear command to standby
|
|
IAP_TRIG = 0; //Clear trigger register
|
|
IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area
|
|
IAP_ADDRL = 0; //Clear IAP address to prevent misuse
|
|
}
|
|
|
|
/*----------------------------
|
|
Read one byte from ISP/IAP/EEPROM area
|
|
Input: addr (ISP/IAP/EEPROM address)
|
|
Output:Flash data
|
|
----------------------------*/
|
|
BYTE IapReadByte(WORD addr)
|
|
{
|
|
BYTE dat; //Data buffer
|
|
|
|
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
|
|
IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command
|
|
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
|
|
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
|
|
IAP_TRIG = 0x46; //Send trigger command1 (0x46)
|
|
IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
|
|
_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
|
|
dat = IAP_DATA; //Read ISP/IAP/EEPROM data
|
|
IapIdle(); //Close ISP/IAP/EEPROM function
|
|
|
|
return dat; //Return Flash data
|
|
}
|
|
|
|
/*----------------------------
|
|
Program one byte to ISP/IAP/EEPROM area
|
|
Input: addr (ISP/IAP/EEPROM address)
|
|
dat (ISP/IAP/EEPROM data)
|
|
Output:-
|
|
----------------------------*/
|
|
void IapProgramByte(WORD addr, BYTE dat)
|
|
{
|
|
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
|
|
IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command
|
|
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
|
|
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
|
|
IAP_DATA = dat; //Write ISP/IAP/EEPROM data
|
|
IAP_TRIG = 0x46; //Send trigger command1 (0x46)
|
|
IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
|
|
_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
|
|
IapIdle();
|
|
}
|
|
|
|
/*----------------------------
|
|
Erase one sector area
|
|
Input: addr (ISP/IAP/EEPROM address)
|
|
Output:-
|
|
----------------------------*/
|
|
void IapEraseSector(WORD addr)
|
|
{
|
|
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
|
|
IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command
|
|
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
|
|
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
|
|
IAP_TRIG = 0x46; //Send trigger command1 (0x46)
|
|
IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
|
|
_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
|
|
IapIdle();
|
|
}
|
|
|
|
void addBest(unsigned int s)
|
|
{
|
|
int i,j;
|
|
for(i=0;i<10;i++)
|
|
if(bestScore[i]<s)
|
|
{
|
|
for(j=9;j>i;j--)
|
|
bestScore[j]=bestScore[j-1];
|
|
|
|
bestScore[i]=s;
|
|
saveBest();
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
void saveBest()
|
|
{
|
|
char i;
|
|
IapEraseSector(IAP_ADDRESS);
|
|
delayms(20);
|
|
for(i=0;i++;i<10)
|
|
{
|
|
IapProgramByte(IAP_ADDRESS+2*i, bestScore[i]/256);
|
|
delayms(15);
|
|
IapProgramByte(IAP_ADDRESS+2*i+1, bestScore[i]%256);
|
|
delayms(15);
|
|
}
|
|
}
|
|
|
|
void readBest()
|
|
{
|
|
char i;
|
|
for(i=0;i++;i<10)
|
|
{
|
|
bestScore[i]=(unsigned int)IapReadByte(IAP_ADDRESS+2*i)*256 +(unsigned int)IapReadByte(IAP_ADDRESS+2*i+1);
|
|
}
|
|
} |