- 积分
- 3306
- 在线时间
- 6324 小时
- 最后登录
- 2024-5-23
- 阅读权限
- 100
- 精华
- 1
- UID
- 5036
- 帖子
- 4977
- 精华
- 1
- 经验
- 3306 点
- 金钱
- 3017 ¥
- 注册时间
- 2005-7-26
|
发一段STC单片机的EEP读写子程序,C的。
其中有部份还可以再适当简化。
#include <STC12XAD.h>
#include <STDIO.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar write_data,read_data,temp,i; //要写入的数据,读出的数据
uint address; //EEP地址,不同型号起始地址不同
void eeprom_read(); //字节读
void eeprom_write(); //字节写
void eeprom_eares(); //扇区擦除
void eeprom_read() //字节读
{
EA=0; //如在单片机复位后,未有其它中断源的情况下,此句可省略
ISP_ADDRL=address; //低位地址
ISP_ADDRH=address>>8; //高位地址
ISP_CONTR=0x82; //设时间与允许ISP操作。
ISP_CMD=0x01; //读命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
//--------------------------------------------------------------------------------
//以下语句出于安全考虑,可取消,取消后稳定性尚待考证
for(i=5;i!=0;i--); //延时5时钟周期
ISP_ADDRL=0x00; //送低地址为0,指向非eeprom区
ISP_ADDRH=0x00; //送高地址为0,指向非eeprom区
ISP_CONTR=0x00; //禁止ISP/IAP操作
ISP_CMD=0x00; //去除ISP/IAP命令
ISP_TRIG=0x00; //防止ISP/IAP命令误触发
//--------------------------------------------------------------------------------
read_data = ISP_DATA;
EA=1; //如在单片机复位后,未有其它中断源的情况下,此句可省略
}
void eeprom_eares() //扇区擦除。
{
EA=0;
ISP_ADDRL=address; //低位地址
ISP_ADDRH=address>>8; //高位地址
ISP_CONTR=0x82; //设时间与允许ISP操作。
ISP_CMD=0x03; //扇区擦除命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
//--------------------------------------------------------------------------------
//以下语句出于安全考虑,可取消,取消后稳定性尚待考证
for(i=5;i!=0;i--); //延时5时钟周期
ISP_ADDRL=0x00; //送低地址为0,指向非eeprom区
ISP_ADDRH=0x00; //送高地址为0,指向非eeprom区
ISP_CONTR=0x00; //禁止ISP/IAP操作
ISP_CMD=0x00; //去除ISP/IAP命令
ISP_TRIG=0x00; //防止ISP/IAP命令误触发
//--------------------------------------------------------------------------------
EA=1;
}
void eeprom_write() //字节写。
{
EA=0;
ISP_DATA=write_data; //要写入的数据。
ISP_ADDRL=address; //低位地址
ISP_ADDRH=address>>8; //高位地址
ISP_CONTR=0x82; //设时间与允许ISP操作。
ISP_CMD=0x02; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
//--------------------------------------------------------------------------------
//以下语句出于安全考虑,可取消,取消后稳定性尚待考证
for(i=5;i!=0;i--); //延时5时钟周期
ISP_ADDRL=0x00; //送低地址为0,指向非eeprom区
ISP_ADDRH=0x00; //送高地址为0,指向非eeprom区
ISP_CONTR=0x00; //禁止ISP/IAP操作
ISP_CMD=0x00; //去除ISP/IAP命令
ISP_TRIG=0x00; //防止ISP/IAP命令误触发
//--------------------------------------------------------------------------------
EA=1;
} |
|