找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机计算器程序

[复制链接]
跳转到指定楼层
楼主

1.    一次只能计算两数;
2.    +,-,*,/分别对应P,-,H,d
3.    计算范围[0,1000000)
4.    不支持负数运算
5.    小数只有两位
6.    式子问题为ERROR
7.    溢出显示OVER

单片机源程序如下:
  1. /*

  2. 请看计算器4.0的说明Word

  3. */

  4. #include <reg52.h>
  5. #define GPIO_DIG P0
  6. #define GPIO_KEY P1
  7. typedef unsigned char uchar;
  8. typedef unsigned int uint;
  9. sbit LSA=P2^2;
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;
  12. uchar code smg[]=
  13. {
  14.     0x3f,0x06,0x5b,0x4f,0x66,
  15.     0x6d,0x7d,0x07,0x7f,0x6f,
  16.     0x77,0x7c,0x39,0x5e,0x79,0x71
  17. };
  18. long Value1,Value2,Value3;
  19. uchar a,b,c,x,minus,err,dian;        //a是数字1的flag,b是数字2的flag,c是运算符的flag,x是运算符,minus是负号

  20. void count(uchar);
  21. void display(long);
  22. void Keyscan(void);
  23. void delay_ms(uint);

  24. void delay_ms(uint n)                //n毫秒
  25. {
  26.     uint i=0,j=0;
  27.     for(i=0; i<n; i++)
  28.         for(j=0; j<123; j++);
  29. }

  30. void Keyscan()
  31. {       
  32.     uchar KeyValue;
  33.     GPIO_KEY=0xf0;
  34.     if(GPIO_KEY!=0xf0)
  35.     {
  36.         delay_ms(10);
  37.         if(GPIO_KEY!=0xf0)
  38.         {
  39.             switch(GPIO_KEY)
  40.             {
  41.             case 0x70:
  42.                 KeyValue=3;
  43.                 break;
  44.             case 0xb0:
  45.                 KeyValue=2;
  46.                 break;
  47.             case 0xd0:
  48.                 KeyValue=1;
  49.                 break;
  50.             case 0xe0:
  51.                 KeyValue=0;
  52.                 break;
  53.             }
  54.             GPIO_KEY=0x0f;
  55.             switch(GPIO_KEY)
  56.             {
  57.             case 0x0e:
  58.                 break;
  59.             case 0x07:
  60.                 KeyValue+=12;
  61.                 break;
  62.             case 0x0b:
  63.                 KeyValue+=8;
  64.                 break;
  65.             case 0x0d:
  66.                 KeyValue+=4;
  67.                 break;
  68.             }
  69.             while(GPIO_KEY!=0x0f);
  70.             if(KeyValue<10)
  71.             {
  72.                 if(a<7)         //数字1
  73.                 {
  74.                     Value1=Value1*10+KeyValue;
  75.                     b=7;
  76.                     if(Value1!=0)
  77.                         a++;
  78.                 }
  79.                 if(b<7)         //数字2
  80.                 {
  81.                     Value2=Value2*10+KeyValue;
  82.                     c=0;
  83.                     if(Value2!=0)
  84.                         b++;
  85.                 }
  86.             }
  87.             else
  88.             {
  89.                 a=7;                //跳出数字1
  90.                 b=0;                //准备进数字2
  91.                 c=1;                //显示运算符
  92.                 switch(KeyValue)
  93.                 {
  94.                 case 10:
  95.                     x=1;
  96.                     break;        //add
  97.                 case 11:
  98.                     x=2;
  99.                     break;        //reduce
  100.                 case 12:
  101.                     x=3;
  102.                     break;        //multiply
  103.                 case 13:
  104.                     x=4;
  105.                     break;        //divide
  106.                 case 14:
  107.                     b=7;
  108.                     c=0;
  109.                     count(x);
  110.                     x=5;
  111.                     break;  //equal
  112.                 case 15:
  113.                     a=0;
  114.                     b=0;
  115.                     x=0;
  116.                     c=0;
  117.                     minus=0;
  118.                     err=0;
  119.                     dian=0;
  120.                     Value1=0;
  121.                     Value2=0;
  122.                     Value3=0;
  123.                     break;  //Zero
  124.                 }
  125.             }
  126.         }
  127.     }
  128. }

  129. void display(long Temp)
  130. {
  131.     uchar wei[7],n;
  132.     wei[0]=Temp%10;                                        //个位
  133.     wei[1]=Temp/10%10;
  134.     wei[2]=Temp/100%10;
  135.     wei[3]=Temp/1000%10;
  136.     wei[4]=Temp/10000%10;
  137.     wei[5]=Temp/100000%10;
  138.     wei[6]=Temp/1000000%10;                        //第七位
  139.     if(c==1)        //显示运算符
  140.     {
  141.         switch(Temp)
  142.         {
  143.         case 1:
  144.             LSC=1;
  145.             LSB=1;
  146.             LSC=1;
  147.             GPIO_DIG=0x73;
  148.             break;  //显示P代表+
  149.         case 2:
  150.             LSC=1;
  151.             LSB=1;
  152.             LSC=1;
  153.             GPIO_DIG=0X40;
  154.             break;  //显示-代表-
  155.         case 3:
  156.             LSC=1;
  157.             LSB=1;
  158.             LSC=1;
  159.             GPIO_DIG=0x76;
  160.             break;  //显示H代表*
  161.         case 4:
  162.             LSC=1;
  163.             LSB=1;
  164.             LSC=1;
  165.             GPIO_DIG=0X5e;
  166.             break;  //显示d代表/
  167.         }
  168.     }
  169.     else if(err==1)
  170.     {
  171.         for(n=0; n<5; n++)                //error
  172.         {
  173.             switch(n)
  174.             {
  175.             case 0:
  176.                 LSC=1;
  177.                 LSB=1;
  178.                 LSA=1;
  179.                 GPIO_DIG=0x70;
  180.                 break;
  181.             case 1:
  182.                 LSC=1;
  183.                 LSB=1;
  184.                 LSA=0;
  185.                 GPIO_DIG=0x3f;
  186.                 break;
  187.             case 2:
  188.                 LSC=1;
  189.                 LSB=0;
  190.                 LSA=1;
  191.                 GPIO_DIG=0x70;
  192.                 break;
  193.             case 3:
  194.                 LSC=1;
  195.                 LSB=0;
  196.                 LSA=0;
  197.                 GPIO_DIG=0x70;
  198.                 break;
  199.             case 4:
  200.                 LSC=0;
  201.                 LSB=1;
  202.                 LSA=1;
  203.                 GPIO_DIG=0x79;
  204.                 break;
  205.             }
  206.             delay_ms(4);
  207.             GPIO_DIG=0x00;
  208.         }
  209.     }
  210.     else if(Temp>9999999)        //over
  211.     {
  212.         for(n=0; n<4; n++)
  213.         {
  214.             switch(n)
  215.             {
  216.             case 0:
  217.                 LSC=1;
  218.                 LSB=1;
  219.                 LSA=1;
  220.                 GPIO_DIG=0x70;
  221.                 break;
  222.             case 1:
  223.                 LSC=1;
  224.                 LSB=1;
  225.                 LSA=0;
  226.                 GPIO_DIG=0x7b;
  227.                 break;
  228.             case 2:
  229.                 LSC=1;
  230.                 LSB=0;
  231.                 LSA=1;
  232.                 GPIO_DIG=0x3e;
  233.                 break;
  234.             case 3:
  235.                 LSC=1;
  236.                 LSB=0;
  237.                 LSA=0;
  238.                 GPIO_DIG=0x3f;
  239.                 break;
  240.             }
  241.             delay_ms(2);
  242.             GPIO_DIG=0x00;
  243.         }
  244.     }
  245.     else
  246.     {
  247.         if(minus==1)
  248.         {
  249.             GPIO_DIG=0x40;
  250.             LSC=0;
  251.             LSB=0;
  252.             LSA=0;
  253.             delay_ms(2);
  254.             GPIO_DIG=0x00;
  255.         }
  256.         if(Temp>999999)        //第7位
  257.         {
  258.             LSC=0;
  259.             LSB=0;
  260.             LSA=1;
  261.             GPIO_DIG=smg[wei[6]];
  262.             delay_ms(2);
  263.             GPIO_DIG=0x00;
  264.         }
  265.         if(Temp>99999)        //第6位
  266.         {
  267.             LSC=0;
  268.             LSB=1;
  269.             LSA=0;
  270.             GPIO_DIG=smg[wei[5]];
  271.             delay_ms(2);
  272.             GPIO_DIG=0x00;
  273.         }
  274.         if(Temp>9999)        //第5位
  275.         {
  276.             LSC=0;
  277.             LSB=1;
  278.             LSA=1;
  279.             GPIO_DIG=smg[wei[4]];
  280.             delay_ms(2);
  281.             GPIO_DIG=0x00;
  282.         }
  283.         if(Temp>999)        //第4位
  284.         {
  285.             LSC=1;
  286.             LSB=0;
  287.             LSA=0;
  288.             GPIO_DIG=smg[wei[3]];
  289.             delay_ms(2);
  290.             GPIO_DIG=0x00;
  291.         }

  292.         if(Temp>99||dian==2)        //第3位
  293.         {
  294.             LSC=1;
  295.             LSB=0;
  296.             LSA=1;
  297.             GPIO_DIG=smg[wei[2]];
  298.             if(dian==2)
  299.                 GPIO_DIG=0x80;
  300.             delay_ms(2);
  301.             GPIO_DIG=0x00;
  302.         }
  303.         if(Temp>9||dian==1)        //第2位
  304.         {
  305.             LSC=1;
  306.             LSB=1;
  307.             LSA=0;
  308.             GPIO_DIG=smg[wei[1]];
  309.             if(dian==1)
  310.                 GPIO_DIG=0x80;
  311.             delay_ms(2);
  312.             GPIO_DIG=0x00;
  313.         }

  314.         //第1位
  315.         {
  316.             LSC=1;
  317.             LSB=1;
  318.             LSA=1;
  319.             GPIO_DIG=smg[wei[0]];
  320.             delay_ms(2);
  321.             GPIO_DIG=0x00;
  322.         }
  323.     }
  324. }

  325. void count(uchar x)
  326. {
  327.     uchar XiaoShu[2];
  328.     long YuShu;
  329.     switch(x)
  330.     {
  331.     case 1:
  332.         Value3=Value1+Value2;
  333.         break;
  334.     case 2:
  335.         if(Value1>=Value2)
  336.             Value3=Value1-Value2;
  337.         else
  338.         {
  339.             minus=1;
  340.             Value3=Value2-Value1;
  341.         }
  342.         break;
  343.     case 3:
  344.         Value3=Value1*Value2;
  345.         break;
  346.     case 4:
  347.         if(Value2==0)   //error
  348.             err=1;
  349.         else
  350.         {
  351.             YuShu=(Value1*100)/Value2;
  352.             XiaoShu[0]=YuShu%10;                                 //小数点后第2位
  353.             XiaoShu[1]=YuShu/10%10;                        //小数点后第1位
  354.             if(XiaoShu[0]!=0)
  355.             {
  356.                 dian=2;
  357.                 Value3=(Value1*100)/Value2;
  358.             }
  359.             else if(XiaoShu[1]!=0)
  360.             {
  361.                 dian=1;
  362.                 Value3=(Value1*10)/Value2;
  363.             }
  364.             else
  365.             {
  366.                 dian=0;
  367.                 Value3=Value1/Value2;
  368.             }
  369.         }
  370.         break;
  371.     case 0:
  372.         break;
  373.     }
  374. }

  375. void main()
  376. {
  377.     while(1)
  378.     {
  379.         Keyscan();
  380.         if(x==0)    //运算符判断是否数字1跳出
  381.             display(Value1);
  382.         else if(0<x&&x<5)   //进入数字2
  383.         {
  384.             if(c==1)    //该显示运算符flag
  385.                 display(x);
  386.             else
  387.                 display(Value2);
  388.         }
  389.         else
  390.         {
  391.             if(err==1)
  392.                 display(err);
  393.             else
  394.                 display(Value3);
  395.         }
  396.     }
  397. }
复制代码

Keil工程文件51hei提供下载:
计算器4.0.7z (35.6 KB, 下载次数: 13)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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