📄 main0.c
字号:
Ram_CLE=0;
P7MDOUT =0x00; // P7 Input mode
P7 = 0xff;
EA=0;
//for(i=0;i<40;i++) _nop_(); //最小参数是40,〈40不能保证最开始数据的正确读取.
Delay(2); //10.24 仅仅为了提高稳定性
while(Ram_Busy==0);//比用上条语句快3微秒。
data_sum=data_sum/4;
for (i=0;i<data_sum;i++)
{
Ram_RE=0;
XBYTE[temp_p]=P7;
temp_p++;
Ram_RE=1;
Ram_RE=0;
XBYTE[temp_p]=P7;
temp_p++;
Ram_RE=1;
Ram_RE=0;
XBYTE[temp_p]=P7;
temp_p++;
Ram_RE=1;
Ram_RE=0;
XBYTE[temp_p]=P7;
temp_p++;
Ram_RE=1;
}
EA=1;
// Ram_CS=1; 11.10
SFRPAGE = old_SFRPAGE;
}
//------------------------------------------------------------------------------------
// 页写子程序(所以Ram_Addr2,Ram_Addr1默认为0)
//------------------------------------------------------------------------------------
void Ram_Program(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned int Ram_buf,unsigned int data_sum)//,unsigned int Ram_buf)
{
volatile unsigned int i;
//bit k;
char old_SFRPAGE;
old_SFRPAGE = SFRPAGE; // Save old SFRPAGE
SFRPAGE = 0X0F;
Ram_CS=1; // CS* 0
Ram_CLE=0; // Command latch
Ram_WE=1; // CS* 0
Ram_ALE=0; // Command latch
Ram_RE=1; // CS* 0
Ram_WP=1;
P7MDOUT =0xff; // P7 Output mode
Ram_CS=0;
Ram_CLE=1;
Ram_WE=0;
P7 = 0x80;
Ram_WE=1; // WE Pulse
Ram_CLE=0;
Ram_ALE=1; // Address latch
Ram_WE=0;
P7 = 0x00; //column address==0
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = 0x00; //column address==0
Ram_WE=1;
Ram_WE=0;
P7 = Ram_Addr3;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr4;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr5;
Ram_WE=1;
Ram_ALE=0;
EA=0;
for (i=0;i<data_sum/4;i++) //一页应为512,现在先做一个扇区
{
Ram_WE=0; // WE Pulse
P7 = XBYTE[Ram_buf];
Ram_buf++;
Ram_WE=1;
Ram_WE=0; // WE Pulse
P7 = XBYTE[Ram_buf];
Ram_buf++;
Ram_WE=1;
Ram_WE=0; // WE Pulse
P7 = XBYTE[Ram_buf];
Ram_buf++;
Ram_WE=1;
Ram_WE=0; // WE Pulse
P7 = XBYTE[Ram_buf];
Ram_buf++;
Ram_WE=1;
}
EA=1;
Ram_CLE = 1;
Ram_WE=0;
P7 = 0x10;
Ram_WE=1; // WE Pulse
//while(Ram_Busy==0); //用此显示出错,且读出数据的确错误,全为ff
Delay(2); //delay的最小传递参数是1
Ram_CLE = 0;
SFRPAGE = old_SFRPAGE;
}
//------------------------------------------------------------------------------------
// 块擦子程序
//------------------------------------------------------------------------------------
void Ram_Erase(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3)
{
//bit k;
char old_SFRPAGE;
old_SFRPAGE = SFRPAGE; // Save old SFRPAGE
SFRPAGE = 0X0F;
Ram_CS=1; // CS* 0
Ram_CLE=0; // Command latch
Ram_WE=1; // CS* 0
Ram_ALE=0; // Command latch
Ram_RE=1; // CS* 0
Ram_WP=1;
while(Ram_Busy==0);
P7MDOUT =0xff;
Ram_CS=0;
Ram_CLE=1;
Ram_WE=0;
P7 = 0x60;
Ram_WE=1; // WE Pulse
Ram_CLE=0;
Ram_ALE=1; // Address latch
Ram_WE=0;
P7 = Ram_Addr3;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr4;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr5;
Ram_WE=1;
EA=0;
Ram_ALE=0;
Ram_CLE=1;
Ram_WE=0;
P7 = 0xd0;
Ram_WE=1; // WE Pulse
Delay(8); //8是delay允许的最小参量10.19 22:19
// while(Ram_Busy==0);
EA=1;
/*Ram_WE=0;
P7 = 0x70;
Ram_WE=1;*/
Ram_CLE=0;
// Ram_WP=0; 11.10
/*Ram_RE=0;
P7MDOUT=0x00;
while(P7^6==1)
{
if(P7^0==0)
{k=0;
SFRPAGE = old_SFRPAGE;
return k;
}
else
{ k=1;
SFRPAGE = old_SFRPAGE;
return k;
}
}*/
// Ram_CS=1; 11.10
SFRPAGE = old_SFRPAGE;
}
//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
char old_SFRPAGE = SFRPAGE;
int i;
SFRPAGE = ADC0_PAGE; // Switch to ADC0 Page
ADC0CN = 0xC0; // ADC Disabled, Timer3 start-of-conversion
// track 16 SAR clocks before data conversion
// upon Timer3 OV. DMA will enable ADC as needed
REF0CN = 0x02; // turn on bias generator and internal reference.
for(i=0;i<10000;i++); // Wait for Vref to settle (large cap used on target board)
AMX0SL = 0x00; // Single-ended mode
ADC0CF = (SYSCLK/25000000) << 4; // Select SAR clock frequency =~ 25MHz
EIE1 |=0x80;
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
ad_dat=AD_Complete();
}
unsigned int AD_Complete (void)
{ char old_SFRPAGE = SFRPAGE;
unsigned int AD_Con;
SFRPAGE =0x00; // Switch to UART0 page
AD0BUSY=1;
while(AD0BUSY==0)
AD_Con = ADC0;
AD0INT = 0;
SFRPAGE = old_SFRPAGE;
return AD_Con;
}
void ser_int (void) interrupt 4
{ unsigned char x3;
unsigned char old_SFRPAGE=SFRPAGE;
SFRPAGE =0x0f;
SFRPAGE = UART0_PAGE;
//SCON0=0x70;
SM20=0;TB80=0;
ES0=0;
RI0=0;
x3=SBUF0;
switch(x3)
{
case 17:SFRPAGE = 0x0f;txshdn=1;Delay(10);clr_mem();break;
case 18:SFRPAGE = 0x0f;txshdn=1;Delay(10);rece_para();break;
case 19:SFRPAGE = 0x0f;txshdn=1;Delay(10);trans_para();break;
case 20:SFRPAGE = 0x0f;txshdn=1;Delay(10);set_start();break;
case 21:SFRPAGE = 0x0f;txshdn=1;Delay(10);reset();break;
//case 22:SFRPAGE = 0x0f;txshdn=1;Delay(10);test_online();break;
case 23:SFRPAGE = 0x0f;txshdn=1;Delay(10);clr_comd();break;
case 24:SFRPAGE = 0x0f;txshdn=1;Delay(30);trans_page();break;
default:SFRPAGE = 0x0f;txshdn=0;break;}
SFRPAGE = 0x0f;txshdn=0;
ES0=1;
SFRPAGE = UART0_PAGE;
//SCON0=0xf0;
SM20=1;
RI0=0;
SFRPAGE=old_SFRPAGE;
}
void reset(void)
{
SFRPAGE = UART0_PAGE;
SBUF0=0x05;
while(TI0==0);
TI0=0;
Delay(20);
ES0=1;
SFRPAGE=0x00;
RSTSRC=0x10;
}
void clr_mem(void)
{ unsigned char i,k;
signed int j;
for(i=0;i<0x08;i++)
{ for(j=0;j<256;j++)
{ for(k=0;k<4;k++)
{Ram_Erase(i,j,k*64);
Delay(5);
}
}
}
SFRPAGE = UART0_PAGE;
SBUF0=0x01;
while(TI0==0);
TI0=0;
SFRPAGE=0x00;;
RSTSRC=0x10;
}
void clr_comd(void)
{
SFRPAGE = UART0_PAGE;
SBUF0=0x07;
while(TI0==0);
TI0=0;
Ram_Erase(0x03,0xff,0x00);
Delay(20);
SFRPAGE=0x00;
RSTSRC=0x10;
}
void rece_para(void)
{ unsigned char x1,jiaoyan;
unsigned int i;
SFRPAGE = UART0_PAGE;
Ram_Erase(0x03,0xff,0x00);
Delay(60);
SBUF0=0x02;
while(TI0==0);
TI0=0;
jiaoyan=0;
for(i=0;i<512;i++)
{
while(RI0==0);
RI0=0;
x1=SBUF0;
XBYTE[0x0e00+i]=x1;
if(i<=510){jiaoyan=jiaoyan+x1;}
}
Ram_Program(0x03,0xff,0x00,0x0e00,512);
Delay(20);
if(jiaoyan=XBYTE[0x0fff])
{SBUF0=0xaa;
while(TI0==0);
TI0=0;
}
else
{SBUF0=0x55;
while(TI0==0);
TI0=0;
}
ES0=1;
SFRPAGE=0x00;
RSTSRC=0x10;
}
void trans_para(void)
{unsigned char x1,jiaoyan;
unsigned int i;
SFRPAGE = UART0_PAGE;
Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
Delay(60);
SBUF0=0x03;
while(TI0==0);
TI0=0;
Delay(60);
jiaoyan=0;
for(i=0;i<511;i++)
{
x1=XBYTE[i+0x0e00];
Delay(2);
//wait:
SBUF0=x1;//5
while(TI0==0);
TI0=0;
//goto wait;
jiaoyan=jiaoyan+x1;
}
Delay(2);
SBUF0=jiaoyan;
while(TI0==0);
TI0=0;
Delay(20);
ES0=1;
//SFRPAGE=0x00;
//RSTSRC=0x10;
}
void set_start(void)
{
Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
Delay(20);
XBYTE[0x0efe]=0xaa;
XBYTE[0x0eff]=0x55;
Ram_Erase(0x03,0xff,0x00);
Delay(20);
Ram_Program(0x03,0xff,0x00,0x0e00,512);
Delay(20);
ES0=1;
SFRPAGE = UART0_PAGE;
SBUF0=0x04;
while(TI0==0);
TI0=0;
for(addr=0;addr<4096;addr++){XBYTE[addr]=0xffff;}//清所有数据暂存区
SFRPAGE=0x00;;
RSTSRC=0x10;
}
void trans_page(void)
{unsigned char z1,jiaoyan;
unsigned int addr;
unsigned char Ram_Addr5,Ram_Addr4,Ram_Addr3,Ram_Addr2;
SFRPAGE = UART0_PAGE;
SBUF0=0x08;
while(TI0==0);
TI0=0;
Delay(60);
Ram_Addr5=0x00;
Ram_Addr4=0x00;
Ram_Addr3=0x00;
Ram_Addr2=0;
addr=0x0000;
jiaoyan=0;
again: Ram_Rd(Ram_Addr5,Ram_Addr4,Ram_Addr3,Ram_Addr2,0,0x0000,512);
for(addr=0;addr<512;addr++)
{ z1=XBYTE[addr];
SBUF0=z1;
while(TI0==0);
TI0=0;
jiaoyan=jiaoyan+z1;
}
while(RI0==0);
RI0=0;
z1=SBUF0;
if(z1==0x55)
{SBUF0=jiaoyan;
while(TI0==0);
TI0=0;
goto td1;
}
Ram_Addr2++;Ram_Addr2++;
if(Ram_Addr2==8)
{Ram_Addr2=0;
Ram_Addr3++;
if(Ram_Addr3==0x00)
{ Ram_Addr4++;
if(Ram_Addr4==0x00)
{Ram_Addr5++;}
if(Ram_Addr5==0x80)
{ goto td1;}
}
}
goto again;
td1: ES0=1;
}
/*void test_online(void)
{unsigned char x0,i;
do{
for(i=0;i<=15;i++)
{ SFRPAGE = 0x0f;
P6=0xf0|i;
Delay(10);
EA=0;
ad_dat=AD_Complete();
ad_dat=AD_Complete();
EA=1;
x0=ad_dat;
SFRPAGE = UART0_PAGE;
SBUF0=x0;
while(TI0==0);
TI0=0;
while(RI0==0);
RI0=0;
x0=SBUF0;
x0=ad_dat>>8;
SBUF0=x0;
while(TI0==0);
TI0=0;
while(RI0==0);
RI0=0;
x0=SBUF0;
}
}
while (x0!=0x55);
ES0=1;
SFRPAGE=0x00;;
RSTSRC=0x10;
}
*/
void Timer3_Init (int counts)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = TMR3_PAGE; // Switch to Timer 3 page
TMR3CN = 0x00; // Stop Timer3; Clear TF3;
TMR3CF = 0x00; // use SYSCLK as timebase
time_counter=50;
one_second=0;
RCAP3 = -counts; // Init reload values
TMR3 = 0xffff; // set to reload immediately
EIE2 |= 0x01; // enable Timer3 interrupts
EIP2 |= 0x01; // Timer3 high perior interrupts
TR3 = 1; // start Timer3
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
void Timer3_ISR (void) interrupt 14
{
char old_SFRPAGE;
TF3 = 0; // clear TF3
old_SFRPAGE = SFRPAGE; // Save old SFRPAGE
ten_ms=1;
time_counter--;
if(time_counter!=0){goto t3end;}
time_counter=50;
time_s++;
if(time_s==60){time_m++;time_s=0;}
if(time_m==60){time_h++;time_m=0;}
one_second=1;
t3end:
SFRPAGE = old_SFRPAGE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -