📄 cdrom_task.lst
字号:
C51 COMPILER V7.50 CDROM_TASK 02/16/2009 09:59:55 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CDROM_TASK
OBJECT MODULE PLACED IN cdrom_task.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE lib_mcu\cdrom\cdrom_task.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\cdrom_ta
-sk.lst) OBJECT(cdrom_task.obj)
line level source
1 #include "config.h" /* system definition */
2 #include "cdrom_drv.h"
3 #include "lib_mcu\clock\clock.h"
4 #include "lib_mcu\lcd\lcd_drv.h"
5 #include "lib_mcu\ide\ide_drv.h"
6 #include "modules\display\disp_task.h"
7 #include "lib_mcu\kbd\key_drv.h" /* Keyboard driver definition */
8 #include <stdio.h>
9
10
11 extern bit gl_key_press; /* TRUE when a key is decoded */
12 extern Byte gl_key; /* value of the key pressed */
13 extern INT8U CmdPack[12];
14
15 INT8U RcvBuff[24];
16 INT8U u8CdStatus;
17
18 str_cdinfo str_CdTotalInfo;
19 str_cdinfo str_CdCurrentInfo;
20
21 ////////////////////////////////////////////////////////////////////////
22 void cd_playtrack(INT8U u8Track)
23 {
24 1 INT8U i;
25 1 for(i=0; i<12; i++)
26 1 {
27 2 CmdPack[i] = 0;
28 2 }
29 1
30 1 CmdPack[0] = 0x43;
31 1 CmdPack[1] = 0x02;
32 1 CmdPack[6] = u8Track;
33 1 CmdPack[8] = 0x0c;
34 1
35 1 do{ACC = CDROM_FILE7;}while(BSY | DRQ);
36 1 CDROM_FILE7 = 0xa0;
37 1 do{ACC = CDROM_FILE7;}while(BSY | (!DRQ));
38 1
39 1 for(i=0; i<12;)
40 1 {
41 2 DAT16H = CmdPack[i + 1];
42 2 CDROM_FILE0 = CmdPack[i];
43 2 i += 2;
44 2 }
45 1
46 1 cd_getdata(RcvBuff, 16);
47 1
48 1 for(i=0; i<12; i++)
49 1 {
50 2 CmdPack[i] = 0;
51 2 }
52 1
53 1 CmdPack[0] = 0x47;
54 1 CmdPack[3] = RcvBuff[9];
C51 COMPILER V7.50 CDROM_TASK 02/16/2009 09:59:55 PAGE 2
55 1 CmdPack[4] = RcvBuff[10];
56 1 CmdPack[5] = RcvBuff[11];
57 1 CmdPack[6] = str_CdTotalInfo.u8Min;
58 1 CmdPack[7] = str_CdTotalInfo.u8Sec;
59 1
60 1 do{ACC = CDROM_FILE7;}while(BSY | DRQ);
61 1 CDROM_FILE7 = 0xa0;
62 1 do{ACC = CDROM_FILE7;}while(BSY | (!DRQ));
63 1
64 1 for(i=0; i<12;)
65 1 {
66 2 DAT16H = CmdPack[i + 1];
67 2 CDROM_FILE0 = CmdPack[i];
68 2 i += 2;
69 2 }
70 1 }
71
72
73 ////////////////////////////////////////////////////////////////////////
74 INT8U cdrom_getvol(void)
75 {
76 1 cd_command(CMD_MODESENSE);
77 1 cd_getdata(RcvBuff, 24);
78 1 //u16CdVolumeStep = RcvBuff[17] / 10; //for example vol=123 volstep = 12
79 1 //return u16CdVolumeStep;
80 1 return RcvBuff[17];
81 1 }
82
83
84 ////////////////////////////////////////////////////////////////////////
85 INT8U cdrom_volctrl(bit ctrl)
86 {
87 1 INT8U i,u8Vol;
88 1
89 1 u8Vol = cdrom_getvol();
90 1
91 1 if(ctrl == CDROM_VOLUP)
92 1 {
93 2 if(u8Vol < 240)
94 2 {
95 3 u8Vol += 10;
96 3 RcvBuff[17] = RcvBuff[19] = u8Vol;
97 3 }
98 2 else
99 2 {
100 3 RcvBuff[17] = RcvBuff[19] = 0xff;
101 3 }
102 2
103 2 }
104 1 else if(ctrl == CDROM_VOLDN)
105 1 {
106 2 if(u8Vol > 10)
107 2 {
108 3 u8Vol -= 10;
109 3 RcvBuff[17] = RcvBuff[19] = u8Vol;
110 3 }
111 2 else
112 2 {
113 3 RcvBuff[17] = RcvBuff[19] = 0;
114 3 }
115 2 }
116 1
C51 COMPILER V7.50 CDROM_TASK 02/16/2009 09:59:55 PAGE 3
117 1 for(i=0; i<8; i++)
118 1 {
119 2 RcvBuff[i] = 0;
120 2 }
121 1
122 1 cd_command(CMD_MODESELECT);
123 1 while(!CD_INTRQ);
124 1 do{ACC = CDROM_FILE7;}while(!DRQ);
125 1
126 1 for(i=0; i<24;)
127 1 {
128 2 DAT16H = RcvBuff[i + 1];
129 2 CDROM_FILE0 = RcvBuff[i];
130 2 i += 2;
131 2 clock_vDelay(10);
132 2 }
133 1
134 1 return (u8Vol/10);
135 1 }
136
137
138 ////////////////////////////////////////////////////////////////////////
139 void cdrom_init(void)
140 {
141 1 INT8U i;
142 1
143 1 AUXR = 0x5c; //设置EXT16=1,使能16-BIT传送模式
144 1
145 1 CD_RST = 0;
146 1 clock_vDelay(500);
147 1 CD_RST = 1;
148 1 clock_vDelay(1000);
149 1
150 1 do{ACC = CDROM_FILE7;}while(BSY);
151 1 //取驱动器选择寄存器值
152 1 i = CDROM_FILE6;
153 1 CDROM_FILE6 = i & 0xef;
154 1
155 1 i = CDROM_FILE4;
156 1 i = CDROM_FILE5;
157 1
158 1 //执行设备诊断命令
159 1 CDROM_FILE7 = 0x90;
160 1 do{ACC = CDROM_FILE7;}while(BSY);
161 1
162 1 ACC = CDROM_FILE1;
163 1
164 1 clock_vDelay(500);
165 1
166 1 CDROM_FILE5 = 0x00;
167 1 CDROM_FILE4 = 0x10;
168 1
169 1 CDROM_FILE7 = 0xa1;
170 1 cd_getdata(RcvBuff, 16);
171 1 clock_vDelay(100);
172 1
173 1 do{ACC = CDROM_FILE7;}while(BSY | (!DRDY));
174 1
175 1 key_cdrom_task_init();
176 1 u8CdStatus = STATUS_TESTUNITREADY;
177 1 }
178
C51 COMPILER V7.50 CDROM_TASK 02/16/2009 09:59:55 PAGE 4
179
180 ////////////////////////////////////////////////////
181 void cdrom_task(void)
182 {
183 1 INT16U u16CdVolumeStep;
184 1 INT8U pStr[20];
185 1
186 1 switch(u8CdStatus)
187 1 {
188 2 case STATUS_TESTUNITREADY:
189 2 cd_command(CMD_TESTUNITREADY);
190 2 cd_getdata(RcvBuff, 16);
191 2 ACC = CDROM_FILE7;
192 2 if(ERR)
193 2 {//test unit ready failed
194 3 lcd_print_string(7,"Disc Not Ready...");
195 3 }
196 2 else
197 2 {//test unit ready
198 3 lcd_print_string(7,"Loading Disc... ");
199 3 clock_vDelay(30000);
200 3 lcd_print_string(7," ");
201 3 u8CdStatus = STATUS_READTOC;
202 3 }
203 2
204 2 if(gl_key_press == TRUE)
205 2 {
206 3 if(gl_key == KEY_OPEN)
207 3 {
208 4 cd_command(CMD_OPEN);
209 4 lcd_print_string(0x40,"Open... ");
210 4 u8CdStatus = STATUS_OPENCD;
211 4 }
212 3 gl_key_press = FALSE;
213 3 }
214 2 break;
215 2
216 2 case STATUS_READTOC:
217 2 cd_command(CMD_READTOC);
218 2 cd_getdata(RcvBuff, 16);
219 2 str_CdTotalInfo.u8Track = RcvBuff[3];
220 2 str_CdTotalInfo.u8Min = RcvBuff[9];
221 2 str_CdTotalInfo.u8Sec = RcvBuff[10];
222 2 disp_cdrom_time(str_CdTotalInfo.u8Track, str_CdTotalInfo.u8Min, str_CdTotalInfo.u8Sec);
223 2 clock_vDelay(30000);
224 2 cd_playtrack(1);
225 2 u8CdStatus = STATUS_PLAYCD;
226 2 lcd_print_string(0x40,"Play... ");
227 2 break;
228 2
229 2 case STATUS_PLAYCD:
230 2 cd_command(CMD_READSUBCH);
231 2 cd_getdata(RcvBuff, 16);
232 2 str_CdCurrentInfo.u8Track = RcvBuff[6];
233 2 str_CdCurrentInfo.u8Min = RcvBuff[13];
234 2 str_CdCurrentInfo.u8Sec = RcvBuff[14];
235 2 disp_cdrom_time(str_CdCurrentInfo.u8Track, str_CdCurrentInfo.u8Min, str_CdCurrentInfo.u8Sec);
236 2
237 2 if(gl_key_press == TRUE)
238 2 {
239 3 if(gl_key < 10)
240 3 {
C51 COMPILER V7.50 CDROM_TASK 02/16/2009 09:59:55 PAGE 5
241 4 str_CdCurrentInfo.u8Track = gl_key;
242 4 cd_playtrack(str_CdCurrentInfo.u8Track);
243 4 }
244 3 else switch(gl_key)
245 3 {
246 4 case KEY_OPEN:
247 4 cd_command(CMD_OPEN);
248 4 lcd_print_string(0x40,"Open... ");
249 4 u8CdStatus = STATUS_OPENCD;
250 4 break;
251 4
252 4 case KEY_PLAY:
253 4 cd_command(CMD_PAUSE);
254 4 lcd_print_string(0x40,"Pause... ");
255 4 u8CdStatus = STATUS_PAUSECD;
256 4 break;
257 4
258 4 case KEY_NEXT:
259 4 if(str_CdCurrentInfo.u8Track == str_CdTotalInfo.u8Track)
260 4 {
261 5 str_CdCurrentInfo.u8Track = 1;
262 5 }
263 4 else
264 4 {
265 5 str_CdCurrentInfo.u8Track ++;
266 5 }
267 4 cd_playtrack(str_CdCurrentInfo.u8Track);
268 4 break;
269 4
270 4 case KEY_PREV:
271 4 if(str_CdCurrentInfo.u8Track == 1)
272 4 {
273 5 str_CdCurrentInfo.u8Track = str_CdTotalInfo.u8Track;
274 5 }
275 4 else
276 4 {
277 5 str_CdCurrentInfo.u8Track --;
278 5 }
279 4 cd_playtrack(str_CdCurrentInfo.u8Track);
280 4 break;
281 4
282 4 case KEY_INC:
283 4 u16CdVolumeStep = cdrom_volctrl(CDROM_VOLUP);
284 4 sprintf(pStr, "VOL:%02d", u16CdVolumeStep);
285 4 lcd_print_string(0x4a, pStr);
286 4 break;
287 4
288 4 case KEY_DEC:
289 4 u16CdVolumeStep = cdrom_volctrl(CDROM_VOLDN);
290 4 sprintf(pStr, "VOL:%02d", u16CdVolumeStep);
291 4 lcd_print_string(0x4a, pStr);
292 4 break;
293 4
294 4 }
295 3 gl_key_press = FALSE;
296 3 }
297 2 break;
298 2
299 2 case STATUS_PAUSECD:
300 2 if(gl_key_press == TRUE)
301 2 {
302 3 switch(gl_key)
C51 COMPILER V7.50 CDROM_TASK 02/16/2009 09:59:55 PAGE 6
303 3 {
304 4 case KEY_OPEN:
305 4 cd_command(CMD_OPEN);
306 4 lcd_print_string(0x40,"Open... ");
307 4 u8CdStatus = STATUS_OPENCD;
308 4 break;
309 4
310 4 case KEY_PLAY:
311 4 cd_command(CMD_RESUME);
312 4 lcd_print_string(0x40,"Play... ");
313 4 u8CdStatus = STATUS_PLAYCD;
314 4 break;
315 4 }
316 3 }
317 2 break;
318 2
319 2 case STATUS_OPENCD:
320 2 if(gl_key_press == TRUE)
321 2 {
322 3 if(gl_key == KEY_OPEN)
323 3 {
324 4 cd_command(CMD_CLOSE);
325 4 lcd_print_string(0x40,"Close... ");
326 4 u8CdStatus = STATUS_TESTUNITREADY;
327 4 }
328 3 gl_key_press = FALSE;
329 3 }
330 2 break;
331 2 }
332 1
333 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1175 ----
CONSTANT SIZE = 105 ----
XDATA SIZE = 31 24
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -