找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Proteus仿真51简易计算器

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


单片机源程序如下:
  1. #include "reg52.h"
  2. typedef unsigned int uint;          
  3. typedef unsigned char uchar;

  4. sbit rw=P2^5;
  5. sbit rs=P2^6;
  6. sbit e=P2^7;
  7. //sbit led=P3^7;
  8. //sbit beep=P2^0;

  9. uint fuhao,flag,k,i,j,num;
  10. uchar disp[]="rorrE";
  11. uchar wel[]="    Welcome!";
  12. long a,b,c,x;

  13. void delay(long i)  //延时
  14. {
  15.         while(i--);
  16. }
  17. void lcdwrc(uint c) //设置LCD写命令
  18. {
  19.         delay(1000);
  20.         rs=0;
  21.         rw=0;
  22.         e=0;
  23.         P0=c;
  24.         e=1;
  25.         delay(1000);
  26.         e=0;
  27. }
  28. void lcdwrd(uint dat) //设置LCD写数据
  29. {
  30.         delay(1000);
  31.         rs=1;
  32.         rw=0;
  33.         e=0;
  34.         P0=dat;
  35.         e=1;
  36.         delay(1000);
  37.         e=0;
  38.         rs=0;
  39. }
  40. void lcdinit()          //初始化LCD
  41. {
  42.         delay(1500);
  43.         lcdwrc(0x38);
  44.         delay(500);
  45.         lcdwrc(0x38);
  46.         delay(500);
  47.         lcdwrc(0x38);
  48.         delay(500);
  49.         lcdwrc(0x38); //功能设定指令
  50.         lcdwrc(0x08);  //
  51.         lcdwrc(0x01); //清屏
  52.         lcdwrc(0x06);  //设置LCD显示
  53.         lcdwrc(0x0c); //显示开关控制指令
  54.     num=0;
  55.         fuhao=0;
  56.         flag=0;
  57.         a=0;
  58.         b=0;
  59.         c=0;
  60.         x=0;
  61.         k=0;
  62.         j=0;
  63. }

  64. void KeyDown()
  65. {
  66.     k=0;
  67.         P1=0x0f;
  68.         if(P1!=0x0f)
  69.         {
  70.                 delay(1000);
  71.                   if(P1!=0x0f)
  72.                 {
  73.                         P1=0x0f;
  74.                         switch(P1)
  75.                         {
  76.                                 case 0x07:
  77.                                 {
  78.                                         P1=0xf0;
  79.                                         switch(P1)
  80.                                        {
  81.                                      case 0x70: k=1; break;
  82.                                      case 0xb0: k=4; break;
  83.                                          case 0xd0: k=7; break;
  84.                                          case 0xe0: k=0; break;
  85.                                 }        
  86.                                     if(fuhao==0)
  87.                                      a=a*10+k;
  88.                                     else
  89.                                       b=b*10+k;       
  90.                              }
  91.                                  lcdwrd(0x30+k);
  92.                              while(P1!=0xf0);break;

  93.                     case 0x0b:
  94.                                          {
  95.                                            P1=0xf0;
  96.                                switch(P1)
  97.                                              {
  98.                                          case 0x70: num=2;k=2; break;
  99.                                      case 0xb0: num=6;k=5; break;
  100.                                      case 0xd0: num=10;k=8; break;
  101.                                          case 0xe0: num=14; break;
  102.                                        }  
  103.                                                  if(num!=14)
  104.                                                 {       
  105.                                              if(fuhao==0)
  106.                                                     a=a*10+k;
  107.                                                  else
  108.                                                    b=b*10+k;       
  109.                                                    lcdwrd(0x30+k);
  110.                                                 }       
  111.                                                  if(num==14)
  112.                                                 {         
  113.                                                   lcdwrc(0x01);        //清屏指令                       
  114.                                                  lcdinit();
  115.                                             }
  116.                                           }
  117.                                           while(P1!=0xf0); break;

  118.                                  case 0x0d:
  119.                                      {
  120.                                                  P1=0xf0;
  121.                                     switch(P1)
  122.                                        {
  123.                                      case 0x70: num=3;  k=3;  break;
  124.                                      case 0xb0: num=7;  k=6;  break;
  125.                                      case 0xd0: num=11; k=9;  break;
  126.                                      case 0xe0: num=15;       break;
  127.                                     }       
  128.                                                 if(num!=15)
  129.                                             {       
  130.                                               if(fuhao==0)
  131.                                                    a=a*10+k;
  132.                                                   else
  133.                                                   b=b*10+k;       
  134.                                                   lcdwrd(0x30+k);
  135.                                              }
  136.                                                  if(num==15)
  137.                                                 {
  138.                                                     switch(flag)
  139.                                                         {
  140.                                                                 case 1:
  141.                                                                 {
  142.                                                                  c=a+b;
  143.                                                                  lcdwrc(0x4f+0x80);
  144.                                                      lcdwrc(0x04);
  145.                                                                  if(c==0)
  146.                                                                  lcdwrd(0x30);
  147.                                                              while(c!=0)         
  148.                                                      {
  149.                                                                    lcdwrd(0x30+c%10);
  150.                                                             c=c/10;
  151.                                                          }
  152.                                                                    lcdwrd(0x3d);
  153.                                                                    }break;

  154.                                                                 case 2:
  155.                                                                 {
  156.                                                                   if(a>b)
  157.                                                                c=a-b;
  158.                                                           else
  159.                                                                c=b-a;

  160.                                                                   lcdwrc(0x4f+0x80);
  161.                                               lcdwrc(0x04);

  162.                                                                   if(c==0)
  163.                                                                    lcdwrd(0x30);

  164.                                                                   while(c!=0)
  165.                                                       {
  166.                                                                    lcdwrd(0x30+c%10);
  167.                                                                    c=c/10;
  168.                                                              }
  169.                                                                if(a<b)
  170.                                                                          lcdwrd(0x2d);

  171.                                                         lcdwrd(0x3d);
  172.                                                                  }break;

  173.                                                              case 3:
  174.                                                             {
  175.                                                                       c=a*b;
  176.                                                                     lcdwrc(0x4f+0x80);
  177.                                                 lcdwrc(0x04);
  178.                                                                         if(c==0)
  179.                                                                         lcdwrd(0x30);
  180.                                                              while(c!=0)         
  181.                                                                         {                                                                    
  182.                                                               lcdwrd(0x30+c%10);
  183.                                                        c=c/10;
  184.                                                             }
  185.                                                                  lcdwrd(0x3d);
  186.                                                                   }    break;

  187.                                                                 case 4:       
  188.                                                                 {       
  189.                                                                     if(b==0)
  190.                                                                         {
  191.                                                                             lcdwrc(0x4f+0x80);
  192.                                                                  lcdwrc(0x04);
  193.                                                                             for(i=0;i<5;i++)
  194.                                                                         lcdwrd(disp[i]);
  195.                                                                   }
  196.                                                                         else
  197.                                                                      {       
  198.                                                                            c=(long)(((float)a/b)*10000);
  199.                                                                    x=c;
  200.                                                                             lcdwrc(0x4f+0x80);
  201.                                                                 lcdwrc(0x04);
  202.                                                                while(c!=0)         //一位一位显示
  203.                                                               {
  204.                                                                     k++;
  205.                                                                     lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
  206.                                                                       c=c/10;//取前面的结果数据
  207.                                                                          if(x>0&&x<=9)
  208.                                                                     {
  209.                                                                               if(k==1)
  210.                                                                      {       
  211.                                                                                lcdwrd(0x30);
  212.                                                                            lcdwrd(0x30);
  213.                                                                        lcdwrd(0x30);
  214.                                                                            lcdwrd(0x2e);
  215.                                                                              k=0;
  216.                                                                         }
  217.                                                                     }
  218.                                                                      if(x>9&&x<=99)
  219.                                                                    {       
  220.                                                                               if(k==2)
  221.                                                                      {       
  222.                                                                                    lcdwrd(0x30);
  223.                                                                        lcdwrd(0x30);
  224.                                                                             lcdwrd(0x2e);
  225.                                                                            k=0;
  226.                                                                     }
  227.                                                                    }
  228.                                                                     if(x>99&&x<=999)
  229.                                                                    {
  230.                                                                              if(k==3)
  231.                                                                 {
  232.                                                                        lcdwrd(0x30);
  233.                                                                        lcdwrd(0x2e);
  234.                                                                            k=0;
  235.                                                                     }       
  236.                                                                    }
  237.                                                                        else
  238.                                                                   if(k==4)
  239.                                                                   {
  240.                                                                          lcdwrd(0x2e);
  241.                                                                          k=0;
  242.                                                               }               
  243.                                                                 }
  244.                                    if(x<10000)
  245.                                                                                 lcdwrd(0x30);
  246.                                                                 lcdwrd(0x3d);          
  247.                                                      }
  248.                                                    }        break;
  249.                                                    }
  250.                                                 }
  251.                                    }while(P1!=0xf0);break;
  252.                                    case 0x0e:
  253.                                          {       
  254.                                              fuhao=1;
  255.                                                 P1=0xf0;
  256.                                     switch(P1)
  257.                                       {
  258.                                             case 0x70: flag=1;lcdwrd(0x2b);   break;
  259.                                             case 0xb0:flag=2; lcdwrd(0x2d);  break;
  260.                                              case 0xd0: flag=3;lcdwrd(0x2a);  break;
  261.                                             case 0xe0: flag=4; lcdwrd(0x2f); break;
  262.                                     }         
  263.                         }  while(P1!=0xf0);  break;
  264.                         }
  265.                  }
  266.          }
  267. }
  268.             
  269. void main()
  270. {       
  271.     uint x;
  272.         lcdinit();
  273.         for(x=0;x<12;x++)
  274.         lcdwrd(wel[x]);
  275.         delay(50000);
  276.         lcdwrc(0x01);
  277.         while(1)               
  278.            KeyDown();
  279. }
复制代码

所有资料51hei提供下载:
51简易计算器.zip (60.71 KB, 下载次数: 59)



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

使用道具 举报

沙发
ID:423139 发表于 2019-5-8 15:23
为什么在下载不了,老是下载失败

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

本版积分规则

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

Powered by 单片机教程网

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