收藏 分销(赏)

EEPRO使用多个扇区.docx

上传人:xrp****65 文档编号:8992892 上传时间:2025-03-10 格式:DOCX 页数:10 大小:15.05KB
下载 相关 举报
EEPRO使用多个扇区.docx_第1页
第1页 / 共10页
EEPRO使用多个扇区.docx_第2页
第2页 / 共10页
点击查看更多>>
资源描述
/**存贮多个变量两个long型和一个char型(long型的转换成4个char型)用两个不同的按键控制显示存贮的值***/ #include <reg52.H> #include <intrins.h> typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; #define led_port P0 sbit dm=P2^3; //数码管控制芯片段码控制位 sbit wm=P2^2; //数码管控制芯片位码控制位 sbit gn=P2^0; sbit gn1=P2^1; ulong a,a1,v,v1; //uchar a; uchar temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8; bit bz1,bz2; 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]; //数码管bcd码缓冲区 void delay(uint t); //延时函数声明 void bin_bcd(); //bcd分离函数 void smxs(); //数码管显示函数 void anjian(); //掉电保持寄存器申明 sfr IAP_DATA=0xe2; sfr IAP_ADDRH=0xe3; 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 2 #define CMD_ERASE 3 //定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数 //#define ENABLE_IAP 0x82 //系统工作时钟<20MHZ #define ENABLE_IAP 0x83 //系统工作时钟<40MHZ #define IAP_ADDRESS 0x2000 #define IAP_ADDRESS1 0x2200 void cc(uint addr);// 擦除某一扇区 void xcx(uint addr,uchar dat);// 写一字节 uchar dcx(uint addr);// 读一字节 void GB_IAP();//关闭IAP/IAP操作 void delay(uint t) { while(--t); } void smxs() { 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]=(a%100000)/10000; bcd[4]=(a%10000)/1000; bcd[5]=(a%1000)/100; bcd[6]=(a%100)/10; bcd[7]=(a%100)%10; } void bin_bcd1() { bcd[0]=a1/10000000; bcd[1]=a1/1000000; bcd[2]=a1/100000; bcd[3]=(a1%100000)/10000; bcd[4]=(a1%10000)/1000; bcd[5]=(a1%1000)/100; bcd[6]=(a1%100)/10; bcd[7]=(a1%100)%10; } void xs32_8() { temp1=(a>>24)&0xff; temp2=(a>>16)&0xff; temp3=(a>>8)&0xff; temp4=a&0xff; } void xs8_32() { a = ((ulong)(temp1)<<24)|((ulong)(temp2)<<16)|((ulong)(temp3)<<8)|temp4; } void xs32_81() { temp5=(a1>>24)&0xff; temp6=(a1>>16)&0xff; temp7=(a1>>8)&0xff; temp8=a1&0xff; } void xs8_321() { a1 = ((ulong)(temp5)<<24)|((ulong)(temp6)<<16)|((ulong)(temp7)<<8)|temp8; } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:主程序 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void main(void) { uchar num; temp1=dcx(IAP_ADDRESS); temp2=dcx(IAP_ADDRESS+1); temp3=dcx(IAP_ADDRESS+2); temp4=dcx(IAP_ADDRESS+3); num=dcx(IAP_ADDRESS+4); temp5=dcx(IAP_ADDRESS1+5); temp6=dcx(IAP_ADDRESS1+6); temp7=dcx(IAP_ADDRESS1+7); temp8=dcx(IAP_ADDRESS1+8); num++; a=222222+num; a1=333333+num; xs32_81(); //long型转成char型 xs32_8(); cc(IAP_ADDRESS); // 擦除第1个扇区(2000h~21FFh) xcx(IAP_ADDRESS,temp1); xcx(IAP_ADDRESS+1,temp2); // 对EEPROM区2001h写入 xcx(IAP_ADDRESS+2,temp3); xcx(IAP_ADDRESS+3,temp4); xcx(IAP_ADDRESS+4,num); cc(IAP_ADDRESS1); xcx(IAP_ADDRESS1+5,temp5); xcx(IAP_ADDRESS1+6,temp6); xcx(IAP_ADDRESS1+7,temp7); xcx(IAP_ADDRESS1+8,temp8); xs8_32(); //char型转成long型 xs8_321(); while(1) { anjian(); if(bz1==1) bin_bcd(); if(bz2==1) bin_bcd1(); smxs(); } } void anjian() { bit bzjia,bzjian,djia,djian; gn=1; gn1=1; //置1 djia=gn; //读状态 djian=gn1; if(djia!=1) if(bzjia!=1) { bzjia=1; bz1=1; bz2=0; } if(djia==1) bzjia=0; if(djian!=1) if(bzjian!=1) { bzjian=1; bz1=0; bz2=1; } if(djian==1) bzjian=0; } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:擦除某一扇区(每个扇区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; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除 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(); // 关闭IAP/IAP } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:写一字节 入口:addr = 扇区单元地址 , dat = 待写入数据 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void xcx(uint addr,uchar dat) { IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_PROGRAM; // 用户可以对"Data Flash/EEPROM区"进行字节编程 IAP_ADDRL = addr; IAP_ADDRH = addr>>8; IAP_DATA = dat; // 数据进IAP_DATA //EA = 0; IAP_TRIG = 0x46; IAP_TRIG = 0xB9; //_nop_(); GB_IAP(); // 关闭IAP/IAP } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:读一字节 入口:addr = 扇区单元地址 出口:dat = 读出的数据 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ uchar dcx(uint addr) { uchar dat; IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_READ; // 用户可以对"Data Flash/EEPROM区"进行字节读 IAP_ADDRL = addr; IAP_ADDRH = addr>>8; //EA = 0; IAP_TRIG = 0x46; IAP_TRIG = 0xB9; //_nop_(); dat = IAP_DATA; // 取出数据 GB_IAP(); // 关闭IAP/IAP return dat; } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数:关闭IAP/IAP操作 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void GB_IAP() { IAP_CONTR = 0; // 关闭IAP功能 IAP_CMD = 0; // 待机模式,无IAP操作 IAP_TRIG = 0; // 关闭IAP功能, 清与IAP有关的特殊功能寄存器 IAP_ADDRH = 0x80; IAP_ADDRL =0; }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服