?? serial.lst
字號:
208 1 PUSH IE;
209 1 CLR EA;
210 1 #pragma ENDASM
211 1 insidePrintWord(Word);
212 1 //EA=1;
213 1 //出臨界區
214 1 #pragma ASM
215 1 POP IE;
216 1 #pragma ENDASM
217 1 }
218
219 void PrintLong(unsigned long LongWord) reentrant//以十六進制格式顯示1個長字數據
220 {
221 1 //EA=0;
222 1 //入臨界區
223 1 #pragma ASM
224 1 PUSH IE;
225 1 CLR EA;
226 1 #pragma ENDASM
227 1 insidePrintWord(LongWord>>16);
228 1 insidePrintWord(LongWord&0xFFFF);
229 1 //EA=1;
230 1 //出臨界區
231 1 #pragma ASM
232 1 POP IE;
233 1 #pragma ENDASM
234 1 }
235
236 void PrintStr(unsigned char *str) reentrant//顯示字符串
237 {
238 1 int i;
239 1 unsigned char j;
240 1 unsigned char ch;
241 1
C51 COMPILER V8.05a SERIAL 02/26/2007 16:50:12 PAGE 5
242 1 //EA=0;
243 1 //入臨界區
244 1 #pragma ASM
245 1 PUSH IE;
246 1 CLR EA;
247 1 #pragma ENDASM
248 1 for(i=0;i<MaxLenStr;i++){
249 2 ch=*(str+i);
250 2 if(ch=='\0') break;
251 2 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
252 2 else if(ch=='\t'){
253 3 for(j=0;j<TABNum;j++)
254 3 PrintChar(' ');
255 3 }
256 2 else PrintChar(ch);
257 2 }
258 1 //EA=1;
259 1 //出臨界區
260 1 #pragma ASM
261 1 POP IE;
262 1 #pragma ENDASM
263 1 }
264
265 void clrscr() reentrant//清屏
266 {
267 1 PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//25個回車換行清屏幕。
268 1 }
269
270 //============================================================================================
271 //
272 //============================================================================================
273 void yyprintf(char *fmt,...) reentrant //自編簡單printf等效函數
274 {
275 1 void *p; //任意指針,可以指向任何類型,C語法不對其嚴格要求。
276 1 char ch;
277 1 unsigned char j;
278 1
279 1 p=&fmt;
280 1 p=(char **)p+1; //此處p是指向指針的指針,fmt是字符串指針,p是指向fmt的指針
281 1
282 1 //入臨界區
283 1 #pragma ASM
284 1 PUSH IE;
285 1 CLR EA;
286 1 #pragma ENDASM
287 1
288 1 while(1){
289 2 while((ch=*fmt++)!='%'){
290 3 if(ch=='\0'){
291 4 //出臨界區
292 4 #pragma ASM
293 4 POP IE;
294 4 #pragma ENDASM
295 4 return;
296 4 }
297 3 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
298 3 else if(ch=='\t'){
299 4 for(j=0;j<TABNum;j++)
300 4 PrintChar(' ');
301 4 }
302 3 else PrintChar(ch);
303 3 }
C51 COMPILER V8.05a SERIAL 02/26/2007 16:50:12 PAGE 6
304 2 ch=*fmt++;
305 2 switch(ch){
306 3 case 'c':
307 3 PrintChar(*((char *)p));
308 3 p=(char *)p+1;
309 3 break;
310 3 case 'd':
311 3 PrintN(*((int *)p),10);
312 3 p=(int *)p+1;
313 3 break;
314 3 case 'x':
315 3 PrintN(*((int *)p),16);
316 3 p=(int *)p+1;
317 3 break;
318 3 case 'o':
319 3 PrintUN(*((int *)p),8);
320 3 p=(int *)p+1;
321 3 break;
322 3 case 'b':
323 3 PrintUN(*((int *)p),2);
324 3 p=(int *)p+1;
325 3 break;
326 3 case 'l':
327 3 ch=*fmt++;
328 3 switch(ch){
329 4 case 'd':
330 4 PrintLN(*((long *)p),10);
331 4 p=(long *)p+1;
332 4 break;
333 4 case 'o':
334 4 PrintLUN(*((long *)p),8);
335 4 p=(long *)p+1;
336 4 break;
337 4 case 'u':
338 4 PrintLUN(*((unsigned long *)p),10);
339 4 p=(unsigned long *)p+1;
340 4 break;
341 4 case 'b':
342 4 PrintLUN(*((long *)p),2);
343 4 p=(long *)p+1;
344 4 break;
345 4 case 'x':
346 4 PrintLN(*((long *)p),16);
347 4 p=(long *)p+1;
348 4 break;
349 4 default:
350 4 //出臨界區
351 4 #pragma ASM
352 4 POP IE;
353 4 #pragma ENDASM
354 4 return;
355 4 }
356 3 break;
357 3 case 'f':
358 3 DispF(*((float *)p));
359 3 p=(float *)p+1;
360 3 break;
361 3 case 'u':
362 3 PrintUN(*((unsigned int *)p),10);
363 3 p=(unsigned int *)p+1;
364 3 break;
365 3 case 's':
C51 COMPILER V8.05a SERIAL 02/26/2007 16:50:12 PAGE 7
366 3 PrintStr(*((char **)p));
367 3 p=(char **)p+1;
368 3 break;
369 3 case '%':
370 3 PrintChar('%');
371 3 p=(char *)p+1;
372 3 break;
373 3 default:
374 3 //出臨界區
375 3 #pragma ASM
376 3 POP IE;
377 3 #pragma ENDASM
378 3 return;
379 3 }
380 2 }
381 1 }
382
383 void PrintN(int n,int b) reentrant //十進制顯示整形數
384 {
385 1 if(b==16){PrintWord(n);return;}
386 1 if(n<0){PrintChar('-');n=-n;}
387 1 if(n/b)
388 1 PrintN(n/b,b);
389 1 PrintChar(n%b+'0');
390 1 }
391
392 void PrintUN(unsigned int n,unsigned int b) reentrant //十進制顯示無符號整形數
393 {
394 1 if(b==16){PrintWord(n);return;}
395 1 if(n/b)
396 1 PrintUN(n/b,b);
397 1 PrintChar(n%b+'0');
398 1 }
399
400
401 void PrintLN(long n,long b) reentrant //十進制顯示長整形數
402 {
403 1 if(b==16){PrintLong(n);return;}
404 1 if(n<0){PrintChar('-');n=-n;}
405 1 if(n/b)
406 1 PrintLN(n/b,b);
407 1 PrintChar(n%b+'0');
408 1 }
409
410 void PrintLUN(unsigned long n,unsigned long b) reentrant //十進制顯示無符號長整形數
411 {
412 1 if(b==16){PrintLong(n);return;}
413 1 if(n/b)
414 1 PrintLUN(n/b,b);
415 1 PrintChar(n%b+'0');
416 1 }
417
418 //============================================================================================
419 //KEIL C51的float類型采用IEEE-754標準存儲,占4字節。
420 // S E E E E E E E E E (1) M M M M M M M M M M M M M M M M M M M M M M M
421 // S 1bit 正負標志位0=正;1=負
422 // E 8bit 二進制階碼=(EEEEEEEE)-127
423 // M 23bit 24bit尾數,只存儲23位,最高位固定為1。此方法用最較少的位數實現了較高的有效數,提高了精度
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -