找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1953|回复: 4
收起左侧

关于51单片机计算器实现连续计算功能如何实现?

[复制链接]
ID:892737 发表于 2021-10-6 16:30 | 显示全部楼层 |阅读模式
    刚学习51单片机一段时间,写了一个计算器,请问该怎么实现计算器的连续计算功能呢,现在只能进行正常的正整数运算。

单片机源程序如下:
  1. #include <reg52.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. unsigned long int count = 0, sum = 0;
  5. unsigned char symbol;   //加减乘除
  6. unsigned  char KeyValue;//按下键的序号
  7. unsigned  char KeyState;//按键按下标志位,按下为1,松开为0

  8. #define GPIO_KEY P1

  9. sbit LSA = P2 ^ 2;
  10. sbit LSB = P2 ^ 3;
  11. sbit LSC = P2 ^ 4;

  12. u16 a, point;
  13. u8 DisplayData[8];
  14. u8 code smgduan[11] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00 };


  15. void delay();      //延时
  16. void KeyDown();    //按键扫描
  17. void DigDisplay(); //数码管显示
  18. void conversion(); //计算过程

  19. void main()
  20. {
  21.     while (1)
  22.     {
  23.         KeyDown();
  24.         if (KeyState == 1)
  25.         {
  26.             DisplayData[7] = DisplayData[6];
  27.             DisplayData[6] = DisplayData[5];
  28.             DisplayData[5] = DisplayData[4];
  29.             DisplayData[4] = DisplayData[3];
  30.             DisplayData[3] = DisplayData[2];
  31.             DisplayData[2] = DisplayData[1];
  32.             DisplayData[1] = DisplayData[0];
  33.             DisplayData[0] = smgduan[KeyValue];
  34.             KeyState = 0;
  35.         }
  36.         DigDisplay();
  37.     }
  38. }

  39. void KeyDown()        //按键扫描
  40. {
  41.     GPIO_KEY = 0x0f;
  42.     if (GPIO_KEY != 0x0f)
  43.     {
  44.         delay();
  45.         if (GPIO_KEY != 0x0f)
  46.         {
  47.             KeyState = 1;              //有按键按下
  48.             GPIO_KEY = 0x0F;           //测试列
  49.             switch (GPIO_KEY)
  50.             {
  51.             case(0X07):
  52.                 KeyValue = 1;
  53.                 break;
  54.             case(0X0b):
  55.                 KeyValue = 2;
  56.                 break;
  57.             case(0X0d):
  58.                 KeyValue = 3;
  59.                 break;
  60.             case(0X0e):
  61.                 KeyValue = 4;
  62.                 break;
  63.             }
  64.             GPIO_KEY = 0XF0;           //测试行
  65.             delay();
  66.             switch (GPIO_KEY)
  67.             {
  68.             case(0X70):
  69.                 KeyValue = KeyValue;
  70.                 break;
  71.             case(0Xb0):
  72.                 KeyValue = KeyValue + 4;
  73.                 break;
  74.             case(0Xd0):
  75.                 KeyValue = KeyValue + 8;
  76.                 break;
  77.             case(0Xe0):
  78.                 KeyValue = KeyValue + 12;
  79.                 break;
  80.             }
  81.             while ((a < 500) && (GPIO_KEY != 0xf0))//按键松手检测
  82.             {
  83.                 delay();
  84.                 a++;
  85.             }
  86.             a = 0;
  87.             conversion();
  88.         }
  89.     }
  90. }

  91. void conversion()
  92. {
  93.     unsigned char KeyValue_count;
  94.     if (KeyValue % 4 != 0) //else进入加减乘除
  95.     {
  96.         if (KeyValue != 15) //  15是等于号
  97.         {
  98.             switch (KeyValue)
  99.             {
  100.             case 1:
  101.             case 2:
  102.             case 3:
  103.                 KeyValue_count = KeyValue;
  104.                 break;
  105.             case 5:
  106.             case 6:
  107.             case 7:
  108.                 KeyValue_count = KeyValue - 1;
  109.                 break;
  110.             case 9:
  111.             case 10:
  112.             case 11:
  113.                 KeyValue_count = KeyValue - 2;
  114.                 break;
  115.             case 13:
  116.             {
  117.                 count = 0;    //count = 0; sum = 0;KeyValue_count = 0;  清零
  118.                 sum = 0;
  119.                 KeyValue_count = 0;
  120.                 break;
  121.             }
  122.             case 14:
  123.                 KeyValue_count = 0;
  124.                 break;
  125.             default:
  126.                 break;
  127.             }
  128.             count = count * 10 + KeyValue_count;    //往前进一位
  129.         }
  130.         else    //等于结果
  131.         {
  132.             if (symbol == '+')
  133.                 sum = sum + count;
  134.             if (symbol == '-')
  135.                 sum = sum - count;
  136.             if (symbol == '*')
  137.                 sum = sum * count;
  138.             if (symbol == '/')
  139.                 sum = sum / count;
  140.             count = sum;
  141.         }

  142.     }
  143.     else
  144.     {
  145.         switch (KeyValue)
  146.         {
  147.         case 4:
  148.             symbol = '+';

  149.             break;
  150.         case 8:
  151.             symbol = '-';

  152.             break;
  153.         case 12:
  154.             symbol = '*';

  155.             break;
  156.         case 16:
  157.             symbol = '/';

  158.             break;
  159.         }
  160.         sum = count;
  161.         count = 0;
  162.     }
  163. }

  164. void DigDisplay()
  165. {
  166.     unsigned char j;
  167.     unsigned int i;
  168.     for (j = 0; j < 8; j++)
  169.     {
  170.         switch (j)
  171.         {
  172.         case(0):
  173.             LSA = 0;
  174.             LSB = 0;
  175.             LSC = 0;
  176.             P0 = smgduan[count % 10];
  177.             break;
  178.         case(1):
  179.             LSA = 1;
  180.             LSB = 0;
  181.             LSC = 0;
  182.             if (count >= 10)
  183.                 P0 = smgduan[count % 100 / 10];
  184.             else
  185.                 P0 = 0x00;
  186.             break;
  187.         case(2):
  188.             LSA = 0;
  189.             LSB = 1;
  190.             LSC = 0;
  191.             if (count >= 100)
  192.                 P0 = smgduan[count % 1000 / 100];
  193.             else
  194.                 P0 = 0x00;
  195.             break;
  196.         case(3):
  197.             LSA = 1;
  198.             LSB = 1;
  199.             LSC = 0;
  200.             if (count >= 1000)
  201.                 P0 = smgduan[count % 10000 / 1000];
  202.             else
  203.                 P0 = 0x00;
  204.             break;
  205.         case(4):
  206.             LSA = 0;
  207.             LSB = 0;
  208.             LSC = 1;
  209.             if (count >= 10000)
  210.                 P0 = smgduan[count % 100000 / 10000];
  211.             else
  212.                 P0 = 0x00;
  213.             break;
  214.         case(5):
  215.             LSA = 1;
  216.             LSB = 0;
  217.             LSC = 1;
  218.             if (count >= 100000)
  219.                 P0 = smgduan[count % 1000000 / 100000];
  220.             else
  221.                 P0 = 0x00;
  222.             break;
  223.         case(6):
  224.             LSA = 0;
  225.             LSB = 1;
  226.             LSC = 1;
  227.             if (count >= 1000000)
  228.                 P0 = smgduan[count % 10000000 / 1000000];
  229.             else
  230.                 P0 = 0x00;
  231.             break;
  232.         case(7):
  233.             LSA = 1;
  234.             LSB = 1;
  235.             LSC = 1;
  236.             if (count >= 10000000)
  237.                 P0 = smgduan[count % 100000000 / 10000000];
  238.             else
  239.                 P0 = 0x00;
  240.             break;
  241.         }
  242.         i = 10;
  243.         while (i--);
  244.         P0 = 0x00;
  245.     }
  246. }

  247. void delay()    //延时10ms
  248. {
  249.     unsigned char a, b, c;
  250.     for (c = 1; c > 0; c--)
  251.         for (b = 38; b > 0; b--)
  252.             for (a = 130; a > 0; a--);
  253. }
复制代码

回复

使用道具 举报

ID:881715 发表于 2021-10-6 17:47 来自手机 | 显示全部楼层
你是想进行小数运算,还是其他特殊功能,没明白什么是计算器的连续计算功能,干什么事用什么变量,这是必需的也是首先应该做的
回复

使用道具 举报

ID:332444 发表于 2021-10-6 17:56 | 显示全部楼层
回复

使用道具 举报

ID:892737 发表于 2021-10-6 19:12 | 显示全部楼层
创造生活 发表于 2021-10-6 17:47
你是想进行小数运算,还是其他特殊功能,没明白什么是计算器的连续计算功能,干什么事用什么变量,这是必需 ...

就想要单纯的进行正整数连续计算功能,例如按了1之后按+,再按1,再按+,数码管可以显示2,再按1,再按+可以显示三这种
回复

使用道具 举报

ID:892737 发表于 2021-10-6 19:13 | 显示全部楼层
xianfajushi 发表于 2021-10-6 17:56
https://blog.csdn.net/xianfajushi/article/details/80885105?ops_request_misc=%257B%2522request%255Fid ...

好的好的,我看看,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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