找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机计算器源码

[复制链接]
跳转到指定楼层
楼主
ID:148893 发表于 2016-11-19 19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
完整代码下载:http://www.51hei.com/bbs/dpj-60002-1.html

  1. #include "reg51.h"
  2. #include "液晶.h"
  3. #include "ds1302.h"
  4. #include "math.h"
  5. #include "timer.h"
  6. #include "delay.h"
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define pi 3.141592653
  10. //特殊位定义
  11. sbit func=P3^5;//因为是4行5列,需要9个数据口,这个地方单独声明3.5口作为调节时间使用
  12. sbit fun_math=P3^6;
  13. sbit beep=P2^4;
  14. //全局变量定义,这个地方可以统一使用一个结构体进行操作。
  15. //计算器部分全局变量
  16. uchar dis_time=0; //当distime为1时,显示一次时间,
  17. uchar state=0;        //定义系统所处的状态0-1-2-3
  18. uchar codes;//定义当前输入键值
  19. uchar key_num[10]; //
  20. uchar key_n=0;//记录按下的次数
  21. uchar arith=0;//定义运算符号
  22. long data0;  //第一个数据 ,因为计算器是对两个数据进行计算,这个第一个输入的数据
  23. long data1;  //第二个数据  这是第二个数据的数据,按下等号键后对这两个数据进行相关运算
  24. uchar point_en=0; //小数点使能,一个数据中只能有一个小数点,这个变量作为控制小数点输入的开关
  25. double result1=0; //最终的运算结果
  26. uchar dis_num=0;//记录结果中的个数
  27. uchar fir_n=0;        //
  28. uchar unlock=0;         //键盘不锁住
  29. uchar clear=0;//清除系统的全局性标志变量
  30. uchar neg_label=0;        //输入负号的标志变量
  31. uchar wrong=0; //计算超限标志位
  32. uchar TIM=0;//控制大约1S显示一次时间
  33. unsigned char get_fun=0;

  34. uchar code dis[20]={
  35.            0XE7,0XEB,0XDB,0XBB,0XED,0XDD,0XBD,
  36.         0XEE,0XDE,0XBE,0XD7,0XB7,0X77,0X7B,0X7D,0X7E,
  37.         0X0E,0X0D,0X0B,0X07
  38. };//矩阵键盘键值
  39. uchar dat_out[12];
  40. uchar code mathlabel[4]={43,45,42,47};//运算符
  41. extern uchar time_en; //显示时间使能
  42. extern uchar en_alarm;  // 闹钟使能
  43. extern uchar cursor;
  44. //万年历部分的标志变量
  45. //显示星期字符


  46. uchar point_x[4];//
  47. ////////////////////////////////////////////////////
  48. /**********************************
  49.                           *                 开始界面计算器部分的程序

  50. /////////
  51. /*****************************
  52. * 函数名称:计算器变量初始化 init_var
  53. * 函数功能:初始化计算器 所使用的变量
  54. *
  55. *
  56. *
  57. ********************************************/
  58. void init_var()
  59. {
  60.    uchar i=0;
  61.    point_en=1;//允许输入小数点
  62.    state=0;
  63.    unlock=0;
  64.    arith=0;
  65.    fir_n=0;
  66.    neg_label=1;
  67.    wrong=0;

  68.    for(i=0;i<10;i++)
  69.    {
  70.       key_num[i]=0;
  71.    }
  72. }
  73. /*****************************
  74. * 函数名称:键盘扫描函数 keyscan
  75. * 函数功能:对矩阵键盘进行扫描,获取键值

  76.    7   8   9   +(光标选择)   复位/时钟

  77.    4   5   6   -                          改时间/设闹钟

  78.    1   2   3   *                                      增加

  79.    0   .   =    /                                   减小
  80. *
  81. *
  82. *
  83. ********************************************/
  84. void keyscan()
  85. {
  86.     uchar mm;

  87.         uchar mm2=0;
  88.         uchar i=0;
  89.         mm=0;
  90.         P1=0XF0;
  91.     mm=P1;//读数据
  92.         mm=mm&0XF0;        
  93.         if(mm!=0xf0||func==0||fun_math==0)//需要对func 进行判断
  94.         {
  95.             delay(20);
  96.                 mm=P1;
  97.                    mm=mm&0XF0;                          //消抖
  98.             if(mm!=0xF0||func==0||fun_math==0)
  99.                 {
  100.                      unlock=1;
  101.                          if((func!=0))
  102.                      {
  103.                              if(fun_math!=0)
  104.                                  {
  105.                                      P1=0X0F;
  106.                                      for(i=0;i<20;i++);
  107.                                          mm2=P1;
  108.                                          mm2=mm2&0x0f;
  109.                                      mm=mm+mm2;
  110.                                       for(i=0;i<16;i++)//读取0-15键值
  111.                                      {
  112.                                                          if(mm==dis[i])
  113.                                                         {
  114.                                                            codes=i;
  115.                                                         }                 
  116.                                           }                                
  117.                                          if(codes==15&&time_en==1)//这个地方考虑到使用复用功能----光标显示位置控制
  118.                                          {
  119.                                             if(en_alarm>0)
  120.                                                    {
  121.                                                   cursor++; // 是这个的原因
  122.                                                   delay(300);//尽量简单处理
  123.                                                 }                        
  124.                                          }        
  125.                                  
  126.                                  }
  127.                                   else
  128.                              {
  129.                                            P1=0XFF;
  130.                                          get_fun=0;
  131.                                          fun_math=0;
  132.                                          mm=P1&0X0F;
  133.                                          for(i=16;i<20;i++)
  134.                                          {
  135.                                             if(mm==dis[i])
  136.                                                   {
  137.                                                     codes=i+1; //分别对应的是sin  cos tan log这些函数
  138.                                                  }                                 
  139.                                          }
  140.                                          fun_math=1;
  141.                                          delay(30);        
  142.                                          get_fun=1;
  143.                                    //这个地方应该直接求函数了
  144.                           
  145.                              }                                                  
  146.                           }
  147.                           else //16-19  万年历控制
  148.                           {
  149.                                    P1=0XFF;
  150.                                  func=0;
  151.                                  mm=P1&0X0F;
  152.                                  for(i=16;i<20;i++)
  153.                                  {
  154.                                     if(mm==dis[i])
  155.                                           {
  156.                                             codes=i;
  157.                                          }                                 
  158.                                  }
  159.                                  func=1;
  160.                                  delay(30);                          
  161.                           }        
  162.                
  163.                 }
  164.          }
  165. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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