/**--------------File Info---------------------------------------------------------------------------------
** File name: timer_con.c
** Latest modified Date: 2010-09-04
** Latest Version: 1.00
** Descriptions: eeprom
**
**--------------------------------------------------------------------------------------------------------
** Created by: Xuegang
** Created date: 2010-09-04
** Version: 1.00
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include <STC_NEW_8051.H>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
/********定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数*******/
#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
#define DEBUG_DATA 0x5a //本测试程序最终存储在 EEPROM 单元的数值
#define DATA_FLASH_START_ADDRESS 0x00 //STC5Axx 系列 EEPROM 测试起始地址
unsigned char Byte_Read(unsigned int add); //读一字节,调用前需打开IAP 功能
void Byte_Program(unsigned int add,unsigned char ch); //字节编程,调用前需打开IAP 功能
void Sector_Erase(unsigned int add); //擦除扇区
void IAP_Disable(); //关闭IAP 功能
void Delay();
void shortdelay(void);
/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void main (void)
{
unsigned int address;
unsigned char read_eeprom;
shortdelay();
Sector_Erase(0x56);
shortdelay();
Byte_Program(0x56,0xa5);
shortdelay();
while(1)
P2=Byte_Read(0x56);
//CPU 在此无限循环执行此句
}
/*********************************************************************************************************
** Function name: Byte_Read
** Descriptions: 读字节 读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
** input parameters: 无
** output parameters: 无
** Returned value: IAP_DATA
*********************************************************************************************************/
unsigned char Byte_Read(unsigned int add)
{
IAP_DATA=0x00;
IAP_CONTR=ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD=0x01; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH=add/256; //设置目标单元地址的高8 位地址
IAP_ADDRL=add%256; //设置目标单元地址的低8 位地址
//EA = 0;
IAP_TRIG=0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG=0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable();
/*关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关*/
return(IAP_DATA);
}
/*********************************************************************************************************
** Function name: Byte_Program
** Descriptions: 字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
** input parameters: 无
** output parameters: 无
** Returned value:
*********************************************************************************************************/
void Byte_Program(unsigned int add, unsigned char dat)
{
IAP_CONTR=ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD=0x02; //IAP/ISP/EEPROM 字节编程命令
IAP_ADDRH=add/256; //设置目标单元地址的高8 位地址
IAP_ADDRL=add%256; //设置目标单元地址的低8 位地址
IAP_DATA=dat; //要编程的数据先送进IAP_DATA 寄存器
//EA = 0;
IAP_TRIG=0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG=0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable();
/*关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关*/
}
/*********************************************************************************************************
** Function name: Sector_Erase
** Descriptions: 擦除扇区, 入口:DPTR = 扇区地址
** input parameters: 无
** output parameters: 无
** Returned value:
*********************************************************************************************************/
void Sector_Erase(unsigned int add)
{
IAP_CONTR=ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD=0x03; //IAP/ISP/EEPROM 扇区擦除命令
IAP_ADDRH=add/256; //设置目标单元地址的高8 位地址
IAP_ADDRL=add%256; //设置目标单元地址的低8 位地址
//EA = 0;
IAP_TRIG=0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG=0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable();
/*关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态*/
}
/*********************************************************************************************************
** Function name: IAP_Disable
** Descriptions: 关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
** 一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
** input parameters: 无
** output parameters: 无
** Returned value:
*********************************************************************************************************/
void IAP_Disable()
{
IAP_CONTR=0; //关闭IAP 功能
IAP_CMD=0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG=0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH=0;
IAP_ADDRL=0;
}
/*********************************************************************************************************
** Function name: Delay
** Descriptions: 延时
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Delay()
{
unsigned char i;
unsigned int d=5000;
while (d--)
{
i=255;
while (i--);
}
}
void shortdelay(void)
{
unsigned char i;
unsigned int d=10;
while (d--)
{
i=5;
while (i--);
}
}