以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- 单片机高级 (http://sun4.cn/bbs/list.asp?boardid=56) ---- ]硬盘控制源程序 (http://sun4.cn/bbs/dispbbs.asp?boardid=56&id=2247) |
-- 作者:wangxinxin -- 发布时间:2010-12-8 10:08:10 -- ]硬盘控制源程序 *******************************************************************/ ///////////////////预处理///////////////////////////////////// #include <reg51.h> #include <absacc.h> #define uchar unsigned char #define uint unsigned int #define KEYPORT P1 #define LCDCOM XBYTE[0x0008] //LCD命令寄存器 #define LCDDATA XBYTE[0x0009] //LCD数据寄存器 #define CDPA XBYTE[0x0004] //8255 PORT A, harddisk D0-D7 #define CDPB XBYTE[0x0005] //8255 PORT B, harddisk D8-D15 #define CDPC XBYTE[0x0006] //8255 PORT C,harddisk address #define CDCOM XBYTE[0x0007] //8255 命令寄存器 #define FILE0 0x00 //硬盘数据寄存器 #define FILE1 0x01 //错误/特征寄存器 #define FILE2 0x02 //扇区数寄存器 #define FILE3 0x03 //扇区号寄存器 #define FILE4 0x04 //柱面号寄存器L #define FILE5 0x05 //柱面号寄存器H #define FILE6 0x06 //驱动器/磁头寄存器 #define FILE7 0x07 //状态/命令寄存器 static uchar code LCD1[16]= "TOPLOW DESIGN "; static uchar code LCD2[16]= "Copyright(C)2004"; static uchar code ERROR[16]="ERROR "; static uchar code PASS[16]= "PASS "; uchar buffer0,buffer1; uchar buffer[16]; uchar STATUS; ///////////////////位设置/////////////////////////// sbit BFLAG=ACC^7; sbit BSY=ACC^7; sbit DRDY=ACC^6; sbit DRQ=ACC^3; sbit ERR=ACC^0; sbit RESET=P3^5; sbit READ=P3^0; sbit WRITE=P3^1; sbit ILT=ACC^0; sbit INTRQ=P3^3; /************************************************************ * 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:命令执行出错。 * *************************************************************/ /******************************************************* *函数名称:void delay(uint time) * *函数用途:延迟函数 * ********************************************************/ void delay(uint time) {uint i,j; for(i=0;i<time;i++) for(j=0;j<255;j++); } /******************************************************* *函数名称:void putch(unsigned char ch) * *函数用途:串口发送程序 * ********************************************************/ void putch(unsigned char ch) {SBUF=ch; TI=0; while(!TI); } /******************************************************* *函数名称:unsigned char getch(void) * *函数用途:串口接收程序 * ********************************************************/ unsigned char getch(void) {uchar temp; while(!RI); temp=SBUF; RI=0; return(temp); } /******************************************************* *函数名称:void wait(void) * *函数用途:LCD忙等待 * ********************************************************/ void wait(void) {do{ACC=LCDCOM;} while(BFLAG==1); } /******************************************************* *函数名称:void IniLcd(void) * *函数用途:LCD初始化函数 * ********************************************************/ void IniLcd(void) {LCDCOM=0x38; wait(); LCDCOM=0x08; wait(); LCDCOM=0x01; wait(); LCDCOM=0x06; wait(); LCDCOM=0x0c; wait(); } /*********************************************************************** *函数名称:void LcdDis(uchar FL,uchar Lcd1[16],uchar SL,uchar Lcd2[16]) * *函数用途:液晶显示函数 * ************************************************************************/ void LcdDis(uchar FL,uchar Lcd1[16],uchar SL,uchar Lcd2[16]) {uchar k; LCDCOM=FL|0x80; wait(); for(k=0;k<16;k++) {LCDDATA=Lcd1[k]; wait(); } LCDCOM=SL|0xc0; wait(); for(k=0;k<16;k++) {LCDDATA=Lcd2[k]; wait(); } } |