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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业软件测试会议

全国软件测试会议:这是一个系列性的专业会议,由中国的学术机构或专业组织主办,例如中国计算机学会的容错计算专业委员会。此会议自2005年起开始举办,历届会议地点包括北京、昆明和武汉等地。会议内容覆盖软件测试理论、实践、工具…

跟TED演讲学英文:4 pillars of college success in science by Freeman Hrabowski

4 pillars of college success in science Link: https://www.ted.com/talks/freeman_hrabowski_4_pillars_of_college_success_in_science Speaker: Freeman Hrabowski Date: February 2013 文章目录 4 pillars of college success in scienceIntroductionVocabularyTranscr…

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述: Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

Day 25 数据库查询

数据库查询 一:基本查询 1.简介 ​ 单表查询 ​ 简单查询 ​ 通过条件查询 ​ 查询排序 ​ 限制查询记录数 ​ 使用集合函数查询 ​ 分组查询 ​ 使用正则表达式查询 2.案例 创建案例所需表:company.employee5 雇员编号 id int雇…

ISIS的工作原理

1.邻居关系建立 (1)IS-IS领接关系建立原则 1、通过将以太网接口模拟成点到点接口,可以建立点到点链路邻接关系。 2、当链路两端IS-IS接口的地址不在同一网段时,如果配置接口对接收的Hello报文不作IP地址检查,也可以建…

【AI】Tavily

Tavily是一个为人工智能代理(如大型语言模型,LLMs)和检索增强生成(RAG)应用优化的搜索引擎。它旨在提供高效、快速和持久的搜索结果。Tavily Search API 允许人工智能开发人员轻松地将他们的应用程序与实时在线信息集成…

深入理解MySQL的Purge机制

在MySQL中,尤其是在使用InnoDB存储引擎时,Purge机制起着至关重要的作用。它主要负责清理那些因为早期的版本或删除操作而不再需要的数据行版本。本文将详细介绍MySQL中的Purge机制,包括其作用、工作原理、如何配置以及优化步骤。 1. Purge机…

网络基础(1)详解

目录 1.计算机网络背景 2.网络协议 3.网络中的地址管理 1.计算机网络背景 1.1 网络发展 (1)计算机从独立模式到网络互联(多态计算机连接共享数据)再到局域网LAN(通过交换机和路由器连接)接着是广域网WAN 1.2 协议 协议就是双方的一种约定. 为什么要有协议? 因为在数据长距…

LeetCode 面试经典150题 252.会议室

题目:给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。 思路:因为一个人在同一时刻只能参加一个会议,因此…

Unit5

Unit5 1. main,man 停留 maintain maintenance remain remaining remainder permanent 2. place 地方;放置 place placement plaza palace replace replace A with B replacement irreplaceable birthplace workplace marketplace misplace mis…

一起刷C语言菜鸟教程100题(15-26含解析)

五一过的好快,五天假期说没就没,因为一些事情耽搁到现在,不过还是要继续学习的,之后就照常更新,先说一下,这个100题是菜鸟教程里面的,但是有一些题,我加入了自己的理解,甚…

网络1--通信过程的理解

1.封装与解包 通信的过程就是不断的封装和解包的过程 封装即就是按照“应用”“传输” “网络” “链路” 层,封装给每一层都加上相应的包头(每一层都有协议,)解包就是接受到的包文被一层层去掉相对应的包头。 任何一层的协议都…

JavaScript解决精度问题-math.js-使用入门

JavaScript精度失真案例 0.1+0.2 结果是:0.300000000000000041-0.9 结果是:0.099999999999999984.10*100 结果是:409.999999999999946.10/0.1 结果是:60.99999999999999大数计算 9007199254740992+1 结果是9007199254740992 JavaScript 浮点数运算结果不对,因浮点数的存储…

ResNet神经网络搭建

一、定义残差结构 BasicBlock 18层、34层网络对应的残差结构 浅层网络主线由两个3x3的卷积层链接,相加后通过relu激活函数输出。还有一个shortcut捷径 参数解释 expansion 1 : 判断对应主分支的残差结构有无变化 downsampleNone : 下…

Minio(官方docker版)容器部署时区问题研究记录

文章目录 感慨&概述补充:MINIO_REGION和容器时间的关系 问题一:minio容器和本地容器时间不一致问题说明原因探究解决方法结果验证 问题二:minio修改时间和本地查询结果不一致具体问题原因探究解决办法时间转化工具类调用测试和验证上传文…

Unit6

Unit6 1. val 强壮 valid invalid validate invalidate prevail prevailing prevalent 2. pri 主要的 prime Prime Minister premier primary primary school prior prior to sth prioritize priority principle principal prince princess 3. nov 新 news newspap…

thinkphp5 中路由常见的使用方法

在ThinkPHP 5中,路由的常见使用方法主要包括以下几个方面: 基本路由配置: 你可以通过修改config目录下面的route.php文件来配置路由规则。例如,使用Route::get或Route::post等方法定义不同的HTTP请求类型的路由。 use think\Route…

stm32芯片外设

STM32 F1系列微控制器是ST公司推出的一系列基于ARM Cortex-M3内核的微控制器。这一系列微控制器拥有丰富的外设资源,包括但不限于: ADC(模数转换器):用于将模拟信号转换为数字信号,通常用于传感器数据的读取…

高级数据结构与算法习题(9)

一、判断题 1、Let S be the set of activities in Activity Selection Problem. Then the earliest finish activity am​ must be included in all the maximum-size subset of mutually compatible activities of S. T F 解析:F。设S是活动选择问题中的一…

flutter开发实战-webview_flutter 4.x版本使用

flutter开发实战-webview_flutter 4.x版本使用 在之前使用的webview_flutter版本是3.x的,升级到4.x后,使用方式有所变化。 一、webview_flutter 在工程的pubspec.yaml中引入插件 webview_flutter: ^4.4.2二、使用webview_flutter 在4.x版本中&#…