EEPROM多个数据读写

更新时间:2024-05-01 12:12:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#include #include

typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong;

#define led_port P0 sbit dm=P2^3; sbit wm=P2^2; ulong a,v; //uchar a;

uchar temp1,temp2,temp3,temp4;

uchar code dxian[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码显示区0——9 uchar code wxian[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //选通哪位数码管控制位 uchar bcd[8]; void delay(uint t); void bin_bcd(); void smxs();

//掉电保持寄存器申明 sfr IAP_DATA=0xe2; sfr IAP_ADDRH=0xe3;

//数码管控制芯片段码控制位 //数码管控制芯片位码控制位

//数码管bcd码缓冲区 //延时函数声明

//bcd分离函数

//数码管显示函数

sfr IAP_ADDRL=0xe4; sfr IAP_CMD=0xe5; sfr IAP_TRIG=0xe6; sfr IAP_CONTR=0xe7;

#define CMD_IDLE

0

#define CMD_READ 1 #define CMD_PROGRAM #define CMD_ERASE 3

//定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数 //#define ENABLE_IAP 0x82 #define ENABLE_IAP 0x83

//系统工作时钟<20MHZ

2

//系统工作时钟<40MHZ

#define IAP_ADDRESS 0x2000

void cc(uint addr);// 擦除某一扇区 void xcx(uint addr,uchar dat);// 写一字节 uchar dcx(uint addr);// 读一字节 void GB_IAP();//关闭IAP/IAP操作

void delay(uint t) { }

void smxs() {

while(--t);

}

uchar i;

for(i=0;i<8;i++) { }

led_port=0; dm=1; dm=0;

led_port=wxian[i]; wm=1; wm=0;

led_port=dxian[bcd[i]]; if(i==5)

led_port=led_port | 0x80; dm=1; dm=0;

delay(300);

void bin_bcd() {

bcd[0]=a/10000000; bcd[1]=a/1000000; bcd[2]=a/100000;

bcd[3]=(a0000)/10000; bcd[4]=(a000)/1000; bcd[5]=(a00)/100;

}

bcd[6]=(a0)/10; bcd[7]=(a0);

void xs32_8() { }

void xs8_32() {

a =

((ulong)(temp1)<<24)|((ulong)(temp2)<<16)|((ulong)(temp3)<<8)|temp4; }

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:主程序

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void main(void) {

uchar num;

temp1=(a>>24)&0xff; temp2=(a>>16)&0xff; temp3=(a>>8)&0xff; temp4=a&0xff;

/*测试Long型转char型是否正确成功*这里如果要验证请把void xs8_32()中的改成v然后调试哈就可以看出来/

/**********************************

a=99999999; xs32_8(); xs8_32();

*********************************/

/******测试存贮多个数据成功**********/

/*************************************************

cc(IAP_ADDRESS);

// 擦除第1个扇区(2000h~21FFh)

temp1++; temp2++; temp3++; temp4++;

a=temp1+temp2+temp3+temp4; temp1=dcx(IAP_ADDRESS); temp2=dcx(IAP_ADDRESS+1); temp3=dcx(IAP_ADDRESS+2); temp4=dcx(IAP_ADDRESS+3);

xcx(IAP_ADDRESS,temp1); xcx(IAP_ADDRESS+1,temp2); xcx(IAP_ADDRESS+2,temp3); xcx(IAP_ADDRESS+3,temp4);

// 对EEPROM区2002h写入

**************************************************/

temp1=dcx(IAP_ADDRESS); temp2=dcx(IAP_ADDRESS+1); temp3=dcx(IAP_ADDRESS+2); temp4=dcx(IAP_ADDRESS+3); num=dcx(IAP_ADDRESS+4);

}

num++; a=555555+num; xs32_8();

cc(IAP_ADDRESS);

// 擦除第1个扇区(2000h~21FFh)

xcx(IAP_ADDRESS,temp1); xcx(IAP_ADDRESS+1,temp2); xcx(IAP_ADDRESS+2,temp3); xcx(IAP_ADDRESS+3,temp4); xcx(IAP_ADDRESS+4,num); xs8_32(); while(1) { }

bin_bcd(); smxs();

// 对EEPROM区2002h写入

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:擦除某一扇区(每个扇区512字节) 入口:addr = 某一扇区首地址

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void cc(uint addr) {

// 0x83(晶振<5M) 0x82(晶振<10M)

0x81(晶振<20M) 0x80(晶振<40M) IAP_CONTR = ENABLE_IAP;

// 打开 IAP 功能(IAPEN(IAP_CONTR.7)=1:

允许编程改变Flash, 设置 Flash 操作等待时间。

IAP_CMD = CMD_ERASE; 进行扇区擦除

// 用户可以对\区\

IAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器低八位, IAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位。

//EA =0;

IAP_TRIG = 0x46; // 在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入46h,

IAP_TRIG = 0xB9; // 再写入B9h,IAP/IAP命令才会生效。 //_nop_();

GB_IAP(); }

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:写一字节

入口:addr = 扇区单元地址 , dat = 待写入数据 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void xcx(uint addr,uchar dat) {

IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_PROGRAM; 字节编程

IAP_ADDRL = addr; IAP_ADDRH = addr>>8;

IAP_DATA = dat; // 数据进IAP_DATA //EA = 0;

IAP_TRIG = 0x46; IAP_TRIG = 0xB9; //_nop_();

// 关闭IAP/IAP

// 用户可以对\区\进行

GB_IAP(); }

// 关闭IAP/IAP

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:读一字节

入口:addr = 扇区单元地址 出口:dat = 读出的数据

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ uchar dcx(uint addr) {

uchar dat;

IAP_CONTR = ENABLE_IAP;

IAP_CMD = CMD_READ; // 用户可以对\区\进行字节读 IAP_ADDRL = addr; IAP_ADDRH = addr>>8; //EA = 0;

IAP_TRIG = 0x46; IAP_TRIG = 0xB9; //_nop_(); dat = IAP_DATA; }

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:关闭IAP/IAP操作

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void GB_IAP()

GB_IAP(); return dat;

// 取出数据

// 关闭IAP/IAP

{

IAP_CONTR = 0; // 关闭IAP功能 IAP_CMD = 0; // 待机模式,无IAP操作

IAP_TRIG = 0; // 关闭IAP功能, 清与IAP有关的特殊功能寄存器 }

IAP_ADDRH = 0x80; IAP_ADDRL =0;

本文来源:https://www.bwwdw.com/article/c7qg.html

Top