找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC89C51单片机的加减乘除计算器仿真源程序

[复制链接]
跳转到指定楼层
楼主
ID:851585 发表于 2020-12-8 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 了解@ 于 2020-12-9 00:28 编辑

        计算器五位数以内+,-,*,/        能识别优先级运算符         
        删除一个数或一个运算符
        lcd1602显示
     矩阵按键

程序proteus仿真原理图:


仿真代码:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P2^0;//指令0,数据1
  5. sbit rw=P2^1;//读0,写1,引脚
  6. sbit lcden=P2^2;//使能端
  7. uchar temp,num,flag,i,j,k,n,m,aa[10]={0},bb[11]={0};
  8. uint sum[20]={0},count;
  9. /**********************************************
  10.     延时函数  ms
  11. *********************************************/        
  12. void delayms(uint t)
  13. {
  14.     uint x,y;
  15.         for(x=t;x>0;x--)
  16.         for(y=110;y>0;y--);
  17. }
  18. /**********************************************
  19.     1602指令,数据,初始化
  20. *********************************************/
  21. void write_1602com(uchar com)
  22. {
  23.     P0=com;
  24.         rs=0;//指令
  25.         rw=0;//写
  26.         lcden=0;
  27.         delayms(20);
  28.         lcden=1;
  29.         delayms(20);
  30.         lcden=0;
  31. }
  32. void write_1602date(uchar date)
  33. {
  34.     P0=date;
  35.         rs=1;//数据
  36.         rw=0;//写
  37.         lcden=0;
  38.         delayms(20);
  39.         lcden=1;
  40.         delayms(20);
  41.         lcden=0;
  42. }
  43. void init_lcd1602()
  44. {
  45.         write_1602com(0x38);//选择16x2显示,5x7点阵
  46.         delayms(20);
  47.         write_1602com(0x0f);//开显示,开光标,光标闪烁
  48.         delayms(20);
  49.         write_1602com(0x06);//读或写后,指针加一,光标加一
  50.         delayms(20);
  51.         write_1602com(0x01);//清屏
  52.         delayms(20);
  53. }
  54. /*****************************************
  55.         检测按键并输出
  56. ******************************************/
  57. uchar keyscan()                           
  58. {
  59.         P3=0xfe;
  60.         temp=P3;
  61.         while(temp!=0xfe)
  62.         {
  63.                 delayms(5);
  64.                 temp=P3;
  65.                 while(temp!=0xfe)
  66.                 {
  67.                         switch(temp)
  68.                         {
  69.                                 case 0xee:num=7;
  70.                                         break;
  71.                                 case 0xde:num=8;
  72.                                         break;
  73.                                 case 0xbe:num=9;
  74.                                         break;
  75.                                 case 0x7e:num='/';
  76.                                         break;
  77.                         }
  78.                         while(temp!=0xfe)
  79.                         {
  80.                                 flag=1;
  81.                                 temp=P3;
  82.                         }
  83.                 }
  84.         }
  85.         P3=0xfd;
  86.         temp=P3;
  87.         while(temp!=0xfd)
  88.         {
  89.                 delayms(5);
  90.                 temp=P3;
  91.                 while(temp!=0xfd)
  92.                 {
  93.                         switch(temp)
  94.                         {
  95.                                 case 0xed:num=4;
  96.                                         break;
  97.                                 case 0xdd:num=5;
  98.                                         break;
  99.                                 case 0xbd:num=6;
  100.                                         break;
  101.                                 case 0x7d:num='*';
  102.                                         break;
  103.                         }
  104.                         while(temp!=0xfd)
  105.                         {
  106.                                 flag=1;
  107.                                 temp=P3;
  108.                         }
  109.                 }
  110.         }
  111.         
  112.         P3=0xfb;
  113.         temp=P3;
  114.         while(temp!=0xfb)
  115.         {
  116.                 delayms(5);
  117.                 temp=P3;
  118.                 while(temp!=0xfb)
  119.                 {
  120.                         switch(temp)
  121.                         {
  122.                                 case 0xeb:num=1;
  123.                                         break;
  124.                                 case 0xdb:num=2;
  125.                                         break;
  126.                                 case 0xbb:num=3;
  127.                                         break;
  128.                                 case 0x7b:num='-';
  129.                                         break;
  130.                         }
  131.                         while(temp!=0xfb)
  132.                         {
  133.                                 flag=1;
  134.                                 temp=P3;
  135.                         }
  136.                 }
  137.         }
  138.         P3=0xf7;
  139.         temp=P3;
  140.         while(temp!=0xf7)
  141.         {
  142.                 delayms(5);
  143.                 temp=P3;
  144.                 while(temp!=0xf7)
  145.                 {
  146.                         switch(temp)
  147.                         {
  148.                                 case 0xe7:num='c';
  149.                                         break;
  150.                                 case 0xd7:num=0;
  151.                                         break;
  152.                                 case 0xb7:num='=';
  153.                                         break;
  154.                                 case 0x77:num='+';
  155.                                         break;
  156.                         }
  157.                         while(temp!=0xf7)
  158.                         {
  159.                                 flag=1;
  160.                                 temp=P3;
  161.                         }
  162.                 }
  163.         }
  164.         return num;
  165. }
  166. /*********************************************
  167.         将逐个输入数 aa[] 转化为整数
  168. *********************************************/
  169. void zuan_shu()                                   
  170. {
  171.          switch(n)
  172.         {
  173.                 case 0:sum[j++]=0;break;
  174.                 case 1:sum[j++]=aa[0];break;
  175.                 case 2:sum[j++]=aa[0]*10+aa[1];break;
  176.                 case 3:sum[j++]=aa[0]*100+aa[1]*10+aa[2];break;
  177.                 case 4:sum[j++]=aa[0]*1000+aa[1]*100+aa[2]*10+aa[3];break;
  178. /*                case 5:sum[j++]=aa[0]*10000+aa[1]*1000+aa[2]*100+aa[3]*10+aa[4];break;
  179.                 case 6:sum[j++]=aa[0]*100000+aa[1]*10000+aa[2]*1000+aa[3]*100+aa[4]*10+aa[5];break;
  180.                 case 7:sum[j++]=aa[0]*1000000+aa[1]*100000+aa[2]*10000+aa[3]*1000+aa[4]*100+aa[5]*10+aa[6];break;
  181.                 case 8:sum[j++]=aa[0]*10000000+aa[1]*1000000+aa[2]*100000+aa[3]*10000+aa[4]*1000+aa[5]*100+aa[6]*10+aa[7];break;
  182. */               
  183.         }                                
  184. }
  185. /****************************************************
  186.         液晶显示函数
  187. ******************************************************/
  188. void lcd1602_display(uint count)                                   
  189. {
  190.          uchar a,b,c,d,e;  //f,g,h;
  191.         a=count%10;
  192.         b=count/10%10;
  193.         c=count/100%10;
  194.         d=count/1000%10;
  195.         e=count/10000%10;
  196. /*        f=count/100000%10;
  197.         g=count/1000000%10;
  198.         h=count/10000000%10;


  199.         write_date(0x30+h);
  200.         write_date(0x30+g);
  201.         write_date(0x30+f);
  202. */
  203.         if(e!=0)
  204.         write_1602date(0x30+e);
  205.         if((e==0&&d!=0)||e!=0)
  206.         write_1602date(0x30+d);
  207.         if((e==0&&d==0&&c!=0)||e!=0||d!=0)
  208.         write_1602date(0x30+c);
  209.         if((e==0&&d==0&&c==0&&b!=0)||e!=0||d!=0||c!=0)
  210.         write_1602date(0x30+b);
  211.         write_1602date(0x30+a);        
  212. }
  213. /*************************************************
  214.         运算结果函数并保存至   sum[k]
  215. **************************************************/
  216. void yunsuan()                                                   
  217. {

  218.          uchar m;
  219.      for(k=0;bb[k]!=0&&k<10;k++)                                  //先找出高级运算符运算
  220.         {
  221.                 if(bb[k]=='*')
  222.                 {
  223.                         sum[k+1]=sum[k]*sum[k+1];
  224.                         sum[k]='N';
  225.                 }
  226.                 if(bb[k]=='/')
  227.                 {
  228.                         sum[k+1]=sum[k]/sum[k+1];
  229.                         sum[k]='N';
  230.                 }
  231.         }
  232.         for(k=0;bb[k]!=0&&k<10;k++)
  233.         {
  234.                  if(bb[k]=='+')
  235.                 {
  236.                         for(m=1;sum[k+m]=='N';)
  237.                         {
  238.                                  m++;        
  239.                         }
  240.                         sum[k+m]=sum[k]+sum[k+m];
  241.                 }
  242.                 if(bb[k]=='-')
  243.                 {
  244.                         for(m=1;sum[k+m]=='N';)
  245.                         {
  246.                                  m++;        
  247.                         }
  248.                         sum[k+m]=sum[k]-sum[k+m];
  249.                 }
  250.         }
  251. }
  252. /*************************************************  
  253.         main函数
  254. ***************************************************/
  255. void main()
  256. {
  257.     init_lcd1602();
  258.         while(1)
  259.         {         
  260.             flag=0;
  261.                  keyscan();
  262.                 if(flag!=0)
  263.                 {
  264.                         if(num>=0&&num<=9)


  265.                         {
  266.                                  aa[i++]=num;
  267.                                 write_1602date(0x30+num);
  268.                                 n++;
  269.                         }
  270.                         if(num=='+')
  271.                         {
  272.                                 write_1602date(0x20+11);//1602   '+'符
  273.                                 bb[k++]=num;
  274.                                 zuan_shu();
  275.                                 for(i=0;i<n;i++)
  276.                                 aa[i]=0;[/i][i]
  277.                                 i=0;
  278.                                 n=0;
  279.                         }
  280.                         if(num=='-')
  281.                         {
  282.                                 write_1602date(0x20+13);//1602   '-'符
  283.                                 bb[k++]=num;
  284.                                 zuan_shu();
  285.                                 for(i=0;i<n;i++)
  286.                                 aa[i]=0;[/i][i]
  287.                                 i=0;
  288.                                 n=0;
  289.                         }
  290.                         if(num=='*')
  291.                         {
  292.                                 write_1602date(0x20+10);//1602   '*'符
  293.                                 bb[k++]=num;
  294.                                 zuan_shu();
  295.                                 for(i=0;i<n;i++)
  296.                                 aa[i]=0;[/i][i]
  297.                                 i=0;
  298.                                 n=0;
  299.                         }
  300.                         if(num=='/')
  301.                         {
  302.                                 write_1602date(0xf0+13);//1602   '/'符
  303.                                 bb[k++]=num;
  304.                                 zuan_shu();
  305.                                 for(i=0;i<n;i++)
  306.                                 aa[i]=0;[/i][i]
  307.                                 i=0;
  308.                                 n=0;
  309.                         }
  310.                         if(num=='c'&&m==0)                                 //删除一个数或一个运算符
  311.                         {
  312.                                 write_1602com(0x04);//读或写后,指针减一,光标减一
  313.                                 write_1602date(' ');//1602   空符                        
  314.                                 write_1602com(0x06);//读或写后,指针加一,光标加一
  315.                                 if(n!=0)
  316.                                 {
  317.                                          n--;
  318.                                         aa[--i]=0;
  319.                                 }
  320.                                 else
  321.                                 {
  322.                                          bb[--k]=0;
  323.                                 }
  324.                         }
  325.                         if(num=='=')
  326.                         {
  327.                                 m=1;
  328.                                 write_1602com(0xc0);
  329.                                 write_1602date(0x30+13);//1602   '='符
  330.                                 zuan_shu();
  331.                                 yunsuan();
  332.                                 count=sum[k];
  333.                                 lcd1602_display(count);
  334.                                 write_1602com(0x0c);
  335.                         }        
  336.                 }        
  337.         }
  338. }
复制代码

全部资料51hei下载地址:
计算器.zip (128.74 KB, 下载次数: 70)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:851585 发表于 2020-12-9 00:26 | 只看该作者
因文章限制,全部资料在下面压缩包中........
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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