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

📄 main.lst

📁 51读写硬盘的程序模块,编译完全通过,移植方面,实用.
💻 LST
📖 第 1 页 / 共 4 页
字号:
 146          {
 147   1              CDCOM=0x92;
 148   1              CDPC=ADD;
 149   1              READ=0;
 150   1              ACC=CDPA;
 151   1              STATUS=ACC;
 152   1              READ=1;
 153   1      }
 154          
 155          /*******************************************************
 156          *函数名称:void WriteReg(uchar ADD,uchar DATA)          *
 157          *函数用途:写硬盘非数据寄存器内容                       *
 158          ********************************************************/
 159          void WriteReg(uchar ADD,uchar DATA)
 160          {
 161   1              CDCOM=0x80;
 162   1              CDPC=ADD;
 163   1              WRITE=0;
 164   1              CDPA=DATA;
 165   1              WRITE=1;
 166   1      }
 167          
 168          /*******************************************************
 169          *函数名称:void ReadData()                              *
 170          *函数用途:读硬盘数据寄存器内容                         *
 171          ********************************************************/
 172          void ReadData()
 173          {
 174   1              CDCOM=0x92;
 175   1              CDPC=FILE0;
 176   1              READ=0;
C51 COMPILER V8.01   MAIN                                                                  08/07/2006 11:08:35 PAGE 6   

 177   1              buffer0=CDPA;
 178   1              buffer1=CDPB;
 179   1              READ=1;
 180   1      }
 181          
 182          /*******************************************************
 183          *函数名称:void WriteData(uchar Data0,uchar Data1)      *
 184          *函数用途:写硬盘数据寄存器内容                         *
 185          ********************************************************/
 186          void WriteData(uchar Data0,uchar Data1)
 187          {
 188   1              CDCOM=0x80;
 189   1              CDPC=FILE0;
 190   1              WRITE=0;
 191   1              CDPA=Data0;
 192   1              CDPB=Data1;
 193   1              WRITE=1;
 194   1      }
 195          
 196          /*********************************************************
 197          *函数名称:WriteCHS(uint cylinder,uchar head,uchar sector)*
 198          *函数用途:写CHS信息(地址信息)                            *
 199          **********************************************************/
 200          WriteCHS(uchar head,uint cylinder,uchar sector)
 201          {
 202   1              do{ReadReg(FILE7);}while(BSY);
 203   1              WriteReg(FILE6,0xe0&head);
 204   1              WriteReg(FILE5,cylinder>>8);    //high 2-bit cylinder
 205   1              WriteReg(FILE4,cylinder&0x00ff);//low 8-bit cylinder
 206   1              WriteReg(FILE3,sector); //start sector
 207   1              WriteReg(FILE2,0x01);   //sector counter
 208   1      }
 209          /*********************************************************
 210          *函数名称:WriteCommand(command)                          *
 211          *函数用途:写命令                                         *
 212          **********************************************************/
 213          WriteCommand(command)
 214          {
 215   1              do{ReadReg(FILE7);}while(BSY);
 216   1              WriteReg(FILE7,command);
 217   1      }
 218          /**********************************************************
 219          *函数名称:GetData()                                       *
 220          *用途:将硬盘的返回数据读入BUFFER数组                      *
 221          ***********************************************************/
 222          void GetData()
 223          {
 224   1              uint i=512;
 225   1              do{ReadReg(FILE7);}while(BSY|!DRQ);
 226   1              if(ERR){
 227   2                      LcdDis(0,ERROR,0,LCD2);
 228   2                      putch(255);
 229   2                      }
 230   1              while(i){ReadData();putch(buffer0);putch(buffer1);i-=2;}
 231   1      }
 232          
 233          /**********************************************************
 234          *函数名称:void IniHard(void)                              *
 235          *用途:初始化硬盘                                          *
 236          ***********************************************************/
 237          void IniHard(void)
 238          {
C51 COMPILER V8.01   MAIN                                                                  08/07/2006 11:08:35 PAGE 7   

 239   1              do{
 240   2                      WriteReg(FILE6,0xa0);
 241   2                      ReadReg(FILE7); 
 242   2                      }while(!DRDY|BSY);
 243   1              WriteReg(FILE6,0x20);
 244   1              WriteReg(FILE2,64);
 245   1              WriteReg(FILE7,0x91);
 246   1              do{ReadReg(FILE7);}while(BSY);
 247   1              WriteReg(FILE7,0x10);
 248   1              do{ReadReg(FILE7);}while(BSY); 
 249   1      }  
 250          /**********************************************************
 251          *函数名称:void DriveID(void)                              *
 252          *用途:读硬盘ID                                            *
 253          ***********************************************************/ 
 254          void DriveID(void) 
 255          {
 256   1              uint i=512;
 257   1              do{ReadReg(FILE7);}while(BSY);
 258   1              WriteReg(FILE7,0xec);
 259   1              do{ReadReg(FILE7);}while(BSY|!DRQ);
 260   1              while(i){ReadData();putch(buffer0);putch(buffer1);i-=2;}
 261   1      }
 262          
 263          /*******************************************************
 264          *函数名称:主函数                                       *
 265          *函数用途:                                             *
 266          ********************************************************/
 267          void HardDiskControl(void)
 268          {
 269   1              uint i;
 270   1              SCON=0x50;      /*方式1,串行口接收允许位*/
 271   1              TMOD=0x21;      /*定时器1用于串行通信波特率发生,定时器0用于REMOTE接收判断0,1时间*/
 272   1              PCON=0x80;      /*串行波特率加倍位*/
 273   1              TCON=0x51;      /*启动计数器0,计数器1*/
 274   1              EA=1;           /*中断允许*/
 275   1              EX0=0;          /*外部中断0不允许*/
 276   1              TH1=0xD0;
 277   1              TL1=0xD0;
 278   1              TI=1;
 279   1      
 280   1              RESET=0;
 281   1              delay(50);
 282   1              RESET=1;
 283   1              delay(255);
 284   1      
 285   1              IniHard();
 286   1            //DriveID();
 287   1              WriteCHS(0,0,0);
 288   1              WriteCommand(0x20);
 289   1              GetData();
 290   1      
 291   1              IniLcd();
 292   1              LcdDis(0,LCD1,0,LCD2);
 293   1      
 294   1              for(i=0;i<512;i++){
 295   2                      putch(i);
 296   2                      delay(255);
 297   2                      }
 298   1              while(1);
 299   1      }
 300          
