📄 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 V7.10 SERIAL 09/04/2007 10:27:37 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 V7.10 SERIAL 09/04/2007 10:27:37 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 V7.10 SERIAL 09/04/2007 10:27:37 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 + -