找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3210|回复: 0
收起左侧

单片机计算器的Proteus仿真图和代码

[复制链接]
ID:531277 发表于 2019-5-20 09:50 | 显示全部楼层 |阅读模式
计算器Proteus仿真文件:
0.png 0.png

单片机源程序如下:
  1. #include"key16a.h"                                        //矩阵键盘识别
  2. #include"lcd1602.h"

  3. //16个按键的读入数据
  4. /*     p20   p21   P22   P23    p20   p21   P22   P23
  5.   P24   0    4      8     C      /     *     -     +
  6.   P25   1    5      9     D     =      9     6     3
  7.   p26   2    6      A     E      0     8     5     2
  8.   p27   3    7      B     F     clear  7     4     1

  9. */
  10. Uchar code keyval[16]={'/','=',0,'C','*',9,8,7,'-',6,5,4,'+',3,2,1,};
  11. Uchar data numb1[4],numb2[4],result[12];

  12. void Fclear()
  13. { Uchar i;
  14.         for(i=0;i<4;i++)
  15.         {        numb1[i]=0;
  16.                 numb2[i]=0;
  17.                
  18.         }
  19.     for(i=0;i<12;i++)
  20.     result[i]=' ';         
  21. }
  22. void main()
  23. {   Uchar i=0,j=0,tmp=0;
  24.         Uchar  oprat1=0,oprat2=0,opratflag=0;
  25.         Uint answer=0;  
  26.         Fclear();
  27.         //result[6]=result[7]=result[8]='.';
  28.         //result[9]=result[10]=result[11]=32;//' ';
  29.         /*
  30.         while(1)
  31.         {  tmp=key_scan();
  32.                 if(tmp!=0xff)
  33.                         P0=keyval[tmp];
  34.         //P0=keyval[key_scan()];
  35.         NOP;        }
  36.         while(1);
  37.         */
  38.         RstLcd();
  39.         ClrLcd();
  40. //        WriteString("234",0,0);
  41. //        WriteString("ASD",5,1);
  42.     while(1)
  43.         {        do{tmp=key_scan();}while(tmp==0xff);
  44.                 tmp=keyval[tmp];
  45.                         if(tmp=='C'){ClrLcd();break;}
  46.                         else
  47.                         {if(tmp!='=')  //输入对象判断及显示
  48.                                 {        if((tmp<10)&&(opratflag==0))
  49.                                         { numb1[i]=tmp;WriteChar(tmp+0x30,i+4,0);i++;}
  50.                                         else if (tmp>10)
  51.                                         {opratflag=tmp;WriteChar(tmp,7,0);}
  52.                                         else
  53.                                                 {numb2[j]=tmp;WriteChar(tmp+0x30,j+8,0);j++;}
  54.                                 }
  55.                      else
  56.                          {  
  57.                              switch(i)     //得到数1,数1各位的显示码在numb1[]中
  58.                                  {  case 1:        oprat1=numb1[0];
  59.                                                         numb1[0]+=0x30;numb1[1]=numb1[2]=' ';
  60.                                                         break;
  61.                                     case 2:
  62.                                                         oprat1=numb1[0]*10+numb1[1];
  63.                                                         numb1[0]+=0x30;numb1[1]+=0x30;
  64.                                                         numb1[2]=' ';break;
  65.                                         case 3:
  66.                                                         oprat1=numb1[0]*100+numb1[1]*10+numb1[2];
  67.                                                         numb1[0]+=0x30;numb1[1]+=0x30;
  68.                                                         numb1[2]+=0x30;
  69.                                                         break;                                 
  70.                                  }
  71.                                 switch(j)  //得到数2,数2各位的显示码在numb2[]中
  72.                                  {  case 1:        oprat2=numb2[0];
  73.                                                         numb2[0]+=0x30;numb2[1]=numb2[2]=' ';
  74.                                                         break;
  75.                                     case 2:
  76.                                                         oprat2=numb2[0]*10+numb2[1];
  77.                                                         numb2[0]+=0x30;numb2[1]+=0x30;
  78.                                                         numb2[2]=' '; break;
  79.                                         case 3:
  80.                                                         oprat2=numb2[0]*100+numb2[1]*10+numb2[2];
  81.                                                         numb2[0]+=0x30;numb2[1]+=0x30;
  82.                                                         numb2[2]+=0x30;
  83.                                                         break;                                 
  84.                                  }
  85.                  result[0]=' ';//32;
  86.                                  switch(opratflag)   //运算及余数处理
  87.                                  {  case '+':  
  88.                      answer=oprat1+oprat2;break;
  89.                                         case '-':
  90.                             if(oprat1<oprat2)
  91.                                 {    answer=oprat2-oprat1;
  92.                                      result[0]='-'; }
  93.                              else                                   
  94.                                 {answer=oprat1-oprat2;
  95.                                  }   
  96.                                 break;
  97.                                         case '*':  
  98.                         answer=oprat1*oprat2;break;
  99.                                         case '/':  
  100.                         answer=oprat1/oprat2;
  101.                                                 tmp=oprat1%oprat2;
  102.                                 if(tmp>=100) i=3;
  103.                                                         else if(tmp>9){i=2;}//result[9]=' ';}
  104.                                                         else if(tmp>0) {i=1;}//result[9]=' ';result[10]=' ';}         
  105.                             else break;
  106.                             result[6]= result[7]=result[8]='.';
  107.                             j=9;
  108.                             switch(i)
  109.                              {   case 3:result[j]=tmp/100+0x30;
  110.                                  case 2:result[j++]=(tmp/10)%10+0x30;
  111.                                  case 1:result[j]=tmp%10+0x30;
  112.                                         break;
  113.                             }
  114.                                 break;
  115.                                  }
  116.                                  
  117.                
  118.                  if(answer>=10000) i=5;
  119.                  else if (answer>=1000)i=4;
  120.                  else if (answer>=100)i=3;
  121.                  else if (answer>=10)i=2;            
  122.                  else i=1;
  123.                  j=1;
  124.                  switch(i)
  125.                      {  case 5:result[j++]=answer/10000+0x30;
  126. ……………………

  127. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
计算机.7z (6.73 MB, 下载次数: 24)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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