STC内部EEPROM的应用
来源:互联网 发布:如何免费开淘宝店 编辑:程序博客网 时间:2024/04/25 08:19
上面这段代码主要是参考STC单片机内部EEPROM的应用 百度空间_应用平台 这篇文章的(其实基本就是搬过来~),如果只是贴代码,那这篇文章也太无趣了.........#ifndef __EEPROM_H__
#define __EEPROM_H__
#include <reg51.h>
#include <intrins.h>
sfr ISP_DATA = 0XE2;
sfr ISP_ADDH = 0XE3;
sfr ISP_ADDL = 0XE4;
sfr ISP_CMD = 0XE5;
sfr ISP_TRIG = 0XE6;
sfr ISP_CONTR= 0XE7;
#define unchar unsigned char
#define unint unsigned int
#define Read_ISP 0x01
#define Write_ISP 0x02
#define Erase_ISP 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01
#define PerSector 512
/*打开ISP,IAP 功能*/
extern void ISP_Enable(void)
{
EA=0;/* 关中断*///开水封印1
ISP_CONTR&=0x18;/*0001,1000*///开水封印2
ISP_CONTR|=WaitTime;/*写入硬件延时*/
//开水封印3
ISP_CONTR|=0x80;/*ISPEN=1*/
}
/*关闭ISP,IAP 功能*/
extern void ISP_Disable(void)
{
ISP_CONTR&=0x7f;/* ISPEN = 0 */
ISP_TRIG=0x00;
EA=1;/* 开中断*/
}
/*公用的触发代码*/
extern void ISP_Trigger(void)
{
ISP_Enable();/* 打开ISP,IAP 功能*/
ISP_TRIG=0x46;/* 触发ISP_IAP 命令字节1 */
ISP_TRIG=0xb9;/* 触发ISP_IAP 命令字节2 */
_nop_();
}
/*字节读*/
extern unchar Byte_Read(unint byte_addr)
{
ISP_ADDH=(unchar)(byte_addr>>8); /* 地址赋值*/
ISP_ADDL=(unchar)(byte_addr&0x00ff);
ISP_CMD&=0xf8; /* 清除低3 位*/
ISP_CMD|=Read_ISP;/* 写入读命令*/
ISP_Trigger();/* 触发执行*/
//开水封印4
ISP_Disable();/* 关闭ISP,IAP 功能*/
//开水封印5
return ISP_DATA;/* 返回读到的数据*/
}
/*扇区擦除*/
extern void Sector_Erase(unint sector_addr)
{
unint in_addr;
in_addr=(sector_addr&0xfe00);/* 取扇区地址*/
ISP_ADDH=(unchar)(in_addr>>8);
ISP_ADDL=0x00;
ISP_CMD&=0xf8;/* 清空低3 位*/
ISP_CMD|=Erase_ISP;/* 擦除命令3*/
ISP_Trigger();/* 触发执行*/
ISP_Disable();/* 关闭ISP,IAP 功能*/
}
/*字节写*/
extern void Byte_Write(unint byte_addr, unchar original_data)
{
ISP_ADDH=(unchar)(byte_addr>>8); /* 取地址*/
ISP_ADDL=(unchar)(byte_addr & 0x00ff);
ISP_CMD&=0xf8;/* 清低3 位*/
ISP_CMD|=Write_ISP;/* 写命令2*/
ISP_DATA=original_data;/* 写入数据准备*/
ISP_Trigger();/* 触发执行*/
ISP_Disable();/* 关闭IAP 功能*/
}
/*字节写并校验*/
extern unchar Byte_Write_Verify(unint byte_addr, unchar original_data)
{
ISP_ADDH=(unchar)(byte_addr>>8); /* 取地址*/
ISP_ADDL=(unchar)(byte_addr&0xff);
ISP_CMD&=0xf8;/* 清低3 位*/
ISP_CMD|=Write_ISP;/* 写命令2*/
ISP_DATA=original_data;
ISP_Trigger();/* 触发执行*/
/* 开始读,没有在此重复给地址,地址不会被自动改变*/
ISP_DATA=0x00;/* 清数据传递寄存器*/
ISP_CMD&=0xf8;/* 清低3 位*/
ISP_CMD|=Read_ISP;/* 读命令1*/
ISP_TRIG=0x46;/* 触发ISP_IAP 命令字节1 */
ISP_TRIG=0xb9;/* 触发ISP_IAP 命令字节2 */
_nop_();/* 延时*/
ISP_Disable();/* 关闭IAP 功能*/
if(ISP_DATA==original_data)/* 读写数据校验*/
return Ok;/* 返回校验结果*/
else
return Error;
}
/*数组写入*/
extern unchar Array_Write(unint begin_addr, unint len, unchar *array)
{
unint i;
unint in_addr;
/* 判是否是有效范围,此函数不允许跨扇区操作*/
if(len > PerSector)
return Error;
in_addr = begin_addr & 0x01ff;/* 扇区内偏移量*/
//开水封印6
if((in_addr+len)>PerSector)
return Error;
in_addr = begin_addr;
/* 逐个写入并校对*/
ISP_Enable();/* 打开IAP 功能*/
for(i=0;i<len;i++)
{
/* 写一个字节*/
ISP_ADDH=(unchar)(in_addr >> 8);
ISP_ADDL=(unchar)(in_addr & 0x00ff);
ISP_DATA=array[i]; /* 取数据*/
ISP_CMD&=0xf8;/* 清低3 位*/
ISP_CMD|=Write_ISP;/* 写命令2 */
ISP_TRIG=0x46;/* 触发ISP_IAP 命令字节1 */
ISP_TRIG=0xb9;/* 触发ISP_IAP 命令字节2 */
_nop_();
/* 读回来*/
ISP_DATA=0x00;
ISP_CMD&=0xf8;/* 清低3 位*/
ISP_CMD|=Read_ISP;/* 读命令1*/
ISP_TRIG=0x46;/* 触发ISP_IAP 命令字节1 */
ISP_TRIG=0xb9;/* 触发ISP_IAP 命令字节2 */
_nop_();
/* 比较对错*/
if(ISP_DATA!=array[i])
{
ISP_Disable();
return Error;
}
in_addr++;/* 指向下一个字节*/
}
ISP_Disable();
return Ok;
}
/*扇区读出*/
extern unchar Array_Read(unint begin_addr , unchar len ,unchar *array)
{
unint in_addr;
unint i;
if(len > PerSector)
return Error;
in_addr = begin_addr & 0x01ff;/* 扇区内偏移量*/
if((in_addr+len)>PerSector)
return Error;
in_addr = begin_addr; // & 0xfe00; /* 取扇区地址*/
ISP_Enable();
for(i=0;i<len;i++)
{
ISP_ADDH=(unchar)(in_addr>>8);
ISP_ADDL=(unchar)(in_addr & 0x00ff);
ISP_CMD&=0xf8;/* 清低3 位*/
ISP_CMD|=Read_ISP;/* 读命令1*/
ISP_DATA=0;
ISP_TRIG=0x46;/* 触发ISP_IAP 命令字节1 */
ISP_TRIG=0xb9;/* 触发ISP_IAP 命令字节2 */
_nop_();
array[i]=ISP_DATA;
in_addr++;
}
ISP_Disable();/* 关闭IAP 功能*/
return Ok;
}
#endif
由于习惯OK代表为1,Error代表为0,所以开始开水把作者的开头改了一下,这也就埋下了挫折的伏笔.......Duan = duan[0];
while(Array_Write);
Duan = duan[1];
while(Array_Read);
Duan = duan[9];
- STC内部EEPROM的应用
- STC单片机内部EEPROM的应用
- STC内部EEPROM表
- 单片机内部EEPROM的应用
- STC系列单片机内部AD的应用
- STC89C52单片机内部eeprom的应用
- 51单片机内部EEPROM的应用
- STC单片机片内EEPROM的读写
- STC89C52MCU --内部EEPROM的应用和内部扩展RAM的应用
- STC单片机EEPROM读写
- STC EEPROM排列表
- STC DATAFLASH 模拟EEPROM
- STM8内部EEPROM的使用
- STC89C52RC内部EEPROM的读写
- STC89C52RC内部EEPROM的读写
- STM8内部EEPROM的使用
- STM8内部EEPROM的使用
- AVR单片机内部EEPROM应用方法
- matlab——数据类型在unix和PC下的不同
- Download Oracle JDK using wget --no-check-certificat
- matlab——最曲线救国的一招,服了自己了。。。。
- 条件编译——调试之利器
- LCD12864.h
- STC内部EEPROM的应用
- RHEL 出现The system in not registered with RHN
- 调用上级目录中的css样式的路径问题
- NRF24L01坎坷调通之路
- 串口通信——第一个数据异常现象的解决方法
- Js中的window.parent ,window.top,window.self详解
- Oracle GoldenGate跳过错误的事务
- 递归的经典题目——返回任意一个正整数的阶乘结果中0的个数
- Mysql纯命令行添加用户