#include "exter.h"
/************************
Software delay function
************************/
void Delay(uchar z)
{
uchar i,j;
for(i=0; i<100; i++)
{
for(j=0; j<z; j++)
{
;;
}
}
}
/*********************************
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
**********************************/
void IapIdle(void)
{
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
********************************/
uchar IapReadByte(uint addr)
{
uchar 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 = 0x5a; //Set trigger command1 (0x5a)
IAP_TRIG = 0xa5; //Set trigger command2 (0xa5)
_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(uint addr, uchar 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 = 0x5a; //Set trigger command1 (0x5a)
IAP_TRIG = 0xa5; //Set trigger command2 (0xa5)
_nop_(); //MCU will hold here until ISP/IAP/EEPROM
//operation complete;
IapIdle(); //Close ISP/IAP/EEPROM function
}
/********************************
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:
********************************/
void IapEraseSector(uint 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 = 0x5a; //Set trigger command1 (0x5a)
IAP_TRIG = 0xa5; //Set trigger command2 (0xa5)
_nop_(); //MCU will hold here until ISP/IAP/EEPROM
//operation complete;
IapIdle(); //Close ISP/IAP/EEPROM function
}
/**********************************************************
自己的电路必须用自己的码表
**********************************************************/
#include "smg.h"
//uchar table[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar table[10] = {0xE7,0x21,0xEC,0x6D,0x2B,0x4F,0xCF,0x25, 0xEF,0x6F};
void Display(uchar num)
{
/****显示十位****/
if(num>=10)
{
P0 = 0xfe;
wela = 1;
wela = 0;
P0 = table[num/10];
dula = 1;
dula = 0;
Delay(100);
}
/****显示个位****/
P0 = 0xfd;
wela = 1;
wela = 0;
P0 = table[num%10];
dula = 1;
dula = 0;
Delay(100);
}
#include "exter.h"
#include "smg.h"
void main(void)
{
uchar num;
num = IapReadByte(IAP_ADDRESS);
if(num >= 100)
{
num = 12;
}
IapEraseSector(IAP_ADDRESS); // Erase current sector
IapProgramByte(IAP_ADDRESS, num+1);
while(1)
{
Display(num);
}
}
/**************************/
对应头文件
#ifndef __EXTER_H__#define __EXTER_H__
#include "reg51.h"#include "intrins.h"
typedef unsigned char uchar;typedef unsigned int uint;
/********Declare SFR associated with IAP **********/sfr IAP_DATA = 0xC2; //FLASH data register
sfr IAP_ADDRH = 0xC3; //FLASH address Highsfr IAP_ADDRL = 0xC4; //FLASH address Low
sfr IAP_CMD = 0xC5; //FLASH command registersfr IAP_TRIG = 0xC6; //FLASH command trigger
sfr IAP_CONTR = 0xC7; //FLASH control register
/********Define ISP/IAP/EEPROM command*************/#define CMD_IDLE 0 //Stand - By
#define CMD_READ 1 //Byte - Read #define CMD_PROGRAM 2 //Byte - Program
#define CMD_ERASE 3 //Sector - Erase
/********Define ISP/IAP/EEPROM operation const for IAP_CONTR***********///#define ENABLE_IAP 0x80 //if SYSCLK < 30MHz
//#define ENABLE_IAP 0x81 //if SYSCLK < 24MHz#define ENABLE_IAP 0x82 //if SYSCLK < 20MHz
//#define ENABLE_IAP 0x83 //if SYSCLK < 12MHz//#define ENABLE_IAP 0x84 //if SYSCLK < 6MHz
//#define ENABLE_IAP 0x85 //if SYSCLK < 3MHz//#define ENABLE_IAP 0x86 //if SYSCLK < 2MHz
//#define ENABLE_IAP 0x87 //if SYSCLK < 1MHz
//Start address for STX12C5A60S2 series EEPROM#define IAP_ADDRESS 0x0000
void Delay(uchar);void IapIdle(void); //Disable ISP/IAP/EEPROM function
uchar IapReadByte(uint addr); //Read one byte from ISP/IAP/EEPROM areavoid IapProgramByte(uint addr, uchar date); //Program one byte to ISP/IAP/EEPROM area
void IapEraseSector(uint addr); //Erase one sector area
#endif
#ifndef __SMG_H__#define __SMG_H__
#include "reg51.h"#include "exter.h"
sbit wela = P2^4;sbit dula = P2^3;
void Display(uchar num);
#endif |