资源描述
/**存贮多个变量两个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;
}
展开阅读全文