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