📄 dram.c
字号:
#include <absacc.h>
#include <reg51.h>
unsigned char comm_number;
unsigned int now_addr;
unsigned char centrl_flag,s_buffer;
unsigned int begin_addr,end_addr;
unsigned int now_saddr;
unsigned int tos_length,s_min_addr;
unsigned int s_max_addr,s_useaddr;
unsigned int xdata nram_addr;
unsigned char xdata commu,temp3; /*定义了一个位 */
extern unsigned char xdata key;
extern unsigned int xdata sch_plan[32];
unsigned int temp_addr;
extern unsigned int xdata usingloop_h,usingloop_l;
extern unsigned char now_day; /*星期*/
extern unsigned char now_hour; /*小时*/
extern unsigned char now_min; /*分钟*/
extern unsigned char now_sec; /*秒*/
extern unsigned char now_year; /*年份*/
extern unsigned char now_month;/*月份*/
extern unsigned char now_date; /*日子*/
extern char wirte28c64(length,addr_ram,addr_eeprom);
sch_update()
{
unsigned char i,temp1,temp2;
unsigned int temp;
key=XBYTE[0X7003];
temp=0X7004;
for(i=0;i<32;i++){
temp1=XBYTE[temp+i];
temp++;
temp2=XBYTE[temp+i];
sch_plan[i]=temp2+temp1*256;
}
}
/***************************************************************/
/* 将NVRAM中来自双口RAM中的数据写入EEPROM */
/* 调用本函数前请将地址单元0x7f98、0x7f99设定为被读数据的 */
/*起始地址,其中,0x7f98为高位地址单元,0x7f99为低位地址单元。 */
/*数据被写入的EEPROM地址严格遵照通信协议。 */
/***************************************************************/
meeprom()
{
unsigned int addr;
unsigned char mflag,load;
unsigned char xdata *nv_addr;
addr=XBYTE[0X7F98]*256+XBYTE[0X7F99];
nv_addr=addr;
mflag=XBYTE[addr];
addr=addr+3;
switch(mflag){
case 0x01:break;
case 0x02:load=wirte28c64( 7,addr,0x8009);
XBYTE[0XC000]=XBYTE[0X800e];
XBYTE[0XC002]=XBYTE[0X800d];
XBYTE[0XC004]=XBYTE[0X800c];
XBYTE[0XC007]=XBYTE[0X800b];
XBYTE[0XC008]=XBYTE[0X800a];
XBYTE[0XC009]=XBYTE[0X8009];
XBYTE[0XC006]=XBYTE[0X800f]; break;/*标识为02H的数据体内容存储在以800AH为起始地址的EEPROM空间*/
case 0x03:load=wirte28c64( 0,addr,0x8000);break;/*标识为03H的数据体内容存储在以800AH为起始地址的EEPROM空间*/
case 0x04:load=wirte28c64( 3,addr,0x8010);break;/*标识为04H的数据体内容存储在以8010H为起始地址的EEPROM空间*/
case 0x05:load=wirte28c64( 2,addr,0x8014);break;/*标识为05H的数据体内容存储在以8014H为起始地址的EEPROM空间*/
case 0x06:load=wirte28c64( 6,addr,0x8016);break;/*标识为06H的数据体内容存储在以8016H为起始地址的EEPROM空间*/
case 0x07:load=wirte28c64( 32,addr,0x8020);break;/*标识为07H的数据体内容存储在以8020H为起始地址的EEPROM空间*/
case 0x08:load=wirte28c64( 32,addr,0x8040);break;/*标识为08H的数据体内容存储在以8040H为起始地址的EEPROM空间*/
case 0x09:load=wirte28c64( 32,addr,0x8060);break;/*标识为09H的数据体内容存储在以8060H为起始地址的EEPROM空间*/
case 0x0a:load=wirte28c64( 64,addr,0x8080);break;/*标识为0aH的数据体内容存储在以8080H为起始地址的EEPROM空间*/
case 0x0b:load=wirte28c64( 8,addr,0x80c0);break;/*标识为0bH的数据体内容存储在以80c0H为起始地址的EEPROM空间*/
case 0x0c:load=wirte28c64( 14,addr,0x80c8);break;/*标识为0cH的数据体内容存储在以80c8H为起始地址的EEPROM空间*/
case 0x0d:load=wirte28c64( 1,addr,0x80e0);break;/*标识为0dH的数据体内容存储在以80e0H为起始地址的EEPROM空间*/
case 0x0e:load=wirte28c64( 1,addr,0x80ef);break;/*标识为0eH的数据体内容存储在以80efH为起始地址的EEPROM空间*/
case 0x0f:load=wirte28c64( 48,addr,0x8130);break;/*标识为0fH的数据体内容存储在以8130H为起始地址的EEPROM空间*/
case 0x10:load=wirte28c64( 48,addr,0x8160);break;/*标识为10H的数据体内容存储在以8160H为起始地址的EEPROM空间*/
case 0x11:load=wirte28c64( 100,addr,0x8110);break;/*标识为11H的数据体内容存储在以8190H为起始地址的EEPROM空间*/
case 0x12:load=wirte28c64( 2,addr,0x81D5);break;/*标识为12H的数据体内容存储在以81ceH为起始地址的EEPROM空间*/
case 0x13:load=wirte28c64(1560,addr,0x8200);break;/*标识为13H的数据体内容存储在以8200H为起始地址的EEPROM空间*/
case 0x14:load=wirte28c64(1560,addr,0x8900);break;/*标识为14H的数据体内容存储在以8900H为起始地址的EEPROM空间*/
case 0x15:load=wirte28c64( 128,addr,0x8230);break;/*标识为15H的数据体内容存储在以81e0H为起始地址的EEPROM空间*/
case 0x16:load=wirte28c64( 12,addr,0x80E1);break;/*标识为16H的数据体内容存储在以80E1H为起始地址的EEPROM空间*/
case 0x17:load=wirte28c64( 2,addr,0x7E29);break;/*标识为17H的数据体内容存储在以7e29H为起始地址的EEPROM空间*/
case 0x18:load=wirte28c64( 64,addr,0x8f40);break;/*标识为18H的数据体内容存储在以8f40H为起始地址的EEPROM空间*/
case 0x19:load=wirte28c64( 20,addr,0x8f1e);break;/*标识为19H的数据体内容存储在以8f1eH为起始地址的EEPROM空间*/
case 0x1a:load=wirte28c64( 2,addr,0x8f32);break;/*标识为1aH的数据体内容存储在以8f32H为起始地址的EEPROM空间*/
case 0x1b:load=wirte28c64( 1,addr,0x8f34);break;/*标识为1bH的数据体内容存储在以8f34H为起始地址的EEPROM空间*/
case 0x1c:load=wirte28c64( 98,addr,(XBYTE[addr]-1)*98+0x9200);
break;/*保存多方案*/
case 0x1d:load=wirte28c64( 72,addr,0x9FB0);break;/*标识为1dH的数据体内容存储在以9EF0H为起始地址的EEPROM空间*/
case 0x1e:load=wirte28c64( 504,addr,0x9000);break;/*标识为1eH的数据体内容存储在以9000H为起始地址的EEPROM空间*/
case 0x1f:load=wirte28c64( 72,addr,0x8fb0);break;/*标识为1fH的数据体内容存储在以8fb0H为起始地址的EEPROM空间*/
case 0x25:load=wirte28c64( 2,addr,0x7F87);break;/*标识为1fH的数据体内容存储在以7F87H为起始地址的EEPROM空间*/
case 0x20:load=wirte28c64( 65,addr,0x6780);break;/*标识为20H的数据体内容存储在以7F87H为起始地址的EEPROM空间*/
case 0x30:load=wirte28c64( 24,addr,0x9ee8);break;/*标识为30H的数据体是每时段的相位差*/
case 0x35:sch_update();break; /*接收到上位机的配时计划*/
default :break; /*标识为30H的数据体是每时段的相位差*/
}
}
read_dram()
{
unsigned int flag_addr;
unsigned char xdata *wr;
unsigned char modi_va,i;
unsigned int lai,length;
unsigned int temp;
unsigned int b_addr,e_addr;
unsigned char MODI_FLAG;
flag_addr=XBYTE[now_addr+1]*256+XBYTE[now_addr+2];
XBYTE[0X7F98]=0x70;
XBYTE[0X7F99]=0x00;
flag_addr=flag_addr&0xafff; /*标识存储位置*/
centrl_flag=XBYTE[flag_addr]; //数据标识
begin_addr=flag_addr; /*接收数据开始地址*/
end_addr=XBYTE[now_addr+3]*256+XBYTE[now_addr+4];
end_addr=end_addr&0xafff; /*接收数据结束地址*/
length=XBYTE[flag_addr+1]*256+XBYTE[flag_addr+2];
wr=0x7000;
for(lai=0;lai<length+3;lai++){ /*双口RAM数据 写入NVRAM*/
temp=flag_addr+lai;
*wr=XBYTE[temp];
wr++;
}
meeprom(); /* NVRAM数据写入28C64*/
commu=1;
XBYTE[now_addr]=0; /*对数据接收标志进行清零操作*/
for(i=0;i<30;i++){
modi_va=XBYTE[0XA024];
if(modi_va==0)break;
}
modi_va=XBYTE[0XA024];
if(modi_va==1){
XBYTE[0XA023]=1;
for(i=0;i<30;i++){}
if(XBYTE[0XA023]==1){
b_addr=(XBYTE[0XA01F]&0XAF)*256+XBYTE[0XA020];
e_addr=(XBYTE[0XA021]&0XAF)*256+XBYTE[0XA022];
MODI_FLAG=0x0f;
if(begin_addr==b_addr){
XBYTE[0XA01F]=end_addr/256;
XBYTE[0XA020]=end_addr%256;
MODI_FLAG=0;
}else{
if(end_addr==e_addr){
XBYTE[0XA021]=begin_addr/256;
XBYTE[0XA022]=begin_addr%256;
if(MODI_FLAG==0){
XBYTE[0XA01F]=0XA0;
XBYTE[0XA020]=0X80;
XBYTE[0XA021]=0XA0;
XBYTE[0XA022]=0X80;
}
}
}
}
}
XBYTE[0XA023]=0;
}
/*
unsigned char drsend(unsigned int length,unsigned int nv_addr,unsigned int du_addr)
{
return 0;
} */
/****************************************************************************
;向双口RAM发送数据地址计算子程序DRSEND
;入口:7E00~7E01H---发送字节的长度,
;出口:7E02~7E03H---发送数据写入双口RAM的首地址(NVRAM中)
; 7E04~7E05H---存放所使用的发送数据存储区的首地址(在双口RAM中)
******************************************************************************/
drsend(unsigned int length) //
{
unsigned int xdata temp,startaddr;
unsigned char xdata i,j;
s_buffer=XBYTE[0X7f9e];
s_buffer=0;
XBYTE[0X7E00]=0X00;
XBYTE[0X7E01]=length+3; //E00~7E01H---发送字节的长度
i=0;
do{
temp=0xa030+i*5;
now_saddr=temp;
i=i+1;
}
while(XBYTE[temp]>0&&XBYTE[temp]<=4&&i<=5);
if(i==5){
//s_buffer.0=1,发送数据标志存储区已满
s_buffer=s_buffer&0x07;
s_buffer=s_buffer|0x01;
XBYTE[0XA023]=0;
}
else
{
XBYTE[temp]=0X87;
XBYTE[0X7E04]=now_saddr/256;
XBYTE[0X7E05]=now_saddr%256; //7E04~7E05H---使用的发送数据存储区的首地址(在双口RAM中)
s_buffer=(s_buffer&0x06);//*发送标志缓冲区不满 s_buffer.0=0
XBYTE[0XA023]=1; // CPU板修改数据区头尾标志
for(i=0;i<10;i++){}
if(XBYTE[0XA023]!=1){
XBYTE[0XA023]=1;
for(i=0;i<10;i++){}
if(XBYTE[0XA023]!=1)
{XBYTE[0XA023]=0;
s_buffer=s_buffer|0x04; //通讯板修改数据区头尾
}
}
else //if(XBYTE[0XA023]==1) //判断通讯板是否修改数据区头尾,A024H=1
{
i=30;
do{
for(j=0;j<10;j++){}
i=i-1;
}
while(i!=0&&XBYTE[0XA024]!=0);
if(i==0){
XBYTE[0XA023]=0;
s_buffer=s_buffer|0x04; //通讯板修改数据区头尾
}
else
{ //XBYTE[0XA023]=1; XBYTE[0XA024]=0
s_useaddr=XBYTE[0XA021]*256+XBYTE[0XA022];
if(s_useaddr>0xa700||s_useaddr<0xa080)
{
XBYTE[0XA021]=0xa0; //R3,R4
XBYTE[0XA022]=0x80;
}
tos_length=XBYTE[0X7E00]*256+XBYTE[0X7E01]; //R1R2
s_min_addr=XBYTE[0Xa01f]*256+XBYTE[0Xa020]; //R5R6
s_min_addr=s_min_addr&0xa7ff;
s_max_addr=XBYTE[0Xa021]*256+XBYTE[0Xa022]; //R7R0
s_max_addr=s_max_addr&0xa7ff;
s_useaddr=(s_max_addr-s_min_addr); //R3R4
if(s_max_addr>=s_min_addr)
s_useaddr=0x0780-s_useaddr;
else {
s_useaddr=s_min_addr-s_max_addr; //R3R4
s_useaddr=0x0780-s_useaddr;
}
if(s_useaddr>=tos_length) //R3R4>R1R2
{//*数据区有空间
s_buffer=(s_buffer&0X05);
temp_addr=XBYTE[0Xa021]*256+XBYTE[0Xa022];//*R5,R6*
temp_addr=(temp_addr&0xa7ff);
s_useaddr=temp_addr+tos_length; //*R3R4=R5R6+R1R2*
if(s_useaddr>=0xa7ff)
s_useaddr=s_useaddr-0x0780; //*超过界限*
temp=s_useaddr;
XBYTE[0XA021]=temp/256; //R3,R4
XBYTE[0XA022]=temp%256;
// XBYTE[0XA021]=temp/256; //R3,R4
// XBYTE[0XA022]=temp%256;
temp=temp_addr+1;
XBYTE[0X7E02]=(temp)/256; // /*R5,R6+1*
XBYTE[0X7E03]=(temp)%256;
startaddr=XBYTE[0X7E04]*256+XBYTE[0X7E05];
temp=startaddr;
temp_addr=temp_addr+1;
XBYTE[temp+1]=(temp_addr)/256; //*R5,R6*
XBYTE[temp+2]=(temp_addr)%256;
XBYTE[temp+3]=s_useaddr/256; //R3,R4
XBYTE[temp+4]=s_useaddr%256;
//temp=temp_addr;
}
else
{//*数据区空间不够
s_buffer=s_buffer|0x02;
XBYTE[now_saddr]=0;//*发送标志清零
}
}
}
}
XBYTE[0XA023]=0;
}
/*****************************************************************
NRAM数据传送到DRAM且dram数据发送 子程序
入口:源地址R3R4中,目的地址R1R2中,数据长度R6R7中
出口:修改后目的地址R1R2中
*****************************************************************/
dramsend(nram_addr)
{ unsigned char xdata j;
unsigned int data startaddr;
temp_addr=XBYTE[0x7e02]*256+XBYTE[0X7e03]; //R1R2
tos_length=XBYTE[0X7E00]*256+XBYTE[0X7E01];
temp_addr=temp_addr;
for(j=0;j<tos_length;j++){
if(temp_addr+j==0xf7ff)XBYTE[temp_addr+j]=0xf07f;
XBYTE[temp_addr+j]=XBYTE[nram_addr+j];
}
XBYTE[0xa02f]++;
XBYTE[0Xa004]=0;
XBYTE[0Xa01B]=0;
startaddr=XBYTE[0X7E04]*256+XBYTE[0X7E05];
XBYTE[startaddr]=1;
XBYTE[0X7E07]=1;
/*if(XBYTE[startaddr]!=XBYTE[0X7E07])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -