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();                       //刷新显示
               }
              }  

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值