找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1137|回复: 2
打印 上一主题 下一主题
收起左侧

求助基于单片机的简易计算器代码,容错和除零提示我实在不懂

[复制链接]
跳转到指定楼层
楼主
ID:982033 发表于 2021-11-18 20:45 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想做一个基于52单片机的简易计算器,我已经把四则运算做出来了,但是容错和除零提示我实在不懂,求大佬帮忙解疑,下面是我的代码
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <ctype.h>               
  4. #include <stdlib.h>                        

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uchar operand1[9], operand2[9];  
  8. uchar operator;                                         

  9. void delay(uint);
  10. uchar keyscan();
  11. void disp(void);
  12. void buf(uint value);
  13. uint compute(uint va1,uint va2,uchar optor);

  14. uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
  15.                                 0x92,0x82,0xf8,0x80,0x90,0xff};     

  16. uchar dbuf[8] = {10,10,10,10,10,10,10,10};                    

  17.         
  18. void delay(uint z)
  19. {
  20. uint x,y;
  21. for(x=z;x>0;x--)
  22.         for(y=110;y>0;y--);
  23. }

  24. uchar keyscan()
  25. {
  26.         uchar skey;                     
  27.    

  28.         P1 = 0xfe;
  29.         while((P1 & 0xf0) != 0xf0)           
  30.         {
  31.                 delay(3);                           

  32.                 while((P1 & 0xf0) != 0xf0)
  33.                 {
  34.                         switch(P1)                                
  35.                         {
  36.                                 case 0xee: skey = '0'; break;
  37.                                 case 0xde: skey = '1'; break;
  38.                                 case 0xbe: skey = '2'; break;
  39.                                 case 0x7e: skey = '3'; break;
  40.                                        
  41.                                 default:   skey = '#';
  42.                         }

  43.                         while((P1 & 0xf0) != 0xf0)
  44.                                 ;
  45.                 }
  46.         }


  47.         P1 = 0xfd;        
  48.         while((P1 & 0xf0) != 0xf0)
  49.         {
  50.                 delay(3);

  51.                 while((P1 & 0xf0) != 0xf0)
  52.                 {
  53.                         switch(P1)
  54.                         {
  55.                                 case 0xed: skey = '4'; break;
  56.                                 case 0xdd: skey = '5'; break;
  57.                                 case 0xbd: skey = '6'; break;
  58.                                 case 0x7d: skey = '7'; break;
  59.                                        
  60.                                 default:   skey = '#';
  61.                         }

  62.                         while((P1 & 0xf0) != 0xf0)
  63.                                 ;
  64.                 }
  65.         }



  66.         P1 = 0xfb;
  67.         while((P1 & 0xf0) != 0xf0)
  68.         {
  69.                 delay(3);
  70.                
  71.                 while((P1 & 0xf0) != 0xf0)
  72.                 {
  73.                         switch(P1)
  74.                         {
  75.                                 case 0xeb: skey = '8'; break;
  76.                                 case 0xdb: skey = '9'; break;
  77.                                 case 0xbb: skey = '+'; break;
  78.                                 case 0x7b: skey = '-'; break;
  79.                                        
  80.                                 default: skey = '#';
  81.                         }

  82.                         while((P1 & 0xf0) != 0xf0)
  83.                                 ;
  84.                 }
  85.         }



  86.         P1 = 0xf7;
  87.         while((P1 & 0xf0) != 0xf0)
  88.         {
  89.                 delay(3);

  90.                 while((P1 & 0xf0) != 0xf0)
  91.                 {
  92.                         switch(P1)
  93.                         {
  94.                                 case 0xe7: skey = '*'; break;
  95.                                 case 0xd7: skey = '/'; break;
  96.                                 case 0xb7: skey = '='; break;
  97.                                 case 0x77: skey = '; break;
  98.                                        
  99.                                 default:   skey = '#';
  100.                         }

  101.                         while((P1 & 0xf0) != 0xf0)
  102.                                 ;
  103.                 }
  104.         }

  105.         return skey;
  106. }

  107. void main()
  108. {        
  109.         uint value1, value2, value;                  
  110.         uchar ckey, cut1 = 0, cut2 = 0;   
  111.         uchar operator;                              
  112.         uchar i, bool = 0;

  113. init:                                                                  

  114.         buf(0);                           
  115.         disp();
  116.         value = 0;
  117.         cut1 = cut2 = 0;
  118.         bool = 0;
  119.         for(i = 0;i < 9;i++)
  120.         {
  121.                 operand1[i] = '\0';
  122.                 operand2[i] = '\0';
  123.         }                                

  124.         while(1)
  125.         {
  126.                 ckey = keyscan();            
  127.                 if(ckey != '#')
  128.                 {
  129.                         if(isdigit(ckey))         
  130.                         {
  131.                                 switch(bool)        
  132.                                 {
  133.                                         case 0:
  134.                                                         operand1[cut1] = ckey;
  135.                                                         operand1[cut1+1] = '\0';
  136.                                                         value1 = atoi(operand1);
  137.                                                         cut1++;
  138.                                                         buf(value1);
  139.                                                         disp();
  140.                                                         break;
  141.                                         case 1:
  142.                                                         operand2[cut2] = ckey;
  143.                                                         operand2[cut2+1] = '\0';
  144.                                                         value2 = atoi(operand2);
  145.                                                         cut2++;
  146.                                                         buf(value2);
  147.                                                         disp();
  148.                                                         break;
  149.                                                         
  150.                                         default: break;
  151.                                 }
  152.                         }
  153.                         else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
  154.                         {
  155.                                 bool = 1;        
  156.                                 operator = ckey;
  157.                                 buf(0);
  158.                                 dbuf[7] = 10;
  159.                                 disp();
  160.                         }
  161.                         else if(ckey == '=')
  162.                         {
  163.                                 value = compute(value1,value2,operator);
  164.                                 buf(value);
  165.                                 disp();
  166.                                 while(1)                    
  167.                                 {
  168.                                         ckey = keyscan();
  169.                                         if(ckey == ')
  170.                                         if(ckey == ')
  171.                                         else        
  172.                                                 goto init;
  173.                                         else
  174.                                                 {
  175.                                                         buf(value);
  176.                                                         disp();
  177.                                                 }
  178.                                 }
  179.                         }
  180.                         else if(ckey == ')
  181.                         {        goto init;}
  182.                 }
  183.                 disp();
  184.         }

  185. }


  186. uint compute(uint va1,uint va2,uchar optor)
  187. {
  188.         uint value;

  189.         switch(optor)
  190.         {
  191.                 case '+' : value = va1+va2;        break;
  192.                 case '-' : value = va1-va2;        break;
  193.                 case '*' : value = va1*va2;        break;
  194.                 case '/' : value = va17a2;        break;
  195.                 default :  break;
  196.         }
  197.         return value;
  198. }


  199. void buf(uint val)
  200. {
  201.         uchar i;
  202.         if(val == 0)
  203.         {
  204.                 dbuf[7] = 0;
  205.                 i = 6;
  206.         }
  207.         
  208.         else
  209.                 for(i = 7; val > 0; i--)
  210.                 {
  211.                         dbuf[i] = val % 10;
  212.                         val /= 10;
  213.                 }
  214.         
  215.         for( ; i > 0; i--)
  216.                 dbuf[i] = 10;
  217. }


  218. void disp(void)
  219. {
  220.         uchar bsel, n;
  221.         
  222.         bsel=0x01;
  223.     for(n=0;n<8;n++)
  224.     {
  225.                 P2=bsel;
  226.                 P0=table[dbuf[n]];
  227.                 bsel=_crol_(bsel,1);
  228.                 delay(3);
  229.                 P0=0xff;
  230.     }
  231. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:906597 发表于 2021-11-26 20:15 | 只看该作者
给个注释吧
回复

使用道具 举报

板凳
ID:332444 发表于 2021-11-27 06:42 | 只看该作者
到我博客去找有例子https://blog.csdn.net/xianfajushi
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表