51_cf.txt

来自「51读CF卡的程序」· 文本 代码 · 共 206 行

TXT
206
字号
#include <reg52.h> 
#include <absacc.h> 
#include <stdio.h> 
#include <ctype.h> 
#include <intrins.h> 
//2001.3.15 
//p3.3=1 common memory 
#define CF_BASE_ADDR XBYTE[0xE000] 
#define ERROR_REG XBYTE[0xE001] 
#define FEATURE_REG XBYTE[0xE001] 
#define SEC_COUNT XBYTE[0xE002] 
#define SEC_NUM_REG XBYTE[0xE003] 
#define CYL_LOW_REG XBYTE[0xE004] 
#define CYL_HI_REG XBYTE[0xE005] 
#define DH_REG XBYTE[0xE006] 
#define COMMAND_REG XBYTE[0x007] 
#define STATUS_REG XBYTE[0x007]



//p3.3=0 attribute memory 
#define REG_BASE_ADDR XBYTE[0xE000] 
#define CFG_MFG_CODE XBYTE[0xE022] 
#define CFG_ROT_DEV XBYTE[0xE068] 
#define CFG_BASE_TPL XBYTE[0xE074] 
#define DATA_BUFFER XBYTE[0x1000] 
sbit _REG=P3^3; 
//void menu(void); 
void detect_card(void); 
void write_sector(void); 
void read_sector(void); 
void erase_sector(void); 
void write_ram(void); 
void read_ram(void); 
//void error(void); 
void get_lba_address(void);



unsigned int data *DPT; 
unsigned int data *DPT0;



char c[10];




main() 
{ unsigned int i=0; 
_REG=1; 
SCON=0x50; 
PCON=0x80; 
TMOD=0x20; 
TH1=0xFd; 
TL1=0xFd; 
TR1=1; 
DPT=DH_REG; 
*DPT=0xE0;//LBA 27--24 BIT IS 0XE0; 
while(1) 
{ while(1) 
{ c=getchar(); 
if(c=='\0') break; 
i++; 
} 
switch(c[0]) 
{ case '1':detect_card();break; 
case '2':write_sector(); 
break; 
case '3':read_sector(); 
break; 
case '4':erase_sector();break; 
} 
printf("operation %c done\n",c[0]); 
putchar('\0');//transfer 'operation end' signal 
} 
} 






void get_lba_address(void) 
{ unsigned int i=0; 
DPT=SEC_NUM_REG; 
for(i=1;i<=6;i++) 
{ c=toint(c); 
if((i%2)==1) c=_irol_(c,4); 
else c=c[i-1]&c; 
} 
for(i=3;i>=1;i--) 
{ *DPT=c[i*2]; 
DPT++; 
} 
DPT=SEC_COUNT; 
*DPT=toint(c[7]); 
} 

void read_ram(void) 
{ char s; 
DPT=DATA_BUFFER; 
while(s!='\0') 
{ 
s=*DPT; 
putchar(s); 
DPT++; 
} 
} 

void write_ram(void) 
{ char s; 
DPT=DATA_BUFFER; 
while(s!='\0') 
{ 
s=getchar(); 
*DPT=s; 
DPT++; 
} 
} 




void wait_rdy(void) 
{ unsigned int a; 
DPT=STATUS_REG; 
a=*DPT; 
//if((a&0x01)==1) error(); 
while(((a=*DPT)&0xf0)!=0x50); 
} 

void wait_drq(void) 
{ unsigned int a; 
DPT=STATUS_REG; 
a=*DPT; 
while((a&0xf8)!=0x58); 
}



void read_sector(void) 
{ 
unsigned int data i,j; 
get_lba_address(); 
wait_rdy(); 
DPT=COMMAND_REG; 
*DPT=0x20; 
wait_drq(); 
i=*(DPT=SEC_COUNT); 
DPT=DATA_BUFFER; 
DPT0=CF_BASE_ADDR; 
for(;i>=0;i--) 
{ for(j=0;j<512;j++) 
{*DPT=*DPT0; 
DPT++; 
} 
} 
read_ram(); 
}



void write_sector(void) 
{ unsigned int data i,j; 
get_lba_address(); 
write_ram(); 
wait_rdy(); 
DPT=COMMAND_REG; 
*DPT=0x30; 
wait_drq(); 
i=*(DPT=SEC_COUNT); 
DPT=DATA_BUFFER; 
DPT0=CF_BASE_ADDR; 
for(;i>=0;i--) 
{ for(j=0;j<512;j++) 
{ 
*DPT0=*DPT; 
DPT++; 
if((*DPT)=='\0') break; 
} 
if((*DPT)=='\0') break; 
} 
} 



void erase_sector(void) 
{ 
get_lba_address(); 
wait_rdy(); 
DPT=COMMAND_REG; 
*DPT=0xc0; 
wait_rdy(); 

} 



void detect_card(void) 
{ unsigned int data a; 
a=P3; 
if((a&0x30)!=0) printf("card not present\n"); 
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?