找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602简易计算器实物与仿真

[复制链接]
跳转到指定楼层
楼主
proteus仿真:


实物:


  1. /*******************************************************************************
  2. *  标题:                       LCD1602简易计算器                               *
  3. *  时间                      2018年7月26日22:32:18                                                   *
  4. *                                                                                                                                                           *
  5. *  实验说明:1602简易计算器,可以实现四位数以内的加减乘除,                                     *                                                      
  6. ********************************************************************************
  7. * 实验心得:当内部ram不够用的时候,可以定义成xdata,使用外部ram,但是有一个问题*
  8. 就是在用proteus仿真的时候,如果有xdata的代码,可能仿真会出现点问题,因为peoteus*
  9. 不支持外部扩展ram                                                               *
  10. ********************************************************************************/
  11. #include<reg51.h>       
  12. #include"lcd.h"
  13. #include"math.h"

  14. //--定义使用的IO口--//       
  15. #define GPIO_KEY P1

  16. //--定义全局变量--//
  17. unsigned char code XuJian[16]="01470258=369+-x/";
  18. long value[16];
  19. unsigned char Num[8];//此处写成unsigend char xdata Num[8]时,实物可以用,但是仿真有点问题,因为proteus不支持外部扩展ram.
  20. unsigned long result;//运算结果
  21. unsigned int flag=0;//标志位
  22. unsigned int  m;
  23. unsigned int c=0;
  24. long First=0;//输入的第一位数
  25. long Second=0;//输入的第二位数
  26. unsigned int Key;//符号判断,如果key=12,为+,13,为-,14为×,15为/。
  27. unsigned char KeyValue=-1;
  28. //用来存放读取到的键值

  29. //--声明全局函数--//
  30. int KeyScan(void);//键值判断函数
  31. void Delay10ms(unsigned int c);   //误差 0us
  32. void RES();//结果运算函数

  33. /*******************************************************************************
  34. * 函 数 名         : main
  35. * 函数功能                   : 主函数
  36. * 输    入         : 无
  37. * 输    出         : 无
  38. *******************************************************************************/
  39. void main(void)
  40. {
  41.         LcdInit();
  42. //        for(i=0;i<7;i++)
  43. //        {
  44. //                LcdWriteData(TiShi[i]);
  45. //        }

  46.         while(1)
  47.         {
  48.             KeyValue=KeyScan();
  49.                 switch(KeyValue)
  50.                 {
  51.                         case(0):
  52.                         LcdWriteCom(0x01);
  53.                         KeyValue=-1;
  54.                         First=0;
  55.                         Second=0;
  56.                         c=0;
  57.                         break;

  58.                         case(1):                       
  59.                         if(flag==0)//flag为0时,正常计算
  60.                         {
  61.                         LcdWriteData(XuJian[1]);
  62.                         KeyValue=-1;
  63.                         if(c==0)
  64.                         First=10*First+1;
  65.                         else if(c==1)
  66.                         Second=10*Second+1;
  67.                         }

  68.                         else if(flag==1)//flag为1时,可以在第一次运算好后,继续输入数字,开始第二次计算
  69.                         {
  70.                     LcdWriteCom(0x01);
  71.                         LcdWriteData(XuJian[1]);
  72.                         KeyValue=-1;
  73.                         First=0;
  74.                         Second=0;
  75.                         c=0;
  76.                         flag=0;
  77.                        
  78.                         if(c==0)
  79.                         First=10*First+1;
  80.                         else if(c==1)
  81.                         Second=10*Second+1;       
  82.                         }
  83.                         break;

  84.                         case(2):
  85.                         if(flag==0)
  86.                         {
  87.                         LcdWriteData(XuJian[2]);
  88.                         KeyValue=-1;
  89.                         if(c==0)
  90.                         First=10*First+4;
  91.                         else if(c==1)
  92.                         Second=10*Second+4;       
  93.                         }

  94.                         else if(flag==1)
  95.                         {
  96.                         LcdWriteCom(0x01);
  97.                         LcdWriteData(XuJian[2]);
  98.                         KeyValue=-1;
  99.                         First=0;
  100.                         Second=0;
  101.                         c=0;
  102.                         flag=0;
  103.                        
  104.                         if(c==0)
  105.                         First=10*First+4;
  106.                         else if(c==1)
  107.                         Second=10*Second+4;               
  108.                         }
  109.                         break;

  110.                         case(3):
  111.                         if(flag==0)
  112.                         {
  113.                         LcdWriteData(XuJian[3]);
  114.                         KeyValue=-1;
  115.                         if(c==0)
  116.                         First=10*First+7;
  117.                         else if(c==1)
  118.                         Second=10*Second+7;
  119.                         }

  120.                         else if(flag==1)
  121.                         {
  122.                         LcdWriteCom(0x01);
  123.                         LcdWriteData(XuJian[3]);
  124.                         KeyValue=-1;
  125.                         First=0;
  126.                         Second=0;
  127.                         c=0;
  128.                         flag=0;
  129.                        
  130.                         if(c==0)
  131.                         First=10*First+7;
  132.                         else if(c==1)
  133.                         Second=10*Second+7;               
  134.                         }
  135.                         break;

  136.                         case(4):
  137.                         if(flag==0)
  138.                         {
  139.                         LcdWriteData(XuJian[4]);
  140.                         KeyValue=-1;
  141.                         if(c==0)
  142.                     First=10*First+0;
  143.                         else if(c==1)
  144.                     Second=10*Second+0;
  145.                         }

  146.                         else if(flag==1)
  147.                         {
  148.                         LcdWriteCom(0x01);
  149.                         LcdWriteData(XuJian[4]);
  150.                         KeyValue=-1;
  151.                         First=0;
  152.                         Second=0;
  153.                         c=0;
  154.                         flag=0;
  155.                        
  156.                         if(c==0)
  157.                         First=10*First+0;
  158.                         else if(c==1)
  159.                         Second=10*Second+0;       
  160.                         }
  161.                         break;

  162.                         case(5):
  163.                         if(flag==0)
  164.                         {
  165.                         LcdWriteData(XuJian[5]);
  166.                         KeyValue=-1;
  167.                         if(c==0)
  168.                         First=10*First+2;
  169.                         else if(c==1)
  170.                         Second=10*Second+2;
  171.                         }

  172.                         else if(flag==1)
  173.                         {
  174.                         LcdWriteCom(0x01);
  175.                         LcdWriteData(XuJian[5]);
  176.                         KeyValue=-1;
  177.                         First=0;
  178.                         Second=0;
  179.                         c=0;
  180.                         flag=0;
  181.                        
  182.                         if(c==0)
  183.                         First=10*First+2;
  184.                         else if(c==1)
  185.                         Second=10*Second+2;       
  186.                         }
  187.                         break;

  188.                         case(6):
  189.                         if(flag==0)
  190.                         {
  191.                         LcdWriteData(XuJian[6]);
  192.                         KeyValue=-1;
  193.                         if(c==0)
  194.                         First=10*First+5;
  195.                         else if(c==1)
  196.                         Second=10*Second+5;
  197.                         }
  198.                        
  199.                         else if(flag==1)
  200.                         {
  201.                         LcdWriteCom(0x01);
  202.                         LcdWriteData(XuJian[6]);
  203.                         KeyValue=-1;
  204.                         First=0;
  205.                         Second=0;
  206.                         c=0;
  207.                         flag=0;
  208.                        
  209.                         if(c==0)
  210.                         First=10*First+5;
  211.                         else if(c==1)
  212.                         Second=10*Second+5;       
  213.                         }
  214.                         break;

  215.                         case(7):
  216.                         if(flag==0)
  217.                         {
  218.                         LcdWriteData(XuJian[7]);
  219.                         KeyValue=-1;
  220.                         if(c==0)
  221.                         First=10*First+8;
  222.                         else if(c==1)
  223.                         First=10*Second+8;
  224.                         }

  225.                         else if(flag==1)
  226.                         {
  227.                         LcdWriteCom(0x01);
  228.                         LcdWriteData(XuJian[7]);
  229.                         KeyValue=-1;
  230.                         First=0;
  231.                         Second=0;
  232.                         c=0;
  233.                         flag=0;
  234.                        
  235.                         if(c==0)
  236.                         First=10*First+8;
  237.                         else if(c==1)
  238.                         Second=10*Second+8;               
  239.                         }
  240.                         break;

  241.                         case(8):
  242.                         flag=1;
  243.                         LcdWriteCom(0xc0);
  244.                         LcdWriteData(XuJian[8]);
  245.                         LcdWriteCom(0x0c);
  246.                         RES();
  247.                         KeyValue=-1;
  248.                         break;

  249.                         case(9):
  250.                         if(flag==0)
  251.                         {
  252.                         LcdWriteData(XuJian[9]);
  253.                         KeyValue=-1;
  254.                         if(c==0)
  255.                         First=10*First+3;
  256.                         else if(c==1)
  257.                         Second=10*Second+3;
  258.                         }

  259.                         else if(flag==1)
  260.                         {
  261.                         LcdWriteCom(0x01);
  262.                         LcdWriteData(XuJian[9]);
  263.                         KeyValue=-1;
  264.                         First=0;
  265.                         Second=0;
  266.                         c=0;
  267.                         flag=0;
  268.                        
  269.                         if(c==0)
  270.                         First=10*First+3;
  271.                         else if(c==1)
  272.                         Second=10*Second+3;               
  273.                         }
  274.                         break;

  275.                         case(10):
  276.                         if(flag==0)
  277.                         {
  278.                         LcdWriteData(XuJian[10]);
  279.                         KeyValue=-1;
  280.                         if(c==0)
  281.                         First=10*First+6;
  282.                         else if(c==1)
  283.                         Second=10*Second+6;
  284.                         }

  285.                         else if(flag==1)
  286.                         {
  287.                         LcdWriteCom(0x01);
  288.                         LcdWriteData(XuJian[10]);
  289.                         KeyValue=-1;
  290.                         First=0;
  291.                         Second=0;
  292.                         c=0;
  293.                         flag=0;
  294.                        
  295.                         if(c==0)
  296.                         First=10*First+6;
  297.                         else if(c==1)
  298.                         Second=10*Second+6;       
  299.                         }
  300.                         break;

  301.                         case(11):
  302.                         if(flag==0)
  303.                         {
  304.                         LcdWriteData(XuJian[11]);
  305.                         KeyValue=-1;
  306.                         if(c==0)
  307.                     First=10*First+9;
  308.                         else if(c==1)
  309.                         Second=10*Second+9;
  310.                         }

  311.                         else if(flag==1)
  312.                         {
  313.                         LcdWriteCom(0x01);
  314.                         LcdWriteData(XuJian[11]);
  315.                         KeyValue=-1;
  316.                         First=0;
  317.                         Second=0;
  318.                         c=0;
  319.                         flag=0;
  320.                        
  321.                         if(c==0)
  322.                         First=10*First+9;
  323.                         else if(c==1)
  324.                         Second=10*Second+9;       
  325.                         }
  326.                         break;

  327.                         case(12):
  328.                         LcdWriteData(XuJian[12]);
  329.                         Key=12;
  330.                         KeyValue=-1;
  331.                         c=1;
  332.                         break;

  333.                         case(13):
  334.                         LcdWriteData(XuJian[13]);
  335.                         Key=13;
  336.                         KeyValue=-1;
  337.                         c=1;
  338.                         break;

  339.                         case(14):
  340.                         LcdWriteData(XuJian[14]);
  341.                         Key=14;
  342.                         KeyValue=-1;
  343.                         c=1;
  344.                         break;

  345.                         case(15):
  346.                         LcdWriteData(XuJian[15]);
  347.                         Key=15;
  348.                         KeyValue=-1;
  349.                         c=1;
  350.                         break;

  351.                 }
  352.         }                       
  353. }

  354. void RES()
  355. {

  356.     unsigned int i,j;

  357.         i=0;

  358.         if(Key==12)
  359.         {
  360.                 result=First+Second;
  361.         }

  362.         else if(Key==13)
  363.         {
  364.                 result=First-Second;
  365.         }

  366.         else if(Key==14)
  367.         {
  368.                 result=First*Second;
  369.         }

  370.         else if(Key==15)
  371.         {
  372.                 result=First/Second;
  373.         }

  374.         do
  375.         {
  376.         value[i]=result%10;
  377.         result/=10;
  378.         i++;
  379.         }while((result/10)!=0);

  380.         value[i]=result;
  381.         m=i;

  382.         for(j=0;j<=i;j++) //for循环如果是for(j=i;j>=0;j++)就会出现不同的结果,很奇怪
  383.         {
  384.                   Num[j]=value[j]+'0';
  385.         }

  386.         for(i=0;i<=m;i++)//这里的for循环也是和上面一样的结果,改成for(i=m;i>=0;i--)就会出现奇怪的结果,有兴趣的可以试试。
  387.     {
  388.                 LcdWriteData(Num[m-i]);
  389.         }
  390.        

  391. }


  392. /*******************************************************************************
  393. * 函 数 名         : KeyScan
  394. * 函数功能                   : 检测有按键按下并读取键值
  395. * 输    入         : 无
  396. * 输    出         : 无
  397. *******************************************************************************/

  398. int KeyScan(void)          //测试行(row)的时候就是线是竖着的的那一列为1,测试列(col)的时候就是线是横着的那几行为1
  399. {
  400.         char a = 0;
  401.         GPIO_KEY=0x0f;
  402.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  403.         {
  404.                 Delay10ms(1);//延时10ms进行消抖
  405.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  406.                 {
  407.                        
  408.                         //测试列
  409.                         GPIO_KEY=0X0F;
  410.                         switch(GPIO_KEY)
  411.                         {
  412.                                 case(0X07):        KeyValue=0;break;
  413.                                 case(0X0b):        KeyValue=4;break;
  414.                                 case(0X0d): KeyValue=8;break;
  415.                                 case(0X0e):        KeyValue=12;break;
  416.                         }
  417.                         //测试行
  418.                         GPIO_KEY=0XF0;
  419.                         switch(GPIO_KEY)
  420.                         {
  421.                                 case(0X70):        KeyValue=KeyValue+3;break;
  422.                                 case(0Xb0):        KeyValue=KeyValue+2;break;
  423.                                 case(0Xd0): KeyValue=KeyValue+1;break;
  424.                                 case(0Xe0):        KeyValue=KeyValue;break;
  425.                         }
  426.                         while((a<50) && (GPIO_KEY!=0xf0))         //检测按键松手检测
  427.                         {
  428.                                 Delay10ms(1);
  429.                                 a++;
  430.                         }
  431.                 }
  432.         }
  433.         return KeyValue;

  434. }

  435. /*******************************************************************************
  436. * 函 数 名         : Delay10ms
  437. * 函数功能                   : 延时函数,延时10ms
  438. * 输    入         : 无
  439. * 输    出         : 无
  440. *******************************************************************************/

  441. void Delay10ms(unsigned int c)   //误差 0us
  442. {
  443.     unsigned char a, b;

  444.         //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
  445.     for (;c>0;c--)
  446.         {
  447.                 for (b=38;b>0;b--)
  448.                 {
  449.                         for (a=130;a>0;a--);
  450.                 }         
  451.         }      
  452. }
  453. //因为有.h文件,所以复制上来会出错,需要的在附件里下载
复制代码



LCD1602简易计算器.rar

63.74 KB, 下载次数: 209, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:661338 发表于 2019-12-23 15:23 | 只看该作者
谢谢大神 学到了很多
回复

使用道具 举报

板凳
ID:670990 发表于 2019-12-24 15:31 来自手机 | 只看该作者
楼主实物图能拍的再详细一些吗 对我很有用!
回复

使用道具 举报

地板
ID:672877 发表于 2019-12-25 19:46 | 只看该作者
复制进去有错误怎修改啊
回复

使用道具 举报

5#
ID:814018 发表于 2020-8-13 23:24 | 只看该作者
请问下,这里面的C是个什么意思啊
回复

使用道具 举报

6#
ID:814033 发表于 2020-8-14 07:11 来自手机 | 只看该作者
厉害了,长知识了
回复

使用道具 举报

7#
ID:837654 发表于 2020-11-2 11:16 | 只看该作者
有错
回复

使用道具 举报

8#
ID:787495 发表于 2020-12-18 16:58 | 只看该作者
有大神能做汇编语言吗
回复

使用道具 举报

9#
ID:881846 发表于 2021-2-2 14:51 | 只看该作者
国有化 发表于 2020-8-13 23:24
请问下,这里面的C是个什么意思啊

对啊 c是什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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