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…

ISIS的工作原理

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

网络基础(1)详解

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

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

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

一起刷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 浮点数运算结果不对,因浮点数的存储…

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

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

高级数据结构与算法习题(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版本中&#…

JAVA语言开发的(智慧校园系统源码)智慧校园的痛点、智慧校园的安全应用、智慧校园解决方案

一、智慧校园的痛点 1、信息孤岛问题:由于校园内各部门或系统独立开发,缺乏统一规划和标准,导致数据无法有效整合和共享,形成了信息孤岛。 2、技术更新与运维挑战:智慧校园的建设依赖于前沿的信息技术,如云…

15【PS作图】像素画地图绘制

绘制视角 绘制地图的时候,有的人会习惯把要绘制的 房子、车子、围栏 小物件先画好,然后安放在地图上 但这样绘制出的各种物件之间,会缺乏凝聚力 既然物品都是人构造出的,不如以人的视角去一步步丰富地图; 比如下图…

关于c++ 中 string s { ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ } 的方式的构造过程

(1)这样的构造方式不常见,但也确实 STL 库提供了这样的构造函数 (2)以反汇编分析这行代码 (3)谢谢阅读

【数据结构与算法】力扣 239. 滑动窗口最大值

题干描述 给你一个整数数组 nums,有一个大小为 k **的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入: nums [1,3,-1,-3,5,3…

嵌入式开发常见概念简介

目录 0. 《STM32单片机自学教程》专栏总纲 API Handle(句柄) 0. 《STM32单片机自学教程》专栏总纲 本文作为专栏《STM32单片机自学教程》专栏其中的一部分,返回专栏总纲,阅读所有文章,点击Link: STM32单片机自学教程-[目录总纲]_stm32 学习-CSD…

每日OJ题_贪心算法三⑤_力扣134. 加油站

目录 力扣134. 加油站 解析代码 力扣134. 加油站 134. 加油站 难度 中等 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置,使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…

Java学习第01天-Java基本内容

目录 单行注释 多行注释 文档注释(GPT生成) 字面量 分类 使用示例 变量 定义 定义格式 注意事项 数据类型分类 命名指导规范 补充 单行注释 public class note {public static void main(String[] args) {// 单行注释} }多行注释 publ…