当前位置:   article > 正文

51单片机简单计算器实现(100行)附源码_51单片机计算器程序代码

51单片机计算器程序代码

 不引流,项目最后附上本项目百行源码!!

如果对你有帮助不妨点个赞!

本项目使用:51单片机矩阵键盘四位数码管

使用LCD显示的思路相差不大,由于是仿真,包容性比较强,所以还有很大优化空间

先上仿真图!

先上代码,看不太明白的接着往下看

  1. #include <REGX52.H> //程序核心:始终显示num,操作改变num
  2. void display(int num1); //显示函数
  3. void DelayXms(unsigned int x); //延时函数
  4. void keyScan(); //按键扫描
  5. void keyAdd(); //数字多位输入
  6. void pd(); //判断
  7. int n1, n2, n3, n4, numKey=10000, num=0, num0=0;//显示的个十百千位 键值,显示值,存储值1
  8. char fuhao='0',fuhao0='0'; //键入的符号值,存储的符号值
  9. unsigned char duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  10. void main(){
  11. while(1){
  12. keyScan(); //扫描键值
  13. pd(); //判断键值情况
  14. display(num); //显示函数
  15. }
  16. }
  17. void keyAdd(){ //实现键入多位数的效果
  18. if(numKey<10000){
  19. num=num*10+numKey;
  20. numKey=10000;
  21. }
  22. }
  23. void pd(){
  24. keyAdd(); //判断为数字,则为数字输入
  25. if(fuhao=='c'){ //清零
  26. num=0;
  27. num0=0;
  28. fuhao0='0';
  29. fuhao='0';
  30. }
  31. if(fuhao=='+'){ //加法
  32. fuhao0='+'; //将符号'+'存到变量fuhao0
  33. fuhao='0'; //符号清零
  34. num0=num; //将加数0存到变量num0
  35. num=0;
  36. }
  37. if(fuhao=='-'){ //减法
  38. fuhao0='-';
  39. fuhao='0';
  40. num0=num;
  41. num=0;
  42. }
  43. if(fuhao=='*'){ //乘法
  44. fuhao0='*';
  45. fuhao='0';
  46. num0=num;
  47. num=0;
  48. }
  49. if(fuhao=='/'){ //除法
  50. fuhao0='/';
  51. fuhao='0';
  52. num0=num;
  53. num=0;
  54. }
  55. if(fuhao=='='){ //检测到符号为等号,则进行运算
  56. if(fuhao0=='+')num=num0+num;
  57. else if(fuhao0=='-')num=num0-num;
  58. else if(fuhao0=='*')num=num0*num;
  59. else if(fuhao0=='/')num=num0/num;
  60. fuhao='0';
  61. num0=0;
  62. }
  63. }
  64. void keyScan(){
  65. P3=0xef;//1110 1111
  66. if(!P3_3){numKey=7;while(!P3_3);}if(!P3_2){numKey=8;while(!P3_2);}if(!P3_1){numKey=9;while(!P3_1);}if(!P3_0){fuhao='+';while(!P3_0);}
  67. P3=0xdf;
  68. if(!P3_3){numKey=4;while(!P3_3);}if(!P3_2){numKey=5;while(!P3_2);}if(!P3_1){numKey=6;while(!P3_1);}if(!P3_0){fuhao='-';while(!P3_0);}
  69. P3=0xbf;
  70. if(!P3_3){numKey=1;while(!P3_3);}if(!P3_2){numKey=2;while(!P3_2);}if(!P3_1){numKey=3;while(!P3_1);}if(!P3_0){fuhao='*';while(!P3_0);}
  71. P3=0x7f;
  72. if(!P3_3){fuhao='c';while(!P3_3);}if(!P3_2){numKey=0;while(!P3_2);}if(!P3_1){fuhao='=';while(!P3_1);}if(!P3_0){fuhao='/';while(!P3_0);}
  73. }
  74. void display(int num1){ //数码管动态显示
  75. n4=num1%10;
  76. n3=num1/10%10;
  77. n2=num1/100%10;
  78. n1=num1/1000%10;
  79. P2=0x01;
  80. P0=duan[n1];
  81. DelayXms(4);
  82. P2=0x02;
  83. P0=duan[n2];
  84. DelayXms(4);
  85. P2=0x04;
  86. P0=duan[n3];
  87. DelayXms(4);
  88. P2=0x08;
  89. P0=duan[n4];
  90. DelayXms(4);
  91. }
  92. void DelayXms(unsigned int x) //@12.000MHz
  93. { unsigned char i, j;
  94. while(x--)
  95. { i = 2;
  96. j = 239;
  97. do{while (--j);
  98. }while (--i);
  99. }
  100. }

        实际上有一定编程基础的同学借助代码里的注释应该都能看明白,单片机程序要考虑很多问题,例如数码管的显示需要调动cpu资源,所以在程序的设计上就不能面向过程,而是采用如上面代码所示对各种情况做判断。判断键值,改变不同的参数,通过各种处理函数达到计算器的目的。

        我个人比较菜,喜欢使用全局变量,个人感觉比较直观,喜欢用指针的大神轻喷。

        技术能力有限,欢迎各位在评论区交流指正,使用以下GitHub链接可以直接下载。欢迎大家点赞支持。GitHub - biexuhao/51-jisuanqi: 比较简短的一种实现加减乘除计算功能的计算器,基于51单片机,使用数码管显示

