完整代码下载:http://www.51hei.com/bbs/dpj-60002-1.html
- #include "reg51.h"
- #include "液晶.h"
- #include "ds1302.h"
- #include "math.h"
- #include "timer.h"
- #include "delay.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define pi 3.141592653
- //特殊位定义
- sbit func=P3^5;//因为是4行5列,需要9个数据口,这个地方单独声明3.5口作为调节时间使用
- sbit fun_math=P3^6;
- sbit beep=P2^4;
- //全局变量定义,这个地方可以统一使用一个结构体进行操作。
- //计算器部分全局变量
- uchar dis_time=0; //当distime为1时,显示一次时间,
- uchar state=0; //定义系统所处的状态0-1-2-3
- uchar codes;//定义当前输入键值
- uchar key_num[10]; //
- uchar key_n=0;//记录按下的次数
- uchar arith=0;//定义运算符号
- long data0; //第一个数据 ,因为计算器是对两个数据进行计算,这个第一个输入的数据
- long data1; //第二个数据 这是第二个数据的数据,按下等号键后对这两个数据进行相关运算
- uchar point_en=0; //小数点使能,一个数据中只能有一个小数点,这个变量作为控制小数点输入的开关
- double result1=0; //最终的运算结果
- uchar dis_num=0;//记录结果中的个数
- uchar fir_n=0; //
- uchar unlock=0; //键盘不锁住
- uchar clear=0;//清除系统的全局性标志变量
- uchar neg_label=0; //输入负号的标志变量
- uchar wrong=0; //计算超限标志位
- uchar TIM=0;//控制大约1S显示一次时间
- unsigned char get_fun=0;
- uchar code dis[20]={
- 0XE7,0XEB,0XDB,0XBB,0XED,0XDD,0XBD,
- 0XEE,0XDE,0XBE,0XD7,0XB7,0X77,0X7B,0X7D,0X7E,
- 0X0E,0X0D,0X0B,0X07
- };//矩阵键盘键值
- uchar dat_out[12];
- uchar code mathlabel[4]={43,45,42,47};//运算符
- extern uchar time_en; //显示时间使能
- extern uchar en_alarm; // 闹钟使能
- extern uchar cursor;
- //万年历部分的标志变量
- //显示星期字符
- uchar point_x[4];//
- ////////////////////////////////////////////////////
- /**********************************
- * 开始界面计算器部分的程序
- /////////
- /*****************************
- * 函数名称:计算器变量初始化 init_var
- * 函数功能:初始化计算器 所使用的变量
- *
- *
- *
- ********************************************/
- void init_var()
- {
- uchar i=0;
- point_en=1;//允许输入小数点
- state=0;
- unlock=0;
- arith=0;
- fir_n=0;
- neg_label=1;
- wrong=0;
- for(i=0;i<10;i++)
- {
- key_num[i]=0;
- }
- }
- /*****************************
- * 函数名称:键盘扫描函数 keyscan
- * 函数功能:对矩阵键盘进行扫描,获取键值
- 7 8 9 +(光标选择) 复位/时钟
- 4 5 6 - 改时间/设闹钟
- 1 2 3 * 增加
- 0 . = / 减小
- *
- *
- *
- ********************************************/
- void keyscan()
- {
- uchar mm;
- uchar mm2=0;
- uchar i=0;
- mm=0;
- P1=0XF0;
- mm=P1;//读数据
- mm=mm&0XF0;
- if(mm!=0xf0||func==0||fun_math==0)//需要对func 进行判断
- {
- delay(20);
- mm=P1;
- mm=mm&0XF0; //消抖
- if(mm!=0xF0||func==0||fun_math==0)
- {
- unlock=1;
- if((func!=0))
- {
- if(fun_math!=0)
- {
- P1=0X0F;
- for(i=0;i<20;i++);
- mm2=P1;
- mm2=mm2&0x0f;
- mm=mm+mm2;
- for(i=0;i<16;i++)//读取0-15键值
- {
- if(mm==dis[i])
- {
- codes=i;
- }
- }
- if(codes==15&&time_en==1)//这个地方考虑到使用复用功能----光标显示位置控制
- {
- if(en_alarm>0)
- {
- cursor++; // 是这个的原因
- delay(300);//尽量简单处理
- }
- }
-
- }
- else
- {
- P1=0XFF;
- get_fun=0;
- fun_math=0;
- mm=P1&0X0F;
- for(i=16;i<20;i++)
- {
- if(mm==dis[i])
- {
- codes=i+1; //分别对应的是sin cos tan log这些函数
- }
- }
- fun_math=1;
- delay(30);
- get_fun=1;
- //这个地方应该直接求函数了
-
- }
- }
- else //16-19 万年历控制
- {
- P1=0XFF;
- func=0;
- mm=P1&0X0F;
- for(i=16;i<20;i++)
- {
- if(mm==dis[i])
- {
- codes=i;
- }
- }
- func=1;
- delay(30);
- }
-
- }
- }
- }
复制代码 |