IAP15W4K61S4单片机EEPROM读写程序

/*-------------关闭IAP----------------*/

void IapIdle()

{

IAP_CONTR = 0; //关闭IAP功能

IAP_CMD = 0; //清除命令寄存器

IAP_TRIG = 0; //清除触发寄存器

IAP_ADDRH = 0x80; //将地址设置到非IAP区域

IAP_ADDRL = 0;

}

/*-----从ISP/IAP/EEPROM区域读取一字节-----*/

BYTE IapReadByte(WORD addr)

{

BYTE dat; //数据缓冲区

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_READ; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

dat = IAP_DATA; //读ISP/IAP/EEPROM数据

IapIdle(); //关闭IAP功能

return dat; //返回

}

/*------写一字节数据到ISP/IAP/EEPROM区域--------*/

void IapProgramByte(WORD addr, BYTE dat)

{

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_PROGRAM; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_DATA = dat; //写ISP/IAP/EEPROM数据

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

IapIdle();

}

/*---------扇区擦除-----------*/

void IapEraseSector(WORD addr)

{

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_ERASE; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

IapIdle();

}

/*************写参数到EEPROM*******************************/

void Write_EEprom()

{

IapEraseSector(IAP_ADDRESS); //扇区擦除

IapProgramByte(IAP_ADDRESS+1,val1>>8&0XFF);/*A轴速度高八位*/

IapProgramByte(IAP_ADDRESS+2,val1&0x00FF); /*A轴速度低八位*/

IapProgramByte(IAP_ADDRESS+3,val2>>8&0XFF);/*B轴速度高八位*/

IapProgramByte(IAP_ADDRESS+4,val2&0x00FF); /*B轴速度低八位*/

IapProgramByte(IAP_ADDRESS+5,val3>>8&0XFF);/*C轴速度高八位*/

IapProgramByte(IAP_ADDRESS+6,val3&0x00FF); /*C轴速度低八位*/

IapProgramByte(IAP_ADDRESS+7,val4>>8&0XFF);/*D轴速度高八位*/

IapProgramByte(IAP_ADDRESS+8,val4&0x00FF); /*D轴速度低八位*/

IapProgramByte(IAP_ADDRESS+9,val5>>8&0XFF);/*润滑模数高八位*/

IapProgramByte(IAP_ADDRESS+10,val5&0x00FF);/*润滑模数低八位*/

IapProgramByte(IAP_ADDRESS+11,val6>>8&0XFF);/*润滑时间高八位*/

IapProgramByte(IAP_ADDRESS+12,val6&0x00FF); /*润滑时间低八位*/

IapProgramByte(IAP_ADDRESS+13,val7>>8&0XFF);/*吹气时间1高八位*/

IapProgramByte(IAP_ADDRESS+14,val7&0x00FF); /*吹气时间1低八位*/

IapProgramByte(IAP_ADDRESS+15,val8>>8&0XFF);/*吹气时间2高八位*/

IapProgramByte(IAP_ADDRESS+16,val8&0x00FF); /*吹气时间2低八位*/

IapProgramByte(IAP_ADDRESS+17,val9>>8&0XFF);/*打油次数高八位*/

IapProgramByte(IAP_ADDRESS+18,val9&0x00FF); /*打油次数低八位*/

IapProgramByte(IAP_ADDRESS+19,val10>>8&0XFF);/*间隙时间高八位*/

IapProgramByte(IAP_ADDRESS+20,val10&0x00FF); /*间隙时间低八位*/

IapProgramByte(IAP_ADDRESS+21,val11>>8&0XFF);/*攻丝超时高八位*/

IapProgramByte(IAP_ADDRESS+22,val11&0x00FF); /*攻丝超时低八位*/

IapProgramByte(IAP_ADDRESS+23,val12>>8&0XFF);/*旋转超时高八位*/

IapProgramByte(IAP_ADDRESS+24,val12&0x00FF); /*旋转超时低八位*/

IapProgramByte(IAP_ADDRESS+25,val13>>8&0XFF);/*退刀超时高八位*/

IapProgramByte(IAP_ADDRESS+26,val13&0x00FF); /*退刀超时低八位*/

IapProgramByte(IAP_ADDRESS+27,val14>>8&0XFF);/*润滑超时高八位*/

IapProgramByte(IAP_ADDRESS+28,val14&0x00FF); /*润滑超时低八位*/

//val15

IapProgramByte(IAP_ADDRESS+29,val15>>8&0XFF);/*过桥开时间高八位*/

IapProgramByte(IAP_ADDRESS+30,val15&0x00FF); /*过桥开时间低八位*/

IapProgramByte(IAP_ADDRESS+31,val16>>8&0XFF);/*手动速度高八位*/

IapProgramByte(IAP_ADDRESS+32,val16&0x00FF); /*手动速度低八位*/

}

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

