/*
--- STC International Limited ----------------
一个完整的EEPROM 测试程序,用宏晶的下载板可以直接测试
STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示
STC12C52xxAD 系列单片机 EEPROM/IAP 功能测试程序演示
STC11xx 系列单片机 EEPROM/IAP 功能测试程序演示
STC10xx 系列单片机 EEPROM/IAP 功能测试程序演示
--- STC International Limited ------------------
--- 宏晶科技 设计 2009/1/12 V1.0 --------------
--- Mobile: 13922805190 ------------------------
--- Fax: 0755-82944243 -------------------------
--- Tel: 0755-82948412 -------------------------
--- Web: www.MCU-Memory.com --------------------
本演示程序在STC-ISP Ver 3.0A.PCB 的下载编程工具上测试通过,EEPROM 的数据
在P1 口上显示, 如果要在程序中使用或在文章中引用该程序,请在程序中或文章中
注明使用了宏晶科技的资料及程序
*/
/*
第一扇区
0x0000 标识EEPROM是否初始化过 初始化过的为0x55H
第二扇区
0x0200 保存曲线
0x0200 数据个数
第三扇区
0x0400 保存曲线 //重量
0x0400-0x0590
第四扇区
0x0600 保存曲线 高度
0x0600-0x06C8
第五扇区
0x0800 重量零点AD值
0x0802 重量放大AD值
0x0804 重量放大输入值
第六扇区
0x0A00 冲水控制
0x0A00 冲水控制下限
0x0A04 冲水控制上限
第七扇区
0x0C00 额定重量
第八扇区
0x0E00 高度上限位
0x0E04 高度下限位
*/
#include "stc12c5a60.h"
#include <intrins.h>
#include<define.h> //全局常量
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值
//#define USED_BYTE_QTY_IN_ONE_SECTOR 1
//#define USED_BYTE_QTY_IN_ONE_SECTOR 2
//#define USED_BYTE_QTY_IN_ONE_SECTOR 4
//#define USED_BYTE_QTY_IN_ONE_SECTOR 8
//#define USED_BYTE_QTY_IN_ONE_SECTOR 16
//#define USED_BYTE_QTY_IN_ONE_SECTOR 32
//#define USED_BYTE_QTY_IN_ONE_SECTOR 64
#define USED_BYTE_QTY_IN_ONE_SECTOR 128
//#define USED_BYTE_QTY_IN_ONE_SECTOR 256
//#define USED_BYTE_QTY_IN_ONE_SECTOR 512
union union_temp16
{
unsigned int un_temp16;
unsigned char un_temp8[3];
}my_unTemp16;
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 write_bytes(unsigned int address,unsigned char num,unsigned char *s);
void read_bytes(unsigned int address,unsigned char num,unsigned char *s);
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
unsigned char Byte_Read(unsigned int add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低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);
}
//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void Byte_Program(unsigned int add, unsigned char ch)
{
IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
IAP_DATA = ch; //要编程的数据先送进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 功能,不需要每次都关
}
//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(unsigned int add)
{
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低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 功能,不需要每次都关
}
void IAP_Disable()
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
/*
//////////////////////////////////////////////////////////
//函 数 名: void read_bytes(unsigned int address,unsigned char num,unsigned char *s)
//函数功能: 读取STC单片机EEPROM中的多个字节数据
//入口参数: address 待读出数据的起始地址
// num 读入多少个数据(字节)
// *s 读出的数据放入s字节指针所代表的内存中
//出口参数: 无
//函数说明: 此函数专用于带EEPROM的STC单片机,
void read_bytes(unsigned int address,unsigned char num,unsigned char *s)
{
unsigned char idata i;
for(i=0;i<num;i++)
{
*s=Byte_Read(address+i) ;
s++;
}
}
//////////////////////////////////////////////////////////
//函 数 名: void write_bytes(unsigned int address,unsigned char num,unsigned char *s)
//函数功能: 向STC单片机EEPROM中的写入多个字节数据
//入口参数: address 待写入数据的起始地址
// num 写入多少个数据
// *s 待写入的数据指针
//出口参数: 无
//函数说明: 此函数专用于带EEPROM的STC单片机,
// 只能向一个扇区中写入数据
void write_bytes(unsigned int address,unsigned char num,unsigned char *s)
{
unsigned char idata i;
Sector_Erase(address); //檫除扇区
for(i=0;i<num;i++)
{
Byte_Program(address+i,*s) ;
s++;
}
} */
/********************************************************/
//函数功能: 向STC单片机EEPROM中的写入两个字节数据
//入口参数: address 待写入数据的起始地址
// Data 写入的数据
//出口参数: 无
/*
void write_2bytes(unsigned int address,unsigned int Data)
{
// Sector_Erase(address); //檫除扇区
Byte_Program(address++,(unsigned char)(Data>>8)); //保存高8位
Byte_Program(address++,(unsigned char)(Data&0x00FF)); //保存低8位
}
*/
/********************************************************/
//函数功能: 从STC单片机EEPROM中读出一个整形数
//入口参数: address �