⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51_cf.txt

📁 51读CF卡的程序
💻 TXT
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -