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