📄 main.lst
字号:
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 + -