/***********************************************
**摘 要: 简单计算器的实现
**作者:shirl
**实现说明:
1:变量flag_fuhao为键入+、-、*、/运算符标志
(即当前一个键值为+、-、*、/运算符时,flag_fuhao为1,
其他键值则flag_fuhao置零,其用在显示时)
2:变量flag_shu数输入情况,flag_shu为0时,输入的符号无效;
flag_shu为2时,变量fuhao更新为新键值
**完成日期:2010年4月18日
*********************************************/
#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
#define duan P0//数码管显示段选定义
#define wei P2//数码管显示位选定义
#define key P3//键盘接口定义
sbit OFF = P1^0;//关机键定义
unsigned long int shu1,shu2;//进行运算的两个变量数
uchar num;////键盘扫描返回值
char flag1,flag_shu,flag_fuhao,fuhao,newkey,update;
//flag1开机标志 newkey新按键标志,fuhao运算符,update表示等于号
//之后紧接着输入的是数的话则清零shu1
char key_shu;//按键值
unsigned char code Wela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//六位数码管的位选
unsigned char code Duan[]={0x3f,0x06,0x5b,
// 0 1 2
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
// 3 4 5 6 7 8 9 无显示 共阴极数码管
uchar keyscan();//键盘扫描函数
void display(unsigned long int );//数码管显示函数
void delay(uint i)//延时函数
{
while(i--);
}
/***********************************************
主函数
************************************************/
void main()
{
flag1=0;//标志关机
while(1)
{
if(keyscan()==15)//开机检测
{
flag1=1;//标志开机
shu1=shu2=fuhao=flag_shu=newkey=0;//初始化变量
while(flag1)
{
if(!flag_fuhao)display(shu1);
else display(shu2);
key_shu=keyscan();
if(newkey==1)//有新键值
{
if(key_shu==15)//按下ON/C键,清零
{ flag_fuhao=0;update=0;
shu1=shu2=fuhao=flag_shu=newkey=0;
}
else if(key_shu==14&&flag_shu==1&&fuhao)//按下"="
{
switch(fuhao)
{
case 10:shu1=shu2+shu1;break;
case 11:shu1=shu2-shu1;break;
case 12:shu1=shu2*shu1;break;
case 13:shu1=shu2/shu1;break;
}
fuhao=0;flag_fuhao=0;update=1;
}
else if((key_shu>=0)&&(key_shu<=9))//按下数字键
{ flag_fuhao=0;
if(update)shu1=0;
if(shu1<100000)
{shu1=key_shu+shu1*10;flag_shu=1;}
update=0;
}
else if((key_shu>=10)&&(key_shu<=13))//按下运算符
{
flag_fuhao=1;update=0;
if(flag_shu==1)
{
if(fuhao==0)
{
shu2=shu1;shu1=0;
fuhao=key_shu;flag_shu=2;
}
else
{
switch(fuhao)
{
case 10:shu2=shu2+shu1;break;
case 11:shu2=shu2-shu1;break;
case 12:shu2=shu2*shu1;break;
case 13:shu2=shu2/shu1;break;
}
shu1=0;fuhao=key_shu;
}
}
else if(flag_shu==2)
fuhao=key_shu;
}
newkey=0;
}
}
}
}
}
///////////////键盘扫描/////////////////
uchar keyscan()
{
////// 1
key=0xfe;
if(key!=0xfe)
{
delay(500);
if(key!=0xfe)
{
switch(key)
{
case 0xee:num=7 ;break;
case 0xde:num=8 ;break;
case 0xbe:num=9 ;break;
case 0x7e:num=13;break; //"/"
}
newkey=1;
delay(500);
while(key!=0xfe)
{
if(flag1)
if(!shu1&&num>=0&&num<=9)
display(num);
else
display(shu1);
}
return num;
}
}
////// 1
////// 2
key=0xfd;
if(key!=0xfd)
{
delay(500);
if(key!=0xfd)
{
switch(key)
{
case 0xed:num=4 ;break;
case 0xdd:num=5 ;break;
case 0xbd:num=6 ;break;
case 0x7d:num=12;break; //*
}
newkey=1;
delay(500);
while(key!=0xfd)
{
if(flag1)
if(!shu1&&num>=0&&num<=9)
display(num);
else
display(shu1);
}
return num ;
}
}
////// 2
////// 3
key=0xfb;
if(key!=0xfb)
{
delay(500);
if(key!=0xfb)
{
switch(key)
{
case 0xeb:num=1 ;break;
case 0xdb:num=2;break;
case 0xbb:num=3;break;
case 0x7b:num=11;break; //-
}
newkey=1;
delay(500);
while(key!=0xfb)
{
if(flag1)
if(!shu1&&num>=0&&num<=9)
display(num);
else
display(shu1);
}
return num ;
}
}
////// 3
////// 4
key=0xf7;
if(key!=0xf7)
{
delay(500);
if(key!=0xf7)
{
switch(key)
{
case 0xe7:num=15;break;// ON/C
case 0xd7:num=0;break;
case 0xb7:num=14;break;// =
case 0x77:num=10;break;// +
}
newkey=1;
delay(500);
while(key!=0xf7)
{
if(flag1)
if(!shu1&&num>=0&&num<=9)
display(num);
else
display(shu1);
}
return num ;
}
}
////// 4
if(!OFF)
{
delay(500);
if(!OFF)
{flag1=0;}
}
return 100;
}
//////////////////显示函数////////////////
void display(unsigned long int dis_shu)
{
uchar dis_flag,dis_aa;
uchar dis_data[6]={0,0,0,0,0,0};
if(dis_shu>99999) dis_flag=6;
else if(dis_shu>9999) dis_flag=5;
else if(dis_shu>999) dis_flag=4;
else if(dis_shu>99) dis_flag=3;
else if(dis_shu>9) dis_flag=2;
else dis_flag=1;
for(dis_aa=0;dis_aa<dis_flag;dis_aa++)
{
dis_data[dis_aa]=dis_shu%10;
dis_shu=dis_shu/10;
}
//数码管段选
for(dis_aa=0;dis_aa<dis_flag;dis_aa++)
{
duan=Duan[dis_data[dis_aa]];
wei=Wela[dis_aa];
delay(100);
wei=0xff;
}
//数码管位选
}