📄 serial.lst
字号:
213 1 //EA=0;
214 1 //入临界区
215 1 #pragma ASM
216 1 PUSH IE;
217 1 CLR EA;
218 1 #pragma ENDASM
219 1 insidePrintWord(Word);
220 1 //EA=1;
221 1 //出临界区
222 1 #pragma ASM
223 1 POP IE;
224 1 #pragma ENDASM
225 1 }
226
227 void PrintLong(unsigned long LongWord) reentrant//以十六进制格式显示1个长字数据
228 {
229 1 //EA=0;
230 1 //入临界区
231 1 #pragma ASM
232 1 PUSH IE;
233 1 CLR EA;
234 1 #pragma ENDASM
235 1 insidePrintWord(LongWord>>16);
236 1 insidePrintWord(LongWord&0xFFFF);
237 1 //EA=1;
238 1 //出临界区
239 1 #pragma ASM
240 1 POP IE;
241 1 #pragma ENDASM
C51 COMPILER V7.50 SERIAL 02/10/2003 23:00:30 PAGE 5
242 1 }
243
244 void PrintStr(unsigned char *str) reentrant//显示字符串
245 {
246 1 int i;
247 1 unsigned char j;
248 1 unsigned char ch;
249 1
250 1 //EA=0;
251 1 //入临界区
252 1 #pragma ASM
253 1 PUSH IE;
254 1 CLR EA;
255 1 #pragma ENDASM
256 1 for(i=0;i<MaxLenStr;i++){
257 2 ch=*(str+i);
258 2 if(ch=='\0') break;
259 2 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
260 2 else if(ch=='\t'){
261 3 for(j=0;j<TABNum;j++)
262 3 PrintChar(' ');
263 3 }
264 2 else PrintChar(ch);
265 2 }
266 1 //EA=1;
267 1 //出临界区
268 1 #pragma ASM
269 1 POP IE;
270 1 #pragma ENDASM
271 1 }
272
273 void clrscr() reentrant//清屏
274 {
275 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个回车换行清屏幕。
276 1 }
277
278 //============================================================================================
279 //
280 //============================================================================================
281 void yyprintf(char *fmt,...) reentrant //自编简单printf等效函数
282 {
283 1 void *p; //任意指针,可以指向任何类型,C语法不对其严格要求。
284 1 char ch;
285 1 unsigned char j;
286 1
287 1 p=&fmt;
288 1 p=(char **)p+1; //此处p是指向指针的指针,fmt是字符串指针,p是指向fmt的指针
289 1
290 1 //入临界区
291 1 #pragma ASM
292 1 PUSH IE;
293 1 CLR EA;
294 1 #pragma ENDASM
295 1
296 1 while(1){
297 2 while((ch=*fmt++)!='%'){
298 3 if(ch=='\0'){
299 4 //出临界区
300 4 #pragma ASM
301 4 POP IE;
302 4 #pragma ENDASM
303 4 return;
C51 COMPILER V7.50 SERIAL 02/10/2003 23:00:30 PAGE 6
304 4 }
305 3 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
306 3 else if(ch=='\t'){
307 4 for(j=0;j<TABNum;j++)
308 4 PrintChar(' ');
309 4 }
310 3 else PrintChar(ch);
311 3 }
312 2 ch=*fmt++;
313 2 switch(ch){
314 3 case 'c':
315 3 PrintChar(*((char *)p));
316 3 p=(char *)p+1;
317 3 break;
318 3 case 'd':
319 3 PrintN(*((int *)p),10);
320 3 p=(int *)p+1;
321 3 break;
322 3 case 'x':
323 3 PrintN(*((int *)p),16);
324 3 p=(int *)p+1;
325 3 break;
326 3 case 'o':
327 3 PrintUN(*((int *)p),8);
328 3 p=(int *)p+1;
329 3 break;
330 3 case 'b':
331 3 PrintUN(*((int *)p),2);
332 3 p=(int *)p+1;
333 3 break;
334 3 case 'l':
335 3 ch=*fmt++;
336 3 switch(ch){
337 4 case 'd':
338 4 PrintLN(*((long *)p),10);
339 4 p=(long *)p+1;
340 4 break;
341 4 case 'o':
342 4 PrintLUN(*((long *)p),8);
343 4 p=(long *)p+1;
344 4 break;
345 4 case 'u':
346 4 PrintLUN(*((unsigned long *)p),10);
347 4 p=(unsigned long *)p+1;
348 4 break;
349 4 case 'b':
350 4 PrintLUN(*((long *)p),2);
351 4 p=(long *)p+1;
352 4 break;
353 4 case 'x':
354 4 PrintLN(*((long *)p),16);
355 4 p=(long *)p+1;
356 4 break;
357 4 default:
358 4 //出临界区
359 4 #pragma ASM
360 4 POP IE;
361 4 #pragma ENDASM
362 4 return;
363 4 }
364 3 break;
365 3 case 'f':
C51 COMPILER V7.50 SERIAL 02/10/2003 23:00:30 PAGE 7
366 3 DispF(*((float *)p));
367 3 p=(float *)p+1;
368 3 break;
369 3 case 'u':
370 3 PrintUN(*((unsigned int *)p),10);
371 3 p=(unsigned int *)p+1;
372 3 break;
373 3 case 's':
374 3 PrintStr(*((char **)p));
375 3 p=(char **)p+1;
376 3 break;
377 3 case '%':
378 3 PrintChar('%');
379 3 p=(char *)p+1;
380 3 break;
381 3 default:
382 3 //出临界区
383 3 #pragma ASM
384 3 POP IE;
385 3 #pragma ENDASM
386 3 return;
387 3 }
388 2 }
389 1 }
390
391 void PrintN(int n,int b) reentrant //十进制显示整形数
392 {
393 1 if(b==16){PrintWord(n);return;}
394 1 if(n<0){PrintChar('-');n=-n;}
395 1 if(n/b)
396 1 PrintN(n/b,b);
397 1 PrintChar(n%b+'0');
398 1 }
399
400 void PrintUN(unsigned int n,unsigned int b) reentrant //十进制显示无符号整形数
401 {
402 1 if(b==16){PrintWord(n);return;}
403 1 if(n/b)
404 1 PrintUN(n/b,b);
405 1 PrintChar(n%b+'0');
406 1 }
407
408
409 void PrintLN(long n,long b) reentrant //十进制显示长整形数
410 {
411 1 if(b==16){PrintLong(n);return;}
412 1 if(n<0){PrintChar('-');n=-n;}
413 1 if(n/b)
414 1 PrintLN(n/b,b);
415 1 PrintChar(n%b+'0');
416 1 }
417
418 void PrintLUN(unsigned long n,unsigned long b) reentrant //十进制显示无符号长整形数
419 {
420 1 if(b==16){PrintLong(n);return;}
421 1 if(n/b)
422 1 PrintLUN(n/b,b);
423 1 PrintChar(n%b+'0');
424 1 }
425
426 //============================================================================================
427 //KEIL C51的float类型采用IEEE-754标准存储,占4字节。
C51 COMPILER V7.50 SERIAL 02/10/2003 23:00:30 PAGE 8
428 // 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
429 // S 1bit 正负标志位0=正;1=负
430 // E 8bit 二进制阶码=(EEEEEEEE)-127
431 // M 23bit 24bit尾数,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效数,提高了精度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -