|
我是个初学者。不知道是不是自己太激进了。学完矩阵键盘就直接写了计算器程序。
应该是只有等于之后的数据处理和处理后的显示那一块出了问题
六位数的整数显示也有问题。
先看代码。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit buzzer=P3^6;
uchar wei1,wei2,wei3,wei4,wei5,wei6,wei7,wei8;
uchar sign=0; //判断是否按了加、减、乘、除
uchar dotnum; //小数点后第几位
uchar dotnum1,dotnum2,dotnum3,dotnum4,dotnum5,dotnum6;
uchar numdot1;numdot2,numdot3,numdot4,numdot5,numdot6; //小数点后第几位
float floatnum1,num1,floatnum2,num2,num;
int intnum1,intnum2;
uint intnum;floatnum;
uchar add,sub,mul,div,dot,equal,overflow; //运算加、减、乘、除、点、等于
uchar code d[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff/*20空*/,0xbf/*21横杠_错误*/};
sbit P27=P2^7;
sbit P26=P2^6;
sbit P25=P2^5;
sbit P24=P2^4;
sbit P23=P2^3;
sbit P22=P2^2;
sbit P21=P2^1;
sbit P20=P2^0;
void beep() //数据超过6位时响
{
uint i,j;
for(i=0;i<100;i++)
{
buzzer=0;
for(j=57;j>0;j--);
buzzer=1;
for(j=57;j>0;j--);
}
}
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display() //数码管显示
{
P0=d[wei1];P27=0;
delayms(1);P27=1;
P0=d[wei2];P26=0;
delayms(1);P26=1;
P0=d[wei3];P25=0;
delayms(1);P25=1;
P0=d[wei4];P24=0;
delayms(1);P24=1;
P0=d[wei5];P23=0;
delayms(1);P23=1;
P0=d[wei6];P22=0;
delayms(1);P22=1;
}
void move() //数码管移动函数
{
if(equal==1)
{
wei6=wei5=wei4=wei3=wei2=wei1=20;
equal=0;
}
if(wei6!=20){beep();overflow=1;}
else
{
wei6=wei5;
wei5=wei4;
wei4=wei3;
wei3=wei2;
wei2=wei1;
}
}
long int intsum() //求小数点之前的和
{
char w1=wei1,w2=wei2,w3=wei3,w4=wei4,w5=wei5,w6=wei6;
long int numadd;
if(w6==20)w6=0;
if(w5==20)w5=0;
if(w4==20)w4=0;
if(w3==20)w3=0;
if(w2==20)w2=0;
if(w1==20)w1=0;
numadd=w1+w2*10+w3*100+w4*1000+w5*10000+w6*100000;
return numadd;
}
float floatsum(float x) //求小数点后的和
{
int i;
dotnum++;
for(i=0;i<dotnum;i++)
x*=0.1;
return x;
}
void signdefaultf() //运算符操作函数
{
if(dot==0)
{
intnum1=intsum();
floatnum1=0;
}
num1=intnum1+floatnum1;
wei1=wei2=wei3=wei4=wei5=wei6=20;
dotnum=0;
dot=0;
equal=0;
add=sub=mul=div=0;
sign=1;
}
void determine() //决定计算后的位数
{
if(numdot6!=0)
{
if(numdot1>9)numdot1-=10;
wei6=numdot6;
wei5=numdot5;
wei4=numdot4;
wei3=numdot3;
wei2=numdot2;
wei1=numdot1;
}
if(numdot6==0&&numdot5!=0)
{
if(dotnum2!=0||dotnum1!=0)
{
wei6=numdot5;
wei5=numdot4;
wei4=numdot3;
wei3=numdot2;
wei2=numdot1;
if(dotnum1!=9&&dotnum2>4)dotnum++;
wei1=dotnum1;
}
else
{
wei6=20;
wei5=numdot5;
wei4=numdot4;
wei3=numdot3;
wei2=numdot2;
wei1=numdot1;
}
}
while(numdot6==0&&numdot5==0&&numdot4!=0)
{
if(dotnum2!=0)
{
wei6=numdot4;
wei5=numdot3;
wei4=numdot2;
wei3=numdot1;
wei2=dotnum1;
wei1=dotnum2;
break;
}
if(dotnum1!=0)
{
wei6=20;
wei5=numdot4;
wei4=numdot3;
wei3=numdot2;
wei2=numdot1;
wei1=dotnum1;
break;
}
else
{
wei6=20;
wei5=20;
wei4=numdot4;
wei3=numdot3;
wei2=numdot2;
wei1=numdot1;
break;
}
}
while(numdot6==0&&numdot5==0&&numdot4==0&&numdot3!=0)
{
if(dotnum3!=0)
{
wei6=numdot3;
wei5=numdot2;
wei4=numdot1;
wei3=dotnum1;
wei2=dotnum2;
wei1=dotnum3;
break;
}
if(dotnum2!=0)
{
wei6=20;
wei5=numdot3;
wei4=numdot2;
wei3=numdot1;
wei2=dotnum1;
wei1=dotnum2;
break;
}
if(dotnum1!=0)
{
wei6=20;
wei5=20;
wei4=numdot3;
wei3=numdot2;
wei2=numdot1;
wei1=dotnum1;
break;
}
else
{
wei6=20;
wei5=20;
wei4=20;
wei3=numdot3;
wei2=numdot2;
wei1=numdot1;
break;
}
}
while(numdot6==0&&numdot5==0&&numdot4==0&&numdot3==0&&numdot2!=0)
{
if(dotnum4!=0)
{
wei6=numdot2;
wei5=numdot1;
wei4=dotnum1;
wei3=dotnum2;
wei2=dotnum3;
wei1=dotnum4;
break;
}
if(dotnum3!=0)
{
wei6=20;
wei5=numdot2;
wei4=numdot1;
wei3=dotnum1;
wei2=dotnum2;
wei1=dotnum3;
break;
}
if(dotnum2!=0)
{
wei6=20;
wei5=20;
wei4=numdot2;
wei3=numdot1;
wei2=dotnum1;
wei1=dotnum2;
break;
}
if(dotnum1!=0)
{
wei6=20;
wei5=20;
wei4=20;
wei3=numdot2;
wei2=numdot1;
wei1=dotnum1;
break;
}
else
{
wei6=20;
wei5=20;
wei4=20;
wei3=20;
wei2=numdot2;
wei1=numdot1;
break;
}
}
while(numdot6==0&&numdot5==0&&numdot4==0&&numdot3==0&&numdot2==0&&numdot1!=0)
{
if(dotnum5!=0)
{
wei6=numdot1;
wei5=dotnum1;
wei4=dotnum2;
wei3=dotnum3;
wei2=dotnum4;
wei1=dotnum5;
break;
}
if(dotnum4!=0)
{
wei6=20;
wei5=numdot1;
wei4=dotnum1;
wei3=dotnum2;
wei2=dotnum3;
wei1=dotnum4;
break;
}
if(dotnum3!=0)
{
wei6=20;
wei5=20;
wei4=numdot1;
wei3=dotnum1;
wei2=dotnum2;
wei1=dotnum3;
break;
}
if(dotnum2!=0)
{
wei6=20;
wei5=20;
wei4=20;
wei3=numdot1;
wei2=dotnum1;
wei1=dotnum2;
break;
}
if(dotnum1!=0)
{
wei6=20;
wei5=20;
wei4=20;
wei3=20;
wei2=numdot1;
wei1=dotnum1;
break;
}
else
{
wei6=20;
wei5=20;
wei4=20;
wei3=20;
wei2=20;
wei1=numdot1;
break;
}
}
while(intnum==0)
{
if(dotnum5!=0)
{
wei6=numdot1;
wei5=dotnum1;
wei4=dotnum2;
wei3=dotnum3;
wei2=dotnum4;
wei1=dotnum5;
break;
}
if(dotnum4!=0)
{
wei6=20;
wei5=numdot1;
wei4=dotnum1;
wei3=dotnum2;
wei2=dotnum3;
wei1=dotnum4;
break;
}
if(dotnum3!=0)
{
wei6=20;
wei5=20;
wei4=numdot1;
wei3=dotnum1;
wei2=dotnum2;
wei1=dotnum3;
break;
}
if(dotnum2!=0)
{
wei6=20;
wei5=20;
wei4=20;
wei3=numdot1;
wei2=dotnum1;
wei1=dotnum2;
break;
}
if(dotnum1!=0)
{
wei6=20;
wei5=20;
wei4=20;
wei3=20;
wei2=numdot1;
wei1=dotnum1;
break;
}
else
{
wei6=20;
wei5=20;
wei4=20;
wei3=20;
wei2=20;
wei1=numdot1;
break;
}
}
}
void equalf() /*最后的计算*/
{
equal=1;
dotnum=0;
dot=0;
if(sign==1)
{
if(dot==0)
{
floatnum2=0;
intnum2=intsum();
}
num2=floatnum2+intnum2;
if(add==1)num=num1+num2;
if(sub==1)num=num1-num2;
if(mul==1)num=num1*num2;
if(div==1)num=num1/num2;
intnum=(int)num;
floatnum=(int)((num-intnum)*1000000);
numdot1=intnum%10;if(floatnum!=0)numdot1+=10;
numdot2=intnum/10%10;
numdot3=intnum/100%10;
numdot4=intnum/1000%10;
numdot5=intnum/10000%10;
numdot6=intnum/100000;
if(numdot6>9){beep();wei1=wei2=wei3=wei4=wei5=wei6=21;}
else
{
dotnum1=floatnum/100000;
dotnum2=floatnum%100000/10000;
dotnum3=floatnum%10000/1000;
dotnum4=floatnum%1000/100;
dotnum5=floatnum%100/10;
dotnum6=floatnum%10;
determine();
}
}
}
void matrixkeyscan() //键盘检测
{
uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp) //第一排!!!
{
case 0xee:
move();if(wei6!=20&&overflow==1)break;
wei1=7;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xde:
move();if(wei6!=20&&overflow==1)break;
wei1=8;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xbe:
move();if(wei6!=20&&overflow==1)break;
wei1=9;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0x7e:
signdefaultf();div=1;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp) //第二排!!!
{
case 0xed:
move();if(wei6!=20&&overflow==1)break;
wei1=4;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xdd:
move();if(wei6!=20&&overflow==1)break;
wei1=5;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xbd:
move();if(wei6!=20&&overflow==1)break;
wei1=6;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0x7d:
signdefaultf();mul=1;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp) //第三排!!!
{
case 0xeb:
move();if(wei6!=20&&overflow==1)break;
wei1=1;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xdb:
move();if(wei6!=20&&overflow==1)break;
wei1=2;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xbb:
move();if(wei6!=20&&overflow==1)break;
wei1=3;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0x7b:
signdefaultf();sub=1;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp) //第四排!!!
{
case 0xe7:
move();if(wei6!=20&&overflow==1)break;
wei1=0;
if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
break;
case 0xd7:
dot=1;
if(sign==0)intnum1=intsum();
else intnum2=intsum();
wei1+=10;
break;
case 0xb7:
equalf();
break;
case 0x77:
signdefaultf();add=1;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
void zero() //清零 (无)
{
add=sub=mul=div=dot=0;
while(1)
{
wei6=wei5=wei4=wei3=wei2=20;
wei1=0;
matrixkeyscan();
if(wei2==0){wei2=20;break;}
display();
}
}
void main()//清零和重输功能暂时没有,需要加入别的按键
{
while(1)
{
zero();
while(1) //缺少等于之后的重新运算能力,相除的时候不能显示小数部分
{
matrixkeyscan();
display();
}
}
}
|
评分
-
查看全部评分
|