C51 COMPILER V8.01   MAIN                                                                  08/07/2006 11:08:35 PAGE 8   

 301          void main(void){
 302   1              HardDiskControl();
 303   1              DriveID();
 304   1              WriteData(0X00,0X01);
 305   1              getch();
 306   1      }
C51 COMPILER V8.01   MAIN                                                                  08/07/2006 11:08:35 PAGE 9   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION _delay (BEGIN)
                                           ; SOURCE LINE # 60
;---- Variable 'time' assigned to Register 'R6/R7' ----
                                           ; SOURCE LINE # 61
                                           ; SOURCE LINE # 63
;---- Variable 'i' assigned to Register 'R4/R5' ----
0000 E4                CLR     A
0001 FD                MOV     R5,A
0002 FC                MOV     R4,A
0003         ?C0001:
0003 C3                CLR     C
0004 ED                MOV     A,R5
0005 9F                SUBB    A,R7
0006 EC                MOV     A,R4
0007 9E                SUBB    A,R6
0008 5014              JNC     ?C0007
                                           ; SOURCE LINE # 64
;---- Variable 'j' assigned to Register 'R2/R3' ----
000A E4                CLR     A
000B FB                MOV     R3,A
000C FA                MOV     R2,A
000D         ?C0004:
000D 0B                INC     R3
000E BB0001            CJNE    R3,#00H,?C0071
0011 0A                INC     R2
0012         ?C0071:
0012 EB                MOV     A,R3
0013 F4                CPL     A
0014 4A                ORL     A,R2
0015 70F6              JNZ     ?C0004
0017         ?C0003:
0017 0D                INC     R5
0018 BD0001            CJNE    R5,#00H,?C0072
001B 0C                INC     R4
001C         ?C0072:
001C 80E5              SJMP    ?C0001
                                           ; SOURCE LINE # 65
001E         ?C0007:
001E 22                RET     
             ; FUNCTION _delay (END)

             ; FUNCTION L?0076 (BEGIN)
0000 120000      R     LCALL   ReadData
0003 AF00        R     MOV     R7,buffer0
0005 120000      R     LCALL   _putch
0008 AF00        R     MOV     R7,buffer1
             ; FUNCTION _putch (BEGIN)
                                           ; SOURCE LINE # 71
;---- Variable 'ch' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 72
                                           ; SOURCE LINE # 73
000A 8F99              MOV     SBUF,R7
                                           ; SOURCE LINE # 74
000C C299              CLR     TI
000E         ?C0008:
                                           ; SOURCE LINE # 75
000E 3099FD            JNB     TI,?C0008
                                           ; SOURCE LINE # 76
0011         ?C0010:
C51 COMPILER V8.01   MAIN                                                                  08/07/2006 11:08:35 PAGE 10  

0011 22                RET     
             ; FUNCTION _putch (END)

             ; FUNCTION getch (BEGIN)
                                           ; SOURCE LINE # 82
                                           ; SOURCE LINE # 83
0000         ?C0011:
                                           ; SOURCE LINE # 85
0000 3098FD            JNB     RI,?C0011
0003         ?C0012:
                                           ; SOURCE LINE # 86
;---- Variable 'temp' assigned to Register 'R7' ----
0003 AF99              MOV     R7,SBUF
                                           ; SOURCE LINE # 87
0005 C298              CLR     RI
                                           ; SOURCE LINE # 88
                                           ; SOURCE LINE # 89
0007         ?C0013:
0007 22                RET     
             ; FUNCTION getch (END)

             ; FUNCTION L?0074 (BEGIN)
0000         L?0075:
0000 900008            MOV     DPTR,#08H
0003 F0                MOVX    @DPTR,A
             ; FUNCTION wait (BEGIN)
                                           ; SOURCE LINE # 96
                                           ; SOURCE LINE # 97
0004         ?C0016:
                                           ; SOURCE LINE # 98
0004 900008            MOV     DPTR,#08H
0007 E0                MOVX    A,@DPTR
                                           ; SOURCE LINE # 99
0008 20E7F9            JB      BFLAG,?C0016
                                           ; SOURCE LINE # 100
000B 22                RET     
             ; FUNCTION wait (END)

             ; FUNCTION IniLcd (BEGIN)
                                           ; SOURCE LINE # 106
                                           ; SOURCE LINE # 107
                                           ; SOURCE LINE # 108
0000 7438              MOV     A,#038H
                                           ; SOURCE LINE # 109
0002 120000      R     LCALL   L?0074
                                           ; SOURCE LINE # 110
0005 7408              MOV     A,#08H
                                           ; SOURCE LINE # 111
0007 120000      R     LCALL   L?0074
                                           ; SOURCE LINE # 112
000A 900008            MOV     DPTR,#08H
000D 7401              MOV     A,#01H
000F F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 113
0010 120000      R     LCALL   wait
                                           ; SOURCE LINE # 114

⌨️ 快捷键说明

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