为了方便观看,下面将各个功能分开列出来:

头文件引入,函数声明,定义变量

  1. #include <REGX52.H> //程序核心:始终显示num,操作改变num
  2. void display(int num1); //显示函数
  3. void DelayXms(unsigned int x); //延时函数
  4. void keyScan(); //按键扫描
  5. void keyAdd(); //数字多位输入
  6. void pd(); //判断
  7. int n1, n2, n3, n4, numKey=10000, num=0, num0=0;//显示的个十百千位 键值,显示值,存储值1
  8. char fuhao='0',fuhao0='0'; //键入的符号值,存储的符号值
  9. unsigned char duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

主函数

  1. void main(){
  2. while(1){
  3. keyScan(); //扫描键值
  4. pd(); //判断键值情况
  5. display(num); //显示函数
  6. }
  7. }

多位数字的键入实现函数

  1. void keyAdd(){
  2. if(numKey<10000){
  3. num=num*10+numKey;
  4. numKey=10000;
  5. }
  6. }

键值判断函数

  1. void pd(){
  2. keyAdd(); //判断为数字,则为数字输入
  3. if(fuhao=='c'){ //清零
  4. num=0;
  5. num0=0;
  6. fuhao0='0';
  7. fuhao='0';
  8. }
  9. if(fuhao=='+'){ //加法
  10. fuhao0='+'; //将符号'+'存到变量fuhao0
  11. fuhao='0'; //符号清零
  12. num0=num; //将加数0存到变量num0
  13. num=0;
  14. }
  15. if(fuhao=='-'){ //减法
  16. fuhao0='-';
  17. fuhao='0';
  18. num0=num;
  19. num=0;
  20. }
  21. if(fuhao=='*'){ //乘法
  22. fuhao0='*';
  23. fuhao='0';
  24. num0=num;
  25. num=0;
  26. }
  27. if(fuhao=='/'){ //除法
  28. fuhao0='/';
  29. fuhao='0';
  30. num0=num;
  31. num=0;
  32. }
  33. if(fuhao=='='){ //检测到符号为等号,则进行运算
  34. if(fuhao0=='+')num=num0+num;
  35. else if(fuhao0=='-')num=num0-num;
  36. else if(fuhao0=='*')num=num0*num;
  37. else if(fuhao0=='/')num=num0/num;
  38. fuhao='0';
  39. num0=0;
  40. }
  41. }

矩阵键盘扫描函数

  1. void keyScan(){
  2. P3=0xef;//1110 1111
  3. if(!P3_3){numKey=7;while(!P3_3);}if(!P3_2){numKey=8;while(!P3_2);}if(!P3_1){numKey=9;while(!P3_1);}if(!P3_0){fuhao='+';while(!P3_0);}
  4. P3=0xdf;
  5. if(!P3_3){numKey=4;while(!P3_3);}if(!P3_2){numKey=5;while(!P3_2);}if(!P3_1){numKey=6;while(!P3_1);}if(!P3_0){fuhao='-';while(!P3_0);}
  6. P3=0xbf;
  7. if(!P3_3){numKey=1;while(!P3_3);}if(!P3_2){numKey=2;while(!P3_2);}if(!P3_1){numKey=3;while(!P3_1);}if(!P3_0){fuhao='*';while(!P3_0);}
  8. P3=0x7f;
  9. if(!P3_3){fuhao='c';while(!P3_3);}if(!P3_2){numKey=0;while(!P3_2);}if(!P3_1){fuhao='=';while(!P3_1);}if(!P3_0){fuhao='/';while(!P3_0);}
  10. }

数码管动态显示函数

  1. void display(int num1){
  2. n4=num1%10;
  3. n3=num1/10%10;
  4. n2=num1/100%10;
  5. n1=num1/1000%10;
  6. P2=0x01;
  7. P0=duan[n1];
  8. DelayXms(4);
  9. P2=0x02;
  10. P0=duan[n2];
  11. DelayXms(4);
  12. P2=0x04;
  13. P0=duan[n3];
  14. DelayXms(4);
  15. P2=0x08;
  16. P0=duan[n4];
  17. DelayXms(4);
  18. }

最后是延时函数

  1. void DelayXms(unsigned int x) //@12.000MHz
  2. { unsigned char i, j;
  3. while(x--)
  4. { i = 2;
  5. j = 239;
  6. do{while (--j);
  7. }while (--i);
  8. }
  9. }

      


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/759351?site
推荐阅读
相关标签
  

闽ICP备14008679号