📄 main.lst
字号:
256 2 Led_buf[i] = Ledcode[i_num/sit];
257 2 i_num -= i_num/sit*sit;
258 2 }
259 1 Led_buf[0] = Ledcode[i_num] & 0x7F;
260 1 if (s_flag)
261 1 Led_buf[5] = Ledcode[11];
262 1 else
263 1 Led_buf[5] = Ledcode[10];
264 1 ET0 = 1;
265 1
266 1 }
267
268 /*
269 * 制作数码管浮点数据
270 */
271 void make_led_fnumber(float f_num)
272 {
273 1 bit s_flag=0;
274 1 int32 num;
275 1 int16 sit;
276 1 int8 i, decimal, dot_sit=0;
277 1
278 1
279 1 if (f_num < 0)
280 1 {
281 2 s_flag = 1;
282 2 f_num = -f_num;
283 2 }
284 1
285 1 num = (int32)(f_num*10000+0.5);
286 1 for (decimal=4; decimal>0; decimal--)
287 1 {
288 2 if (num % 10 != 0)
289 2 break;
290 2 num /= 10;
291 2 }
292 1
293 1 dot_sit = decimal;
294 1 if (f_num >= 10000)
295 1 dot_sit = 0;
296 1 else if (f_num >= 1000)
297 1 if (decimal >= 1)
298 1 dot_sit = 1;
299 1 else if (f_num >= 100)
300 1 if (decimal >= 2)
301 1 dot_sit = 2;
302 1 else if (f_num >= 10)
303 1 if (decimal >= 3)
C51 COMPILER V8.02 MAIN 12/24/2010 23:09:03 PAGE 6
304 1 dot_sit = 3;
305 1
306 1 for (i=0; i<dot_sit; i++)
307 1 f_num *= 10;
308 1 num = (int32)(f_num+0.5);
309 1
310 1 ET0 = 0;
311 1 for (i=4, sit=10000; i>=1; i--, sit/=10)
312 1 {
313 2 if (num >= sit)
314 2 break;
315 2 if (i == dot_sit)
316 2 break;
317 2 Led_buf[i] = Ledcode[10];
318 2 num -= num/sit*sit;
319 2 }
320 1 for (;i>=1; i--, sit/=10)
321 1 {
322 2 Led_buf[i] = Ledcode[num/sit];
323 2 num -= num/sit*sit;
324 2 }
325 1 Led_buf[0] = Ledcode[num];
326 1 Led_buf[dot_sit] &= 0x7F;
327 1 if (s_flag)
328 1 Led_buf[5] = Ledcode[11];
329 1 else
330 1 Led_buf[5] = Ledcode[10];
331 1 ET0 = 1;
332 1
333 1 }
334
335 /*
336 * 数码管显示
337 */
338 void show_num(uint8 *buf)
339 {
340 1 ENLED = 1;
341 1 switch (Led_n)
342 1 {
343 2 case 0:
344 2 ADDR0 = 0;
345 2 ADDR1 = 0;
346 2 ADDR2 = 0;
347 2 P0 = buf[0];
348 2 break;
349 2 case 1:
350 2 ADDR0 = 1;
351 2 ADDR1 = 0;
352 2 ADDR2 = 0;
353 2 P0 = buf[1];
354 2 break;
355 2 case 2:
356 2 ADDR0 = 0;
357 2 ADDR1 = 1;
358 2 ADDR2 = 0;
359 2 P0 = buf[2];
360 2 break;
361 2 case 3:
362 2 ADDR0 = 1;
363 2 ADDR1 = 1;
364 2 ADDR2 = 0;
365 2 P0 = buf[3];
C51 COMPILER V8.02 MAIN 12/24/2010 23:09:03 PAGE 7
366 2 break;
367 2 case 4:
368 2 ADDR0 = 0;
369 2 ADDR1 = 0;
370 2 ADDR2 = 1;
371 2 P0 = buf[4];
372 2 break;
373 2 case 5:
374 2 ADDR0 = 1;
375 2 ADDR1 = 0;
376 2 ADDR2 = 1;
377 2 P0 = buf[5];
378 2 break;
379 2 }
380 1 ENLED = 0;
381 1
382 1 if (Led_n >= 5)
383 1 Led_n = 0;
384 1 else
385 1 Led_n++;
386 1 }
387
388 /*
389 * 计算程序
390 */
391 void calculate(int8 key_val)
392 {
393 1 float ans;
394 1 bit err=0;
395 1
396 1 if ((key_val >= FADD) && (key_val <= FDIV))
397 1 {
398 2 C_flag = key_val;
399 2 }
400 1 else if (key_val == FEQU)
401 1 {
402 2 switch (C_flag)
403 2 {
404 3 case FADD: ans = Tmp1+Tmp2; break;
405 3 case FSUB: ans = Tmp1-Tmp2; break;
406 3 case FMUL: ans = Tmp1*Tmp2; break;
407 3 case FDIV: if (Tmp2 == 0)
408 3 {
409 4 err = 1;
410 4 break;
411 4 }
412 3 else
413 3 {
414 4 ans = Tmp1/Tmp2;
415 4 break;
416 4 }
417 3 }
418 2 if (check_num(ans))
419 2 err = 1;
420 2 if (err)
421 2 make_led_error();
422 2 else
423 2 make_led_fnumber(ans);
424 2 C_flag = 0;
425 2 Tmp1 = 0;
426 2 Tmp2 = 0;
427 2 }
C51 COMPILER V8.02 MAIN 12/24/2010 23:09:03 PAGE 8
428 1 else if (key_val == FRES)
429 1 {
430 2 make_led_fnumber(0);
431 2 C_flag = 0;
432 2 Tmp1 = 0;
433 2 Tmp2 = 0;
434 2 }
435 1 else
436 1 {
437 2 if (C_flag == 0)
438 2 {
439 3 ans = Tmp1;
440 3 ans *= 10;
441 3 ans += key_val;
442 3 if (check_num(ans))
443 3 return;
444 3 else
445 3 Tmp1 = ans;
446 3 make_led_inumber(Tmp1);
447 3 }
448 2 else
449 2 {
450 3 ans = Tmp2;
451 3 ans *= 10;
452 3 ans += key_val;
453 3 if (check_num(ans))
454 3 return;
455 3 else
456 3 Tmp2 = ans;
457 3 make_led_inumber(Tmp2);
458 3 }
459 2
460 2 }
461 1
462 1 }
463
464
465
466 main()
467 {
468 1 int8 key_val;
469 1
470 1 ADDR3 = 1;
471 1 ENLED = 0;
472 1
473 1 make_led_inumber(0);
474 1
475 1 TMOD = 0x01;
476 1 TH0 = 0xF8;
477 1 TL0 = 0xCC;
478 1 TR0 = 1;
479 1 ET0 = 1;
480 1 EA = 1;
481 1
482 1 while (1)
483 1 {
484 2 key_val = scan_key();
485 2 if (key_val == -1)
486 2 continue;
487 2 calculate(key_val);
488 2
489 2 }
C51 COMPILER V8.02 MAIN 12/24/2010 23:09:03 PAGE 9
490 1 }
491
492
493 void time0() interrupt 1
494 {
495 1 TR0 = 0;
496 1 TH0 = 0xF8;
497 1 TL0 = 0xCC;
498 1
499 1 show_num(Led_buf);
500 1
501 1 TR0 = 1;
502 1 }
503
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2082 ----
CONSTANT SIZE = 13 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 30
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -