找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简单的计算器程序 12864液晶显示

[复制链接]
跳转到指定楼层
楼主
ID:152913 发表于 2016-12-13 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简单的计算器程序  自己编的
程序下载:
智能计算器.zip (36.9 KB, 下载次数: 93)

部分源码预览:
  1. #ifndef __PROCESS_H__
  2. #define __PROCESS_H__

  3. uint8 key,num;
  4. uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
  5. uint8 flag;        //定义有没有按下符号键,这个是统称
  6. long a,b,c,d;        //定义运算数据的第一个和第二个及等于的数变量
  7. uint8 k; //定义小数点后面显示的位数
  8. uint8 biao,keyflag;                                //   +                -                *                                 /
  9. uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据

  10. void process()
  11. {

  12.         P1=0xfe;   //令第一行为0,然后判断是哪一列按下
  13.         if(P1!=0xfe)
  14.         {
  15.                 delay(1000);
  16.                 if(P1!=0xfe)
  17.                 {
  18.                         key=P1&0xf0;
  19.                         switch(key)
  20.                         {
  21.                                 case 0xe0: num=0;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //1
  22.                                 case 0xd0: num=1;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //2
  23.                                 case 0xb0: num=2;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //3
  24.                                 case 0x70: num=3;break;          //加
  25.                         }
  26.                 }
  27.                 while(P1!=0xfe);

  28.                 switch (num)
  29.                 {
  30.                
  31.                 case 0:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  32.                 case 1:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  33.                 case 2:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  34.                 case 3:flag=1;fuhao=1;lcdwrd(0x30+dat1[num]);break;        //加号+       
  35.                 }
  36.         }


  37.         P1=0xfd;                                //令第二行为0,判断是哪一列按下
  38.         if(P1!=0xfd)
  39.         {
  40.                 delay(1000);
  41.                 if(P1!=0xfd)
  42.                 {
  43.                         key=P1&0xf0;
  44.                         switch(key)
  45.                         {
  46.                                 case 0xe0: num=4;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //4                                  
  47.                                 case 0xd0: num=5;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //5
  48.                                 case 0xb0: num=6;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //6
  49.                                 case 0x70: num=7;break;          //减—
  50.                         }       
  51.                 }
  52.                 while(P1!=0xfd);
  53.                 switch (num)
  54.                 {
  55.                 case 4:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  56.                 case 5:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  57.                 case 6:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  58.                 case 7:flag=1;fuhao=2;lcdwrd(0x30+dat1[num]);break;
  59.                 }

  60.         }


  61.         P1=0xfb;                 //令第三行为0,判断哪一列按下
  62.         if(P1!=0xfb)
  63.         {
  64.                 delay(1000);
  65.                 if(P1!=0xfb)
  66.                 {
  67.                         key=P1&0xf0;
  68.                         switch(key)
  69.                         {
  70.                                 case 0xe0: num=8;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //7
  71.                                 case 0xd0: num=9;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;          //8
  72.                                 case 0xb0: num=10;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;  //9
  73.                                 case 0x70: num=11;break;  //乘*
  74.                         }       
  75.                 }
  76.                 while(P1!=0xfb);
  77. switch (num)
  78.       {
  79.             case 8:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  80.                 case 9:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  81.                 case 10:if(flag==0){a=a*10+dat1[num];}else{b=b*10+dat1[num];} lcdwrd(0x30+dat1[num]);break;
  82.                 case 11:flag=1;fuhao=3;lcdwrd(0x30+dat1[num]);break;       
  83.           
  84.           }

  85.         }


  86.         P1=0xf7;                 //令第四行为0,判断哪一列按下
  87.         if(P1!=0xf7)
  88.         {
  89.                 delay(1000);
  90.                 if(P1!=0xf7)
  91.                 {
  92.                         key=P1&0xf0;
  93.                         switch(key)
  94.                         {
  95.                                  case 0xe0: num=12;if(keyflag==1){keyflag=0;lcdwrc(0x01);};break;  //0
  96.                                  case 0xd0: num=13;break;  //清除rst
  97.                                  case 0xb0: num=14;break;  //等号=
  98.                                  case 0x70: num=15;break;  //除/
  99.                         }       
  100.                 }
  101.                 while(P1!=0xf7);
  102.                 switch(num)
  103.                 {
  104.                 case 12: if(flag==0){a=a*10+dat1[num];lcdwrd(0x30);}else{b=b*10+dat1[num];lcdwrd(0x30);}break;         
  105.                 case 13: lcdwrc(0x01);a=0;b=0;flag=0;fuhao=0;break;                               
  106.                 case 15:flag=1;fuhao=4;lcdwrd(0x2f);break;//除号/
  107.                 case 14:                                                        
  108.                         switch (fuhao)
  109.                                          {
  110.                 case 1:
  111.                                                  lcdwrc(0x4f+0x80);
  112.                                                  lcdwrc(0x04);//设置光标左移,屏幕不移动
  113.                                                  c=a+b;
  114.                                                  while(c!=0)         //一位一位显示
  115.                                                  {
  116.                                                         lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
  117.                                                         c=c/10;//取前面的结果数据       
  118.                                                         keyflag=1;
  119.                                                   }
  120.                                                  lcdwrd(0x3d); //显示等于号=
  121.                                                  a=0;
  122.                                                  b=0;
  123.                                                  flag=0;
  124.                                                  fuhao=0;//全部清除为0
  125.                                                  break;

  126.                 case 2:
  127.                                                  lcdwrc(0x4f+0x80);
  128.                                                  lcdwrc(0x04);//设置光标左移,屏幕不移动
  129.                                                  if(a>b)
  130.                                                         c=a-b;
  131.                                                  else
  132.                                                         c=b-a;
  133.                                                
  134.                                                  while(c!=0)         //一位一位显示
  135.                                                  {
  136.                                                         lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
  137.                                                         c=c/10;//取前面的结果数据       
  138.                                                         keyflag=1;
  139.                                                  }
  140.                                                  if(a<b)        lcdwrd(0x2d); //显示-号
  141.                                                   lcdwrd(0x3d); //显示等于号=
  142.                                                  a=0;
  143.                                                  b=0;
  144.                                                  flag=0;
  145.                                                  fuhao=0;//全部清除为0
  146.                                                  break;

  147.                 case 3:
  148.                                                  lcdwrc(0x4f+0x80);
  149.                                                  lcdwrc(0x04);//设置光标左移,屏幕不移动
  150.                                                  c=a*b;
  151.                                                  while(c!=0)         //一位一位显示
  152.                                                  {
  153.                                                         lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
  154.                                                         c=c/10;//取前面的结果数据       
  155.                                                         keyflag=1;
  156.                                                 }
  157.                                                  lcdwrd(0x3d); //显示等于号=
  158.                                                  a=0;
  159.                                                  b=0;
  160.                                                  flag=0;
  161.                                                  fuhao=0;//全部清除为0
  162.                                                  break;

  163.                 case 4:
  164.                                                  k=0;
  165.                                                 lcdwrc(0x4f+0x80);
  166.                                                 lcdwrc(0x04);//设置光标左移,屏幕不移动
  167.                                                 c=(long)(((float)a/b)*1000);//强制转换为long。
  168.                                                 while(c!=0)         //一位一位显示
  169.                                                 {
  170.                                                         k++;
  171.                                                         lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
  172.                                                         c=c/10;//取前面的结果数据
  173.                                                         if(k==3)
  174.                                                         {
  175.                                                                 lcdwrd(0x2e);
  176.                                                                 k=0;
  177.                                                         }               
  178.                                                         keyflag=1;
  179.                                                 }
  180.                                                 if(a/b<0)          //如果a比b小的话那么除的结果最高位是0
  181.                                                 {
  182.                                                         lcdwrd(0x30);       
  183.                                                 }
  184.                                                 lcdwrd(0x3d); //显示等号
  185.                                                 a=0;
  186.                                                 b=0;
  187.                                                 flag=0;
  188.                                                 fuhao=0;//全部清除为0
  189.                                                 break;
  190.                                         
  191.                                         }
  192.                 break;

  193.                 }
  194.         }

  195. }

  196. #endif
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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