STC单片机内部EEPROM记录开机次数(c语言)
/*STC单片机内部EEPROM八位数码管显示开机次数。本文档仅以学习交流之用。*/
#include
#include
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr IAP_DATA =0XE2;//STC15系列为0XC2
sfr IAP_ADDRH=0XE3;//STC15系列为0XC3
sfr IAP_ADDRL=0XE4;//STC15系列为0XC4
sfr IAP_CMD=0XE5;//STC15系列为0XC5
sfr IAP_TRIG=0XE6;//STC15系列为0XC6
sfr IAP_CONTR=0xe7;//STC15系列为0XC7
#define CMD_IALE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0X81//根据单片机的频率选。详细见数据手册。我为12MHZ
STC15系列:
STC89C51:
#define IAP_ADDRESS 0X2000//自己选择的扇区
unsigned char code dofly_table[10]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7f};//对应显示1~。
void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProramByte(WORD addr,BYTE dat);
void IapErasector(WORD addr);
void main()
{ BYTE i;
i=IapReadByte(IAP_ADDRESS);
IapErasector(IAP_ADDRESS);
i++;
IapProramByte(IAP_ADDRESS,i);
P1=dofly_table[i];
while(1);
}
void IapIdle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}
BYTE IapReadByte(WORD addr)
{
BYTE dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X46;//STC15系列为0X5A
IAP_TRIG=0Xb9;//STC15系列为0XA5
_nop_;
dat=IAP_DATA;
IapIdle();
return dat;
}
void IapProramByte(WORD addr,BYTE dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X46;//STC15系列为0X5A
IAP_TRIG=0Xb9;//STC15系列为0XA5
_nop_;
IapIdle();
}
void IapErasector(WORD addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X46;//STC15系列为0X5A
IAP_TRIG=0Xb9;//STC15系列为0XA5
_nop_;
IapIdle();
}
2014.11.24. 21:55 小谢