功能实现
加(12)减(13)乘(14)除(15) 等于(11),清0(K3),退位(K4),在第一次运算结果上继续运算,负数输入(10),负数运算,最大显示9999999
难点以及重点,注意延迟消抖,判断按键状态,用一个数保留前一次的结果,通过数组移位实现输入,退位,然后注意变量long /unsigned long/ 这些的取值范围这些
思路大致如下
分为3个模块
目录
1 检测输入
2 显示函数
3 计算函数
void keyscan()
{
{
u8 temp;
P1 = 0x0f;
delayms(10);
temp = P1^0x0f;
switch(temp)
{
case 1:kn = 0;break;
case 2:kn = 1;break;
case 4:kn = 2;break;
case 8:kn = 3;break;
}
P1 = 0xf0;
temp = P1>>4^0x0f;
switch(temp)
{
case 1:kn += 0;break;
case 2:kn += 4;break;
case 4:kn += 8;break;
case 8:kn += 12;break;
}
delayms(4000);
if(kn==0||kn==1||kn==2||kn==3||kn==4||kn==5||kn==6||kn==7||kn==8||kn==9)
{
flag=1;
}
else if(kn==10)
{
Num[7]=16;
}
}
}
void show()
{
int i=0;
for(; i<8;i++)
{
P2=i*4;
P0=seg[Num[i]];
delayms(10);
}
}
void clac()
{
int i;
long a,b,c;
if(flag==1)
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key2==0)
{
delayms(20);
if(key2==0)
{
for(i=0;i<8;i++)
Num[i]=0;
while(!key2);
show();
}
}
else if(key3==0)
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
while(!key3);
show();
}
}
else if(kn==12)
{ if (Num[7]==16)
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan();
if(kn==11) break;
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0)
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
while(!key3);
show();
}
}
}
if (Num[7]==16)
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a+b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
else if(kn==13)
{
if (Num[7]==16)
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan();
if(kn==11) break; //µÈºÅ
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0)
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
show();
while(!key3);
}
}
}
if (Num[7]==16)
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a-b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
else if(kn==14)
{
if (Num[7]==16)
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan();
if(kn==11) break;
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0)
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
show();
while(!key3);
}
}
}
if (Num[7]==16)
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a*b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
else if(kn==15)
{
if (Num[7]==16)
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan();
if(kn==11) break;
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0)
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
show();
while(!key3);
}
}
}
if (Num[7]==16)
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a/b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
}
Keil
里面的注释粘过来乱码了,自己理解一下吧,挺简单的。
主函数如下
void main()
{
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan();
clac();
}
}
难点以及重点,注意延迟消抖,判断按键状态,用一个数保留前一次的结果,通过数组移位实现输入,然后注意变量long /unsigned long/ 这些的取值范围这些
完整代码如下
#include
#include
typedef unsigned char u8;//0-255
typedef unsigned int u16;//0-65535
typedef unsigned char uchar;//0-255
typedef unsigned int uint;//0-65535
typedef unsigned long u32;//0-4294967295
//long -2147483648~+2147483647
/* bit £¨ÀàËÆbool£©/sbit È¡Öµ0»ò1 */
sbit key0 = P3^1;
sbit key1 = P3^0;
sbit key2 = P3^2;
sbit key3 = P3^3;
sbit led0 = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit led3 = P2^3;
u8 code seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,0x40};//: 0x40 -
int Num [8]={0}; //±£´æ½á¹û
int kn = 0;
int flag;//Åжϰ´(0~9)
void delayms(u16 n)//ms
{
while(n--)
{
u8 c = 10;
while(c--);
}
}
void keyscan()
{
{
u8 temp;
P1 = 0x0f;
delayms(10);
temp = P1^0x0f;
switch(temp)
{
case 1:kn = 0;break;
case 2:kn = 1;break;
case 4:kn = 2;break;
case 8:kn = 3;break;
}
P1 = 0xf0;
temp = P1>>4^0x0f;
switch(temp)
{
case 1:kn += 0;break;
case 2:kn += 4;break;
case 4:kn += 8;break;
case 8:kn += 12;break;
}
delayms(4000);
if(kn==0||kn==1||kn==2||kn==3||kn==4||kn==5||kn==6||kn==7||kn==8||kn==9)
{
flag=1;
}
else if(kn==10)
{
Num[7]=16;
}
}
}
void show()
{
int i=0;
for(; i<8;i++)
{
P2=i*4;
P0=seg[Num[i]];
delayms(10);
}
}
void clac()
{
int i;
long a,b,c; //¼Ç¼ÔËËã±äÁ¿
if(flag==1) //(¼Ç¼°´¼ü)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key2==0) //Çå0
{
delayms(20);
if(key2==0)
{
for(i=0;i<8;i++)
Num[i]=0;
while(!key2);
show();
}
}
else if(key3==0) //ÍËλ
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
while(!key3);
show();
}
}
else if(kn==12)// ¼Ó·¨ÔËËã
{ if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan(); //¼Ç¼°´¼ü
if(kn==11) break; //µÈºÅ
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0) //ÍËλ
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
while(!key3);
show();
}
}
}
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a+b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
else if(kn==13)// ¼õ·¨ÔËËã
{
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan(); //¼Ç¼°´¼ü
if(kn==11) break; //µÈºÅ
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0) //ÍËλ
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
show();
while(!key3);
}
}
}
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a-b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
else if(kn==14)// ³Ë
{
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan(); //¼Ç¼°´¼ü
if(kn==11) break; //µÈºÅ
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0) //ÍËλ
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
show();
while(!key3);
}
}
}
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a*b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
else if(kn==15)// ³ý·¨ÔËËã
{
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
a=-a;
}
else
a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
for(i=0;i<8;i++)
Num[i]=0;
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan(); //¼Ç¼°´¼ü
if(kn==11) break; //µÈºÅ
if(flag==1)
{
for(i=6;i>0;i--)
{Num[i]=Num[i-1];}
Num[0]=kn;
flag=0;
}
else if(key3==0) //ÍËλ
{
delayms(20);
if(key3==0)
{
for(i=1;i<7;i++)
{
Num[i-1]=Num[i];
}
show();
while(!key3);
}
}
}
if (Num[7]==16) //˵Ã÷ÊǸºÊý
{
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
b=-b;
}
else
b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
c=a/b;
if(c<0)
{
c=-c;
Num[7]=16;
}
Num[0]=c%10;
Num[1]=c/10%10;
Num[2]=c/100%10;
Num[3]=c/1000%10;
Num[4]=c/10000%10;
Num[5]=c/100000%10;
Num[6]=c/1000000%10;
show();
}
}
void main()
{
while(1)
{
show();
P1 = 0xf0;
if(P1 != 0xf0)
keyscan(); //¼Ç¼°´¼ü
clac();
}
}
有些乱码但不重要,觉得有用麻烦点个赞!!
有问题下方评论,互相讨论!