void red_eeprom(void)

{

uint m,n;

m=IapReadByte(IAP_ADDRESS+1); //A轴速度高八位

n=IapReadByte(IAP_ADDRESS+2); //A轴速度低八位

val1=(m*256+n)&0X7FFF; //A轴速度屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+3); //B轴速度高八位

n=IapReadByte(IAP_ADDRESS+4); //B轴速度低八位

val2=(m*256+n)&0X7FFF; //B轴速度屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+5); //C轴速度高八位

n=IapReadByte(IAP_ADDRESS+6); //C轴速度低八位

val3=(m*256+n)&0X7FFF; //C轴速度屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+7); //调整时间高八位

n=IapReadByte(IAP_ADDRESS+8); //调整时间低八位

val4=(m*256+n)&0X7FFF; //调整时间屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+9); //润滑模数高八位

n=IapReadByte(IAP_ADDRESS+10); //润滑模数低八位

val5=(m*256+n)&0X7FFF; //润滑模数屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+11); //润滑时间高八位

n=IapReadByte(IAP_ADDRESS+12); //润滑时间低八位

val6=(m*256+n)&0X7FFF; //润滑时间屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+13); //吹气时间1高八位

n=IapReadByte(IAP_ADDRESS+14); //吹气时间1低八位

val7=(m*256+n)&0X7FFF; //吹气时间1屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+15); //吹气时间2高八位

n=IapReadByte(IAP_ADDRESS+16); //吹气时间2低八位

val8=(m*256+n)&0X7FFF; //吹气时间2屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+17); //打油次数高八位

n=IapReadByte(IAP_ADDRESS+18); //打油次数低八位

val9=(m*256+n)&0X7FFF; //打油次数屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+19); //间隙时间高八位

n=IapReadByte(IAP_ADDRESS+20); //间隙时间低八位

val10=(m*256+n)&0X7FFF; //间隙时间屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+21); //攻丝超时高八位

n=IapReadByte(IAP_ADDRESS+22); //攻丝超时低八位

val11=(m*256+n)&0X7FFF; //攻丝超时屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+23); //攻丝超时高八位

n=IapReadByte(IAP_ADDRESS+24); //旋转超时低八位

val12=(m*256+n)&0X7FFF; //旋转超时屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+25); //退刀超时高八位

n=IapReadByte(IAP_ADDRESS+26); //退刀超时低八位

val13=(m*256+n)&0X7FFF; //退刀超时屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+27); //润滑超时高八位

n=IapReadByte(IAP_ADDRESS+28); //润滑超时低八位

val14=(m*256+n)&0X7FFF; //润滑超时屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+29); //过桥开时间高八位

n=IapReadByte(IAP_ADDRESS+30); //过桥开时间低八位

val15=(m*256+n)&0X7FFF; //过桥开时间屏蔽最高负位 111 1111

m=IapReadByte(IAP_ADDRESS+31); //手动速度高八位

n=IapReadByte(IAP_ADDRESS+32); //手动速度低八位

val16=(m*256+n)&0X7FFF; //手动速度屏蔽最高负位 111 1111

}

/*************恢复出厂值************/

void RESET_Data()

{

val1=10; //电机速度

val2=18000; //退丝补偿

val3=2; //补偿速度

val4=10; //调整时间

val5=100; //润滑模数

val6=20; //润滑时间

val7=1; //吹气时间1

val8=1; //吹气时间2

val9=10; //缺料计时

val10=2; //间隙时间

val11=10; //攻丝超时

val12=10; //旋转超时

val13=25; //退刀超时

val14=25; //润滑超时

val15=5; //过桥开时间

val16=1; //手动电机速度

}

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

void Dis_Data(void)

{

printf("n0.val=%d\xff\xff\xff",val1); //电机速度

printf("n0.val=%d\xff\xff\xff",val1); //退丝补偿

printf("n1.val=%d\xff\xff\xff",val2); //补偿速度

printf("n2.val=%d\xff\xff\xff",val3); //C轴速度

printf("n3.val=%d\xff\xff\xff",val4); //D轴速度

printf("n4.val=%d\xff\xff\xff",val5); //润滑模数

printf("n5.val=%d\xff\xff\xff",val6); //润滑时间

printf("n6.val=%d\xff\xff\xff",val7); //吹气时间1

printf("n7.val=%d\xff\xff\xff",val8); //吹气时间2

printf("n9.val=%d\xff\xff\xff",val9); //打油次数

printf("n10.val=%d\xff\xff\xff",val10);//间隙时间

printf("n11.val=%d\xff\xff\xff",val11);//攻丝超时

printf("n12.val=%d\xff\xff\xff",val12);//旋转超时

printf("n13.val=%d\xff\xff\xff",val13);//退刀超时

printf("n14.val=%d\xff\xff\xff",val14);//润滑超时

}

/****************刷新显示*******************/

void Renovate(void)

{

uint mn;

mn=0X00;

printf("n0.val=%d\xff\xff\xff",mn); //A轴速度

printf("n0.val=%d\xff\xff\xff",mn); //A轴速度

printf("n1.val=%d\xff\xff\xff",mn); //B轴速度

printf("n2.val=%d\xff\xff\xff",mn); //C轴速度

printf("n3.val=%d\xff\xff\xff",mn); //D轴速度

printf("n4.val=%d\xff\xff\xff",mn); //润滑模数

printf("n5.val=%d\xff\xff\xff",mn); //润滑时间

printf("n6.val=%d\xff\xff\xff",mn); //吹气时间1

printf("n7.val=%d\xff\xff\xff",mn); //吹气时间2

printf("n9.val=%d\xff\xff\xff",mn); //打油次数

printf("n10.val=%d\xff\xff\xff",mn); //间隙时间

printf("n11.val=%d\xff\xff\xff",mn); //攻丝超时

printf("n12.val=%d\xff\xff\xff",mn); //旋转超时

printf("n13.val=%d\xff\xff\xff",mn); //退刀超时

printf("n14.val=%d\xff\xff\xff",mn); //润滑超时

red_eeprom();

Dis_Data();

}

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

void Data_Set(void )

{

if (a[0]==0XD5&&a[1]==0X00) //A轴速度

{

val1=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if (a[0]==0XD5&&a[1]==0X01) //B轴速度

{

val2=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if (a[0]==0XD5&&a[1]==0X02) //C轴速度

{

val3=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if (a[0]==0XD5&&a[1]==0X03) //D轴速度

{

val4=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if (a[0]==0XD5&&a[1]==0X04) //比例系数1

{

val5=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if (a[0]==0XD5&&a[1]==0X05) //比例系数2

{

val6=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if (a[0]==0XD5&&a[1]==0X06) //吹气时间1

{

val7=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X07) //吹气时间2

{

val8=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X08) //打油次数

{

val9=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X09) //打油计数器

{

val10=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X0A) //攻丝超时

{

val11=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X0B) //旋转超时

{

val12=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X0C) //退刀超时

{

val13=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

else if(a[0]==0XD5&&a[1]==0X0D) //润滑超时

{

val14=a[3]*256+a[2]; //

Write_EEprom();

Renovate(); //刷新显示

}

}

相关推荐
一点媛艺30 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风34 分钟前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man3 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang