📄 getsong.c
字号:
#include "reg51.h"
#include "absacc.h"
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uInt2;
sfr AUXR = 0x8E;
#define Select8M {CS244=1; CS1024=1; CLK377=0; P0=0xfe; CLK377=1; }
#define uInt2Hi(uInputVal) ( *((uchar *)(&(uInputVal))) )
#define uInt2Lo(uInputVal) ( *(((uchar *)(&(uInputVal)))+1) )
#define dMemPageCnt 512
#define NF_READ_A_AREA_CMD 0x00
#define NF_READ_B_AREA_CMD 0x01
#define NF_READ_C_AREA_CMD 0x50
#define NF_READ_ID_CMD 0x90
#define NF_READ_STAUS_CMD 0x70
#define NF_RESET_CMD 0xFF
#define NF_PAGE_PROGRAM_CMD 0x80
#define NF_PAGE_PROGRAM_END 0x10
#define NF_PAGE_COPYBACK_CMD 0x8A
#define NF_BLOCK_ERASE_CMD 0x60
#define NF_BLOCK_ERASE_END 0xD0
uchar xdata pFlashBuffer[512] _at_ 0x0000;
uchar id[2]={0x22 ,0x22};
volatile bit bSerialFlag=0;
uchar PageNo[2] ={ 0 ,0};
unsigned int PageNumber=0 ;
uchar ReceiveTimeout = 8;
uchar ReceiveState = 0;
/*****************Function Declaration(Internal)**************/
void Nf_send_command(uchar command);
void Nf_send_address(uchar address);
uchar Nf_rd_byte(void);
void Nf_wr_byte(uchar dat);
bit Nf_check_status(void);
bit Nf_write_page(uInt2 page);
bit Nf_read_page(uInt2 page);
bit Nf_wait_busy(void);
void MemReadId(uchar *pInputId);
sbit SFRD = P1^7;
sbit SFWR = P3^4;
sbit SFCLE = P3^3;
sbit SFALE = P3^2;
sbit SFRB = P1^6;
sbit CS244 = P1^5;
sbit CS1024 = P1^1;
sbit CLK377 = P1^0;
sbit DIR = P3^5;
void SendCharToSerial(uchar dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
void SendCharsToSerial(uchar *buffer,uInt2 count)
{
unsigned int i ;
for(i=0 ;i<count; i++)
{
SBUF=*buffer;
while(!TI);
TI=0;
buffer++;
}
}
void Speaker(uchar time)
{
uchar i,j,k;
for(i=0 ;i<time; i++)
for(k=0 ;k<100; k++)
{
for(j=0 ;j<40; j++)
{
CLK377=0;
P0=0x00;
CLK377=1;
}
for(j=0 ;j<40; j++)
{
CLK377=0;
P0=0xff;
CLK377=1;
}
}
}
void main(void)
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
ET1=0;
PCON=0x00;
SCON=0x50;
RI=TI=0;
ES=1;
TR1=1;
EA=1;
AUXR = 0x01;
ET0=1;
TH0 = 0xd8;
TL0 = 0x8c;
TR0=1 ;
while(1)
{
if(bSerialFlag)
{
bSerialFlag=0;
uInt2Hi(PageNumber) = PageNo[1];
uInt2Lo(PageNumber) = PageNo[0];
Select8M
MemReadId(id);
Nf_read_page(PageNumber);
SendCharsToSerial(PageNo,2);
SendCharsToSerial(pFlashBuffer,sizeof(pFlashBuffer));
}
}
}
void SerInt(void) interrupt 4 using 2
{
uchar tTempRcv;
if(_testbit_(RI))
{
tTempRcv = SBUF ;
switch(ReceiveState)
{
case 0 :
{
if(tTempRcv !=0xee)
ReceiveState = 0;
else
ReceiveState = 1;
ReceiveTimeout= 20 ;
break;
}
case 1 :
{
if(!ReceiveTimeout)
{
ReceiveState = 0;
}else
{
ReceiveTimeout = 20;
ReceiveState = 2;
PageNo[ 0 ]=tTempRcv;
}
break;
}
case 2:
{
if(!ReceiveTimeout)
{
ReceiveState = 0;
}else
{
ReceiveState = 0;
PageNo[ 1 ]=tTempRcv;
bSerialFlag=1;
}
break;
}
}
}
RI=0;
}
void timer0() interrupt 1 using 1
//10ms
{
TR0=0;
TH0 = 0x0c;
TL0 = 0x8c;
TR0=1 ;
if(ReceiveTimeout)
ReceiveTimeout--; //serial receive timeout
}
/**********************Function Bodies for flash*******************/
bit Nf_wait_busy(void)
{
uchar i;
for(i=0 ;i<100; i++);
return 0;
}
void Nf_send_command(uchar command)
{
SFALE=0;
SFCLE=1;
SFRD =1;
SFWR =0;
DIR = 1;
P0=command;
SFWR =1;
SFCLE=0;
}
void Nf_send_address(uchar address)
{
SFCLE=0;
SFALE=1;
SFRD =1;
SFWR =0;
DIR = 1;
P0=address;
SFWR =1;
SFALE=0;
}
uchar Nf_rd_byte(void)
{
uchar in;
SFALE=0;
SFCLE=0;
SFWR =1;
DIR = 1;
P0=0xFF;
SFRD =0;
SFRD =0;
DIR = 0;
in = P0;
SFRD =1;
return(in);
}
void Nf_wr_byte(uchar dat)
{
SFALE=0;
SFCLE=0;
SFRD =1;
SFWR =0;
DIR = 1;
P0 =dat;
SFWR =1;
}
bit Nf_check_status(void)
{
if( Nf_wait_busy() )
return 1;
Nf_send_command(NF_READ_STAUS_CMD);
if( Nf_wait_busy() )
return 1;
if((Nf_rd_byte()&0x01)==0x00)
return 0;
return 1;
}
void MemReadId(uchar *pInputId)
{
AUXR = 0x01;
AUXR = 0x01;
Nf_wait_busy();
Nf_send_command(NF_READ_ID_CMD);
Nf_send_address(0x00);
Nf_wait_busy();
pInputId[0]=Nf_rd_byte();
pInputId[1]=Nf_rd_byte();
}
bit Nf_read_page(uInt2 page)
{
uInt2 i;
uchar uTemp;
if( Nf_wait_busy() )
goto Nf_read_page_Error;
Nf_send_command(NF_READ_A_AREA_CMD);
Nf_send_address(0x00);
Nf_send_address( uInt2Lo(page) );
Nf_send_address( uInt2Hi(page) );
if( Nf_wait_busy() )
goto Nf_read_page_Error;
for(i=0;i<dMemPageCnt;i++)
{
uTemp=Nf_rd_byte();
XBYTE[i]=uTemp;
}
if( Nf_wait_busy() )
goto Nf_read_page_Error;
return 0;
Nf_read_page_Error:
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -