/***************************************************************
作品:多功能计算器
功能:实现基本的加减乘除运算,附带时钟功能以及温度测量显示
受液晶屏幕限制,一次只可连续按三个数据
详细资料请参考作品说明书。
作者:何镜浩
日期: 2011年4月
****************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<wendushizhong.h>
uchar temp,t,dh,b,b1,b3,b4,bt1,bt2,fu,fu1,k,k2,k3,f1,f2,numf,numfb,xw1,xw2,xw3,xd,j,fd1,fd2,b2,gk,bc;
long shu10,shu20,shu30;
double tong,shu1,shu2,shu3,deshu1,deshu; //标记各个变量名,其中tong用来装3个数据的小数部分,减少变量所占内存
//待测---------------------------------------
/***************************************************************
模块:计算器4*4键盘扫描模块
功能:实现运算功能,和一些干扰排除逻辑,例如先有数字后按下“=”才
有效,只有数字就按下“=”时的结果,等等。
****************************************************************/
keyscan()
{
if(dh==0) //"="号未按下
{
P3=0xef;
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
if(gk==0) //当开始计算功能时,gk=1,从而关闭时钟模式,防止指针混乱
{
write_com(0x80); //指针指向计算器模块
}
gk=1; // 关闭时钟模式
f1=1; //当没有数字先按下时,按下符号键不识别。此时打开符号识别功能
if(numf==1) //numf是符号键所按下次数标记
{
fd1=1; //第一个符号按下后,若按下数字先,则fd1=1,
//此时“.”有效,故可以避免发生“+.23”之类的情况
numfb=0; //为了防止连续按下符号位,如“++”故每按一次符号则numfb=1关闭
//符号扫描。此时因为有数字按下了,故在此打开符号扫描
}
if(numf==2) //numf是符号键所按下次数标记
{
fd2=1; // 实际功能同fd1
}
delay(5);
temp=P3;
switch(temp)
{
case 0xee:t=0; break;
case 0xed:t=1; break;
case 0xeb:t=2; break;
case 0xe7:t=3; break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
} //松手检测
if(numf==0&&xd==0) //确定shu1的整数部分
{
shu10=shu10*10+t;
}
if(numf==0&&xd==1) //确定shu1的小数部分
{
tong=tong*10+t;
xw1++; //shu1的小数位数,便于整合用
}
if(numf==1&&xd==0) //确定shu2的整数部分
{
b2=1; //使“12*=”之类的情况出现时shu2默认为1,输出结果为shu1
shu20=shu20*10+t;
}
if(numf==1&&xd==1) //确定shu2的小数部分
{
tong=tong*10+t;
xw2++; //shu2的小数位数,便于整合用
}
if(numf==2&&xd==0) //确定shu3的整数部分
{
shu30=shu30*10+t;
}
if(numf==2&&xd==1) //确定shu3的小数部分
{
tong=tong*10+t;
xw3++; //shu3的小数位数,便于整合用
}
switch(t)
{
case 0:write_data('0'),bc++; break;
case 1:write_data('1'),bc++; break;
case 2:write_data('2'),bc++; break;
case 3:write_data('3'),bc++; break;
}
}//第二个while
}//第一个while
P3=0xdf;
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
if(gk==0) //当开始计算功能时,gk=1,从而关闭时钟模式,防止指针混乱
{
write_com(0x80); //指针指向计算器模块
}
gk=1; //关闭时钟模式
f1=1; //当没有数字先按下时,按下符号键不识别。此时打开符号识别功能
if(numf==1) //numf是符号键所按下次数标记
{
fd1=1;//第一个符号按下后,若按下数字先,则fd1=1,
//此时“.”有效,故可以避免发生“+.23”之类的情况
numfb=0; //为了防止连续按下符号位,如“++”故每按一次符号则numfb=1关闭
//符号扫描。此时因为有数字按下了,故在此打开符号扫描
}
if(numf==2) //numf是符号键所按下次数标记
{
fd2=1; // 实际功能同fd1
}
delay(5);
temp=P3;
switch(temp)
{
case 0xde:t=4; break;
case 0xdd:t=5; break;
case 0xdb:t=6; break;
case 0xd7:t=7; break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
} //松手检测
if(numf==0&&xd==0) //确定shu1的整数部分
{
shu10=shu10*10+t;
}
if(numf==0&&xd==1) //确定shu1的小数部分
{
tong=tong*10+t;
xw1++; //shu1的小数位数,便于整合用
}
if(numf==1&&xd==0) //确定shu2的整数部分
{
b2=1; //使“12*=”之类的情况出现时shu2默认为1,输出结果为shu1
shu20=shu20*10+t;
}
if(numf==1&&xd==1) //确定shu2的小数部分
{
tong=tong*10+t;
xw2++; //shu2的小数位数,便于整合用
}
if(numf==2&&xd==0) //确定shu3的整数部分
{
shu30=shu30*10+t;
}
if(numf==2&&xd==1) //确定shu3的小数部分
{
tong=tong*10+t;
xw3++; //shu3的小数位数,便于整合用
}
switch(t)
{
case 4:write_data('4'),bc++; break;
case 5:write_data('5'),bc++; break;
case 6:write_data('6'),bc++; break;
case 7:write_data('7'),bc++; break;
}
}//第二个while
}//第一个while
P3=0xbf;
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
switch(temp) //b1用来标记显示“8,9,‘.’=”,t用来记录运算数据
{
case 0xbe:t=8,b1=1;break;
case 0xbd:t=9,b1=2;break;
case 0xbb:b1=3;break;
case 0xb7:b1=4;break;
}
while(temp!=0x0f)
{
delay(5);
temp=P3;
temp=temp&0x0f;
} //松手检测
switch(b1)
{
case 1: write_data('8'),bc++;
f1=1; //当没有数字先按下时,按下符号键不识别。此时打开符号识别功能
if(gk==0) //当开始计算功能时,gk=1,从而关闭时钟模式,防止指针混乱
{
write_com(0x80); //指针指向计算器模块
}
gk=1; //关闭时钟模式
if(numf==1) //numf是符号键所按下次数标记
{
fd1=1; //第一个符号按下后,若按下数字先,则fd1=1,
//此时“.”有效,故可以避免发生“+.23”之类的情况
numfb=0; //为了防止连续按下符号位,如“++”故每按一次符号则numfb=1关闭
//符号扫描。此时因为有数字按下了,故在此打开符号扫描
}
if(numf==2) //numf是符号键所按下次数标记
{
fd2=1; // 实际功能同fd1
}
if(numf==0&&xd==0) //确定shu1的整数部分
{
shu10=shu10*10+t;
}
if(numf==0&&xd==1) //确定shu1的小数部分
{
tong=tong*10+t;
xw1++; //shu1的小数位数,便于整合用
}
if(numf==1&&xd==0) //确定shu2的整数部分
{
b2=1; //使“12*=”之类的情况出现时shu2默认为1,输出结果为shu1
shu20=shu20*10+t;
}
if(numf==1&&xd==1) //确定shu2的小数部分
{
tong=tong*10+t;
xw2++; //shu2的小数位数,便于整合用
}
if