?? 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 + -