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

📄 harddisc.c

📁 Mp3的设计方案
💻 C
字号:

#include <c51core.h>
#include <compiler.h>
#include <intrins.h>
#include <absacc.h>
#include <lcdbase.h>

#define FILE0 XBYTE[0x0000]            //硬盘数据寄存器          
#define FILE1 XBYTE[0x0001]            //错误/特征寄存器
#define FILE2 XBYTE[0x0002]            //扇区数寄存器
#define FILE3 XBYTE[0x0003]            //扇区号寄存器
#define FILE4 XBYTE[0x0004]            //柱面号寄存器L
#define FILE5 XBYTE[0x0005]            //柱面号寄存器H
#define FILE6 XBYTE[0x0006]            //驱动器/磁头寄存器
#define FILE7 XBYTE[0x0007]            //状态/命令寄存器

uchar code MEG[]="错误  ";
uchar code INF[]="读数中";

///////////////////位设置///////////////////////////
sbit BFLAG=ACC^7;
sbit BSY=ACC^7;
sbit DRDY=ACC^6;
sbit DRQ=ACC^3;
sbit ERR=ACC^0;

/************************************************************
* D7   D6   D5   D4   D3   D2    D1   D0                    *
BSY  DRDY  DWF  DSC DRQ  CORR  IDX   ERR                   *
BSY:驱动器忙;                                             *
DRDY:驱动器准备好;                                        *
DWF:驱动器写失败;                                         *
DSC:寻道结束;                                              *
DRQ:请求服务,驱动器希望通过数据寄存器与CPU交换一字节数据;*
CORR:当可以纠正的读错误发生时,该位置1,数据传输将继续进行 *
IDX:收到综引信号;                                         *
ERR:命令执行出错。                                         *
*************************************************************/



sbit ARST=P5^3;
sbit INTQ=P5^1;

uchar status;  //从硬盘寄存器返回的状态数据寄存器
uchar buffer0,buffer1;//硬盘16位数据


/*******************************************************
*函数名称:void ReadReg(uchar address)                  *
*函数用途:读硬盘非数据寄存器内容,并将结果返回         *
********************************************************/
void ReadReg(uchar address)
{status=address;
 ACC=status;
}


/*******************************************************
*函数名称:void WriteReg(uchar address,uchar sdata)     *
*函数用途:写硬盘非数据寄存器内容                       *
********************************************************/
void WriteReg(uchar address,uchar sdata)
{address=sdata;
}

/*******************************************************
*函数名称:void ReadData()                              *
*函数用途:读硬盘数据寄存器内容                         *
********************************************************/
void ReadData(void)
{buffer0=FILE0;
 buffer1=DAT16H;
}

/*******************************************************
*函数名称:void WriteData(uchar Data0,uchar Data1)      *
*函数用途:写硬盘数据寄存器内容                         *
********************************************************/
void WriteData(uchar data0,uchar data1)
{DAT16H=data1;
 FILE0=data0;
 }


/*********************************************************
*函数名称:WriteCHS(uint cylinder,uchar head,uchar sector)*
*函数用途:写CHS信息(地址信息)                            *
**********************************************************/
WriteCHS(uchar head,uint cylinder,uchar sector)
{do{ReadReg(FILE7);}while(BSY);
WriteReg(FILE6,0xe0&head);
WriteReg(FILE5,cylinder>>8);    //high 2-bit cylinder
WriteReg(FILE4,cylinder&0x00ff);//low 8-bit cylinder
WriteReg(FILE3,sector); //start sector
WriteReg(FILE2,0x01);   //sector counter
}

/*********************************************************
*函数名称:WriteCommand(command)                          *
*函数用途:写命令                                         *
**********************************************************/
WriteCommand(command)
{do{ReadReg(FILE7);}while(BSY);
WriteReg(FILE7,command);
}

/**********************************************************
*函数名称:GetData()                                       *
*用途:将硬盘的返回数据读入BUFFER数组                      *
***********************************************************/
void GetData()
{uint i=512;
do{ReadReg(FILE7);}while(BSY|!DRQ);
if(ERR){LcdWriteCH(0xc0,MEG[0],MEG[1]);
        LcdWriteCH(0xc1,MEG[2],MEG[3]);
         }
while(i){ReadData();
         LcdWriteCH(0xc3,INF[0],INF[1]);
         LcdWriteCH(0xc4,INF[2],INF[3]);
         LcdWriteCH(0xc5,INF[4],INF[5]);
         i-=2;}

         LcdWriteCH(0xc3,MEG[4],MEG[5]);
         LcdWriteCH(0xc4,MEG[4],MEG[5]);
         LcdWriteCH(0xc5,MEG[4],MEG[5]);
}

/**********************************************************
*函数名称:void IniHard(void)                              *
*用途:初始化硬盘                                          *
***********************************************************/
void IniHard(void)
{do{WriteReg(FILE6,0xa0);
    ReadReg(FILE7);       }while(!DRDY|BSY);
    WriteReg(FILE6,0x20);
    WriteReg(FILE2,64);
    WriteReg(FILE7,0x91);
do{ReadReg(FILE7);}while(BSY);
    WriteReg(FILE7,0x10);
do{ReadReg(FILE7);}while(BSY); 
}


void HardDiskControl(void)
{ARST=0;
 delay(1000);
 ARST=1;
 delay(2000);

 AUXR=0x4d;           //设置EXT16=1,使能16-BIT传送模式

 IniHard();
 //DriveID();
 WriteCHS(0,0,0);
 WriteCommand(0x20);
 GetData();
 }

⌨️ 快捷键说明

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