标题:
51单片机计算器源码
[打印本页]
作者:
a'we'w'r
时间:
2016-11-19 19:39
标题:
51单片机计算器源码
完整代码下载:
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);
}
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1