单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

矩阵键盘+液晶 制作的简易单片机计算器

[复制链接]
跳转到指定楼层
楼主
单片机计算器仿真图:

源代码:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit leden=P2^7;
  5. sbit rs=P2^5;
  6. sbit wr=P2^6;
  7. //sbit busy=P0^7;
  8. uchar i,j,num,num_1,temp;
  9. long a,b, c;
  10. float a_c,b_c;
  11. uchar flag,fuhao;
  12. uchar code table[]={7,8,9,0,
  13.                     4,5,6,0,
  14.                                         1,2,3,0};
  15. uchar code table1[]={7,8,9,0x2f-0x30,
  16.                      4,5,6,0x2a-0x30,
  17.                                          1,2,3,0x2d-0x30,
  18.                                          0x01-0x30,0,0x3d-0x30,0x2b-0x30};
  19. void delay(uchar n)
  20. {
  21. uchar i,j;
  22. for(i=n;i>0;i--)
  23.     for(j=200;j>0;j--) ;
  24. }
  25. /*
  26. void check()
  27. {
  28. do{P0=0xff;
  29.     rs=0;wr=1;leden=0;delay(5);leden=1;}while(busy==1);

  30. }
  31. */
  32. void write(uint w)
  33. {
  34.    rs=0;
  35.    wr=0;
  36.    leden=0;
  37.    P0=w;
  38.    leden=1;
  39.    delay(10);//check();
  40.    leden=0;

  41. }
  42. void write_data(uint q)
  43. {

  44.    wr=0;
  45.    leden=0;
  46.    P0=q;
  47.    leden=1;
  48.      delay(10);
  49.    leden=0;

  50. }
  51. void init()
  52. {
  53.           num=1;
  54.    leden=1;
  55.    write(0x38);
  56.    write(0x08);
  57.    write(0x01);
  58.    write(0x06);
  59.    write(0x0f);
  60.    num_1=0;
  61.    i=0;j=0;a=0;b=0;c=0;flag=0;fuhao=0;

  62. }

  63. void keyscan()
  64. {
  65.    P1=0Xfe;
  66.    if(P1!=0xfe)
  67.    {
  68.     delay(10);
  69.         if(P1!=0xfe)
  70.         {
  71.           temp=P1&0xf0;
  72.           switch(temp)
  73.             {
  74.                 case 0xe0:num=0;break;
  75.                 case 0xd0:num=1;break;
  76.                 case 0xb0:num=2;break;
  77.                 case 0x70:num=3;break;
  78.                 }
  79.          }
  80.         while(P1!=0xfe);
  81.         if(num==0||num==2||num==1)         
  82.         {
  83.           if(j!=0)
  84.           {
  85.             write(0x01);
  86.                 j=0;
  87.           }
  88.           if(flag==0)
  89.           {
  90.             a=a*10+table[num];
  91.           }
  92.           else
  93.            {
  94.              b=b*10+table[num];
  95.            }
  96.          }
  97.          else
  98.          {
  99.            flag=1;
  100.            fuhao=4;//????;
  101.          }
  102.          i=table1[num];
  103.          write_data(0x30+i);
  104.         }

  105.           P1=0xfd;
  106.    if(P1!=0xfd)
  107.    {
  108.     delay(10);
  109.         if(P1!=0xfd)
  110.         {
  111.           temp=P1&0xf0;
  112.           switch(temp)
  113.             {
  114.                 case 0xe0:num=4;break;
  115.                 case 0xd0:num=5;break;
  116.                 case 0xb0:num=6;break;
  117.                 case 0x70:num=7;break;
  118.                 }
  119.          }
  120.         while(P1!=0xfd);
  121.         if(num==4||num==5||num==6)
  122.         {
  123.          if(j!=0)
  124.           {
  125.             write(0x01);
  126.                 j=0;
  127.           }
  128.           if(flag==0)
  129.           {
  130.             a=a*10+table[num];
  131.           }
  132.           else
  133.            {
  134.              b=b*10+table[num];
  135.            }
  136.          }
  137.          else
  138.          {
  139.            flag=1;
  140.            fuhao=3;//????;
  141.          }
  142.          i=table1[num];
  143.          write_data(0x30+i);
  144.    }

  145.    P1=0xfb;
  146.   if(P1!=0xfb)
  147.    {
  148.     delay(10);
  149.         if(P1!=0xfb)
  150.         {
  151.           temp=P1&0xf0;
  152.           switch(temp)
  153.             {
  154.                 case 0xe0:num=8;break;
  155.                 case 0xd0:num=9;break;
  156.                 case 0xb0:num=10;break;
  157.                 case 0x70:num=11;break;
  158.                 }
  159.          }
  160.         while(P1!=0xfb);
  161.         if(num==8||num==9||num==10)
  162.         {
  163.          if(j!=0)
  164.           {
  165.             write(0x01);
  166.                 j=0;
  167.           }
  168.           if(flag==0)
  169.           {
  170.             a=a*10+table[num];
  171.           }
  172.           else
  173.            {
  174.              b=b*10+table[num];
  175.            }
  176.          }
  177.          else if(num==11)
  178.           {
  179.            flag=1;
  180.            fuhao=2;//jian???;
  181.            }
  182.          i=table1[num];
  183.          write_data(0x30+i);
  184.    }

  185.         P1=0xf7;
  186.     if(P1!=0xf7)
  187.    {
  188.     delay(10);
  189.         if(P1!=0xf7)
  190.         {
  191.           temp=P1&0xf0;
  192.           switch(temp)
  193.             {
  194.                 case 0xe0:num=12;break;
  195.                 case 0xd0:num=13;break;
  196.                 case 0xb0:num=14;break;
  197.                 case 0x70:num=15;break;
  198.                 }
  199.          }
  200.         while(P1!=0xf7);



  201.    switch(num)
  202.    {
  203.      case 12:{write(0x01);a=0;b=0;flag=0;fuhao=0;}break;
  204.          case 13:
  205.                 {
  206.                            if(flag==0)
  207.                              {a=a/10;write_data(0x30);}
  208.                            else if(flag==1)
  209.                              {b=b*10;write_data(0x30);}
  210.                         } break;
  211.          case 14: {j=1;
  212.                     if(fuhao==1)
  213.                                 {write(0x80+0x4f);write(0x04);c=a+b;
  214.                                   while(c!=0)
  215.                                  {
  216.                                          write_data(0x30+c%10);
  217.                                          c=c/10;
  218.                                          }
  219.                                  write_data(0x3d);a=0;b=0;flag=0;fuhao=0;}

  220.                                 else if(fuhao==2)
  221.                                 {write(0x80+0x4b);write(0x04);
  222.                                   if(a-b>0)
  223.                                      {c=a-b;}
  224.                                   else { c=b-a;        }
  225.                                   while(c!=0)
  226.                                  {
  227.                                          write_data(0x30+c%10);
  228.                                          c=c/10;
  229.                                          }
  230.                                   if(a-b<0)
  231.                                  write_data(0x2d);write_data(0x3d);a=0;b=1;flag=0;fuhao=0;}

  232.                                  else if(fuhao==3)
  233.                                  {write(0x80+0x4f);write(0x04);c=a*b;
  234.                                   while(c!=0)
  235.                                  {
  236.                                          write_data(0x30+c%10);
  237.                                          c=c/10;
  238.                                          }
  239.                                  write_data(0x3d);a=0;b=0;flag=0;fuhao=0;}

  240.                                  else if(fuhao==4)
  241.                                  {
  242.                                   write(0x80+0x4f);write(0x04);        i=0;
  243.                                   c=a/b/c;        
  244.                                   while(c!=0)
  245.                                  {
  246.                                          write_data(0x30+c%10);
  247.                                          c=c/10;
  248.                                           i++;
  249.                                           if(i==3)
  250.                                              write(0x2e);
  251.                                          }

  252.                                   if(a/b<=0)
  253.                                  write_data(0x30);write_data(0x3d);a=0;b=0;flag=0;fuhao=0;
  254.                                  }                  
  255.                                  } break;
  256.         case 15:{write_data(0x30+table1[num]);flag=1;fuhao=1;}        break;
  257.    }
  258.    }
  259.    P1=0xf0;
  260. }

  261. void main()
  262. {
  263.   init();


  264.   while(1)
  265.   {
  266.     keyscan()
  267.   }
  268. }


复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
huanghu 发表于 2018-4-13 19:45 | 只看该作者
怎么显示不对啊?
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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