#include
#define uchar unsigned char
#define uint unsigned int
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit first=P2^2;
sbit second=P2^3;
sbit third=P2^4;
uchar code table[]={
0x3f,0x06,0x05b,0x04f,0x66,
0x06d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay10ms(void); // 声明延时子程序//
void display(long); //声明显示子程序//
void equal(uchar); //声明计算子程序//
void keyscan(); //声明键盘子程序//
long Cal_Value,Value_a,Value_b; //全局定义//
uchar a,b,c,x,fuhao,err; //a为第一次显示数值的标记,b为第二次显示数值的标记,//
//c为运算符号显示形式选择位,x为功能选择标记,fuhao是运算后负号选择位,err错误标记//
void main()
{
while(1)
{
keyscan();
if(x==0)
display(Value_a); //显示第一次输入//
else if(x>0&&x<5)
{
if(c==1){display(x);} //显示运算符号//
else {display(Value_b);} //显示第二次输入//
}
else display(Cal_Value);
}
}
void keyscan() //按键子程序//
{
uchar KeyValue;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f) //读取按键是否按下
{
delay10ms(); //延时10ms进行消抖
if(GPIO_KEY!=0x0f) //再次检测键盘是否k按下
{
GPIO_KEY=0X0F; //测试列
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_KEY=0XF0; //测试行
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while(GPIO_KEY!=0xf0); //检测按键松手检测
if(KeyValue<10) //按键总值计算//
{
if(a<6){Value_a=(Value_a)*10+KeyValue;b=6;if(Value_a!=0)a++;} //必须先显示第一次输入的数据,只能显示5位数,最高一位显示运算符号//
if(b<6){Value_b=(Value_b)*10+KeyValue;a=6;c=0;if(Value_b!=0)b++;} //按下功能键后只能显示第二次输入的数据//
}
else
{
switch(KeyValue) /*功能键选择*/
{
case (10):a=7;b=0;x=1;c=1;break; //加x=1/
case (11):a=7;b=0;x=2;c=1;break; //减x=2/
case (14):a=7;b=7;equal(x);x=5;c=0;break; //等x=5/
case (15):{a=0;b=0;x=0;c=0;fuhao=0;err=0;Value_a=0;Value_b=0;Cal_Value=0;} //清零//
}
}
} //按键赋值程序
}
}
void display(long disvalue) //显示子程序//
{
uchar ge,shi,bai,qian,wan;
uchar DisplayData[8],n;
//将显示值分开成位显示//
wan=disvalue%100000/10000;
qian=disvalue%10000/1000;
bai=disvalue%1000/100;
shi=disvalue%100/10;
ge=disvalue%10;
DisplayData[0]=table[ge]; //准备循环显示//
DisplayData[1]=table[shi];
DisplayData[2]=table[bai];
DisplayData[3]=table[qian];
DisplayData[4]=table[wan];
if(c==1) //最高位数码管显示加减乘除符号//
{
switch(disvalue)
{
case (1):first=1;second=1;third=1;GPIO_DIG=0x70;break; //显示1-代表+//
case (2):first=1;second=1;third=1;GPIO_DIG=0X40;break; //显示-代表-//
}
}
else
{
if(disvalue>32767) //计算数值溢出,显示ov//
{
for(n=0;n<2;n++)
{
switch(n)
{
case (0): first=1;second=1;third=1;GPIO_DIG=0x79;break;
}
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
}
else if(disvalue>999) //显示4位//
{
for(n=0;n<4;n++)
{
switch(n)
{
case (0): first=0;second=0;third=0;break;
case (1): first=1;second=0;third=0;break;
case (2): first=0;second=1;third=0;break;
case (3): first=1;second=1;third=0;break;
}
GPIO_DIG=DisplayData[n];
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
if(fuhao==1) //当计算结果为负数,最高位显示负号//
{
GPIO_DIG=0X40;
first=1;second=1;third=1;
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
}
else if(disvalue>99) //显示3位//
{
for(n=0;n<3;n++)
{
switch(n)
{
case (0): first=0;second=0;third=0;break;
case (1): first=1;second=0;third=0;break;
case (2): first=0;second=1;third=0;break;
}
GPIO_DIG=DisplayData[n];
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
if(fuhao==1) //当计算结果为负数,最高位显示负号//
{
GPIO_DIG=0X40;
first=1;second=1;third=1;
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
}
else if(disvalue>9) //显示2位//
{
for(n=0;n<2;n++)
{
switch(n)
{
case (0): first=0;second=0;third=0;break;
case (1): first=1;second=0;third=0;break;
}
GPIO_DIG=DisplayData[n];
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
if(fuhao==1) //当计算结果为负数,最高位显示负号//
{
GPIO_DIG=0X40;
first=1;second=1;third=1;
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
}
else //显示1位//
{
GPIO_DIG=DisplayData[0];
first=0;second=0;third=0;
if(fuhao==1) //当计算结果为负数,最高位显示负号//
{
delay10ms(); //延时//
GPIO_DIG=0; //消影//
GPIO_DIG=0X40;
first=1;second=1;third=1;
delay10ms(); //延时//
GPIO_DIG=0; //消影//
}
}
}
}
void equal(uchar x) //加减计算子程序//
{
switch(x) //功能键选择//
{
case 1:Cal_Value=Value_a+Value_b;break; //加 x=1//
case 2:if(Value_a>=Value_b){Cal_Value=Value_a-Value_b;} //减 x=2 //
else{Cal_Value=Value_b-Value_a;fuhao=1;} //差为负数,fuhao符号标记1//
break;
}
}
void delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}