📄 caculator.c
字号:
#include <reg51.h>
#include <absacc.h>
#include <math.h>
#define uchar unsigned char
#define scan XBYTE[0xa100] // /*键盘*/
sbit p1_7=P1^7;
sbit p1_6=P1^6;
bit vkey=0;
bit ss=0; /*显示数组标志位*/
bdata uchar sss[]={1,1}; /*是否显示标志位*/
bdata uchar knot[]={0,0};//小数点标志位
uchar n=0;/*显示位数*/
uchar mmm[]={0,0};/*x,y的位数*/
float x,y;/*两个操作数*/
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x46,0xa1,0x86,0x8e,0xee,0xbf};//16,17 是 R,-
uchar idata *d=table;
uchar key; /*键值*/
uchar leddata0[9];
uchar leddata1[9];
void delay(unsigned int xx) /*延迟xx ms */
{uchar j;
while(xx--){
for(j=0;j<125;j++)
{;}
}
return;
}
void disp0(uchar n)
{
if(knot[0]!=n)
{XBYTE[0xa000+n]=table[leddata0[n]];}
else
{XBYTE[0xa000+n]=table[leddata0[n]]+0x80;}
return;
}
void disp1(uchar n)
{if(knot[1]!=n)
{XBYTE[0xa000+n]=table[leddata1[n]];}
else
{XBYTE[0xa000+n]=table[leddata1[n]]+0x80;}
return;
}
void myled(void) interrupt 1 /*中断显示一位LED*/
{TH0=0x0e0;
TL0=0x18;
TR0=1;
n=n%8;
if(!ss)disp0(n);
if(ss)disp1(n);
n++;
return;
}
void error(void)
{ EA=0;
while(1){
XBYTE[0Xa004]=0x86;
delay(1);
XBYTE[0xa003]=0x0ce;
delay(1);
XBYTE[0xa002]=0x0ce;
delay(1);
XBYTE[0xa001]=0xc0;
delay(1);
XBYTE[0xa000]=0x0ce;
delay(1);
}
return;
}
void scan1(void)
{p1_7=p1_6=0;
key=scan;
p1_7=p1_6=1;
key=~key;
return;
}
void scan0(void)
{p1_6=0;
p1_7=1;
key=scan;
key=~key;
p1_6=1;
if(key!=0)
{ switch(key)
{
case 1 : key=0;break;
case 2 : key=1;break;
case 4 : key=2;break;
case 8 : key=3;break;
case 16 :key=4;break;
case 32 :key=5;break;
case 64 :key=6;break;
case 128 :key=7;break;
}
return;
}
p1_6=1;
p1_7=0;
key=scan;
key=~key;
p1_7=1;
if(key!=0)
{switch(key)
{
case 1 : key=8;break;
case 2 : key=9;break;
case 4 : key=0x0a;break;
case 8 : key=0x0b;break;
case 16 :key=0x0c;break;
case 32 :key=0x0d;break;
case 64 :key=0x0e;break;
case 128 :key=0x0f;break;
}
return;
}
return;
}
void led8()
{uchar k,pot=0;
float temp;
sss[0]=0xff;
temp=x;
while(temp<10000000)
{temp=temp*10;
pot++;
}
if(pot<=7)
{for(k=0;k<=7;k++) /*有整数位*/
{leddata0[k]=((signed long)temp)%10;
temp=((signed long)temp)/10;
}
knot[0]=pot;
//for(k=0;k<=pot;k++)knot[0]=knot[0]*2;
}
else
{ for(k=7;k>=15-pot;k--)
{leddata0[k]=0;
temp=((signed long)temp)/10;
}
for(k=0;k<=14-pot;k++)
{leddata0[k]=((signed long)temp)%10;
temp=((signed long)temp)/10;
}
knot[0]=7;
return;
}
return;
}
void myadd(void)
{x=x+y;
if(x>=100000000) error();
led8();
return;
}
void mysub(void)
{uchar k,pot=0;
float temp;
x=x-y;
if(x>=0)
{if(x>=100000000) error();
led8();
return;
}
else
{temp=-x;
if(temp>=10000000)error();
leddata0[7]=17;
while(temp<1000000)
{temp=temp*10;
pot++;
}
if(pot<=6)
{for(k=0;k<=6;k++)
{leddata0[k]=((signed long)temp)%10;
temp=((signed long)temp)/10;
}
knot[0]=pot;
}
else
{for(k=6;k>=13-pot;k--)
{leddata0[k]=0;
temp=((signed long)temp)/10;
}
for(k=0;k<=12-pot;k++)
{leddata0[k]=((signed long)temp)%10;
temp=((signed long)temp)/10;
}
knot[0]=6;
}
return;
}
return;
}
void mymul(void)
{x=x*y;
if(x>100000000)error();
led8();
return;
}
void mydiv(void)
{x=x/y;
if(x>=100000000) error();
led8();
return;
}
main()
{uchar k=0,keynum,cal,sum,ii,knotnum[2]={0,0};
float keynum0;
bit myequ=0,myknot=0;
TMOD=0x00;
EA=1;
ET0=1;
TH0=0xe0;
TL0=0x18;
TR0=1;
while(1)
{
scan1();
if(key!=0)
{delay(10);
scan1();
if(key!=0)
{vkey=1; //有键按
scan0();
keynum=key;
while(vkey){scan1();if(key==0)vkey=0;}
// leddata0[k]=keynum;
// k++;
switch(keynum)
{
case 0x0a: cal=0;ss=1;myknot=0;break;
case 0x0b: cal=1;ss=1;myknot=0;break;
case 0x0c: cal=2;ss=1;myknot=0;break;
case 0x0d: cal=3;ss=1;myknot=0;break;
case 0x0e: myequ=1;
switch(cal)
{ case 0: myadd();ss=0;break;
case 1: mysub();ss=0;break;
case 2: mymul();ss=0;break;
case 3: mydiv();ss=0;break;
}
case 0x0f: if(!myknot&!myequ)
{myknot=1;
//if(!ss)
// {knot[0]=1;
// for(k=1;k<=mmm[0];k++)knot[0]=knot[0]*2;
// }
// if(ss)
// { knot[1]=1;
// for(k=1;k<=mmm[1];k++)knot[1]=knot[1]*2;
// }
break;
}
break;
default:
if(myequ)ss=1;
if(!myknot)
{sum=1;
{if(!ss)ii=0;
if(ss) ii=1;
if(mmm[ii]>7) error();
if(!ss){
for(k=6;k>=1;k--)
leddata0[k+1]=leddata0[k];
leddata0[1]=leddata0[0];
leddata0[0]=keynum;
x=x*10+keynum;
}
if(ss){
for(k=6;k>=1;k--)
leddata1[k+1]=leddata1[k];
leddata1[1]=leddata1[0];
leddata1[0]=keynum;
y=y*10+keynum;
}
mmm[ii]++;
for(k=0;k<mmm[ii];k++) sum=sum*2;
if(!ss) sss[0]=sss[0]+sum;
if(ss) sss[1]=sss[1]+sum;
}
}
if(myknot)
{sum=1;
{if(!ss)ii=0;
if(ss) ii=1;
if(mmm[ii]>7)error();
if(!ss){
for(k=6;k>=1;k--)
leddata0[k+1]=leddata0[k];
leddata0[1]=leddata0[0];
leddata0[0]=keynum;
keynum0=keynum;
knotnum[ii]++;
for(k=0;k<knotnum[ii];k++)keynum0=keynum0*0.1;
x=x+keynum0;
knot[0]++;
//leddata0[0]=knot[0];
}
if(ss){
for(k=6;k>=1;k--)
leddata1[k+1]=leddata1[k];
leddata1[1]=leddata1[0];
leddata1[0]=keynum;
keynum0=keynum;
knotnum[ii]++;
for(k=0;k<knotnum[ii];k++)keynum0=keynum0*0.1;
y=y+keynum0;
knot[1]++;
}
mmm[ii]++;
for(k=0;k<mmm[ii];k++)sum=sum*2;
sss[ii]=sss[ii]+sum;
}
}
}
}
}
} }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -