📄 calculator_1.c
字号:
/***********计算器************/
/*****可处理小数的乘法运算****/
/**数码管动态显示六位数字*****/
/**P0段选P1位选P2矩阵键盘(4*4)*/
/*********0 1 2 3*************/
/*********4 5 6 7*************/
/*********8 9 .clr************/
/*********+ - * =*************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code wordcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x71};
long int weiq[]={1,10,100,1000,10000,100000}; //位权
float weiqp[]={0.1,0.01,0.001,0.0001,0.00001,0.0000001};
uchar duan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar a[6];
uchar b[6];
uchar c[6];
uchar disi; //显示标志在中断显示正使用记录显示到哪一位
float af,bf,cf; //参加运算的浮点数
char key; //键值
char abs; //a,b,s的标志
char addsub; //加减运算标志1加 2减 3乘
uchar apoint,bpoint,cpoint; // 小数点的位置1-6 1表示有一位整数 6表示6位整数 没有小数
uchar adeepth,bdeepth,cdeepth; //数组深度可以理解为要显示的位数
/******延时******/
void delay(uchar xms)
{
uint i,j;
for(i=xms*10;i>0;i--)
for(j=20;j>0;j--);
}
/******键盘扫描翻转法******/
/********无键按下返回-5****/
/******判断是否大于0*******/
char keyscan()
{
uchar line=0,row=0,P2temp;
P2=0xf0;
P2temp=P2;
if(P2temp!=0xf0)
{
TR0=0;
delay(10);
TR0=1;
if(P2temp!=0xf0)
{
switch(P2temp)
{
case 0x70:row=1;break;
case 0xb0:row=2;break;
case 0xd0:row=3;break;
case 0xe0:row=4;break;
}
}
P2=0x0f;
P2temp=P2;
switch(P2temp)
{
case 0x07:line=1;break;
case 0x0b:line=2;break;
case 0x0d:line=3;break;
case 0x0e:line=4;break;
}
}
return((row-1)*4+line-1);
}
/*******将数组的六个数转换成一个浮点数********/
float convent(uchar *array,uchar point,uchar deepth)
{
uchar i;
float temp=0;
for(i=0;i<point;i++) //计算整数部分
{
temp=temp+array[i]*weiq[point-1-i];
}
for(i=0;i<deepth-point;i++)
{ //计算小数部分
temp=temp+array[point+i]*weiqp[i];
}
return(temp);
}
/******获得结果的小数点位置******/
void getcpoint()
{
if(cf>0&&cf<10)cpoint=1;
else if (cf>=10&&cf<100)cpoint=2;
else if (cf>=100&&cf<1000)cpoint=3;
else if (cf>=1000&&cf<10000)cpoint=4;
else if (cf>=10000&&cf<100000)cpoint=5;
else if (cf>=100000&&cf<1000000)cpoint=6;
}
/********分离每位数用于显示********/
void cut()
{
uchar i;
long int cut ;
cdeepth=6;
cut=cf*weiq[6-cpoint]; // 先乘一系数取六位整数
c[0]=cut/weiq[5]; //最高位
for(i=1;i<6;i++)
{
c[i]=(cut%weiq[6-i])/weiq[5-i];
}
if(c[5]==0)
{
cdeepth=5;
if(c[4]==0)
{
cdeepth=4;
if(c[3]==0)
{
cdeepth=3;
if(c[2]==0)
{
cdeepth=2;
if(c[1]==0)
{
cdeepth=1;
if(c[0]==0)
cdeepth=0;
}
}
}
}
}
}
/**********运算**********/
void opreat()
{
af=convent(a,apoint,adeepth); //计算出浮点数
bf=convent(b,bpoint,bdeepth);
if(addsub==1)
cf=af+bf;
if(addsub==2)
cf=af-bf;
if(addsub==3)
cf=af*bf;
getcpoint();
cut();
}
void init()
{
uchar i;
TMOD=0x01; //定时器0 工作方式1
TH0=0xf8;
TL0=0xcc; //2ms
EA=1;
ET0=1;
TR0=1;
for(i=0;i<6;i++)
{
a[i]=0;
b[i]=0;
c[i]=0;
}
apoint=0;
bpoint=0;
cpoint=0;
adeepth=0;
bdeepth=0;
cdeepth=0;
addsub=0;
abs=0;
// disi=0;
}
main()
{
char P2temp;
init();
while(1)
{
key=keyscan();
do
{
P2=0xf0;
P2temp=P2;
}
while((P2temp&0xf0)!=0xf0);
if(key<=9&&key>=0)
{
if(abs==0&&adeepth<=6) //六位数未满 接收数
{
if(adeepth==0&&key==0)
{
apoint=1;
adeepth=1;
}
else
{ //将数存到a
a[adeepth]=key;
adeepth++;
}
}
if(abs==1&&bdeepth<=6) //将数传到b
{
if(bdeepth==0&&key==0)
{
bpoint=1;
bdeepth=1;
}
else
{
b[bdeepth]=key;
bdeepth++;
}
}
}
if(key==10)
{ //小数点 记录小数点的位置
if(abs==1&&bpoint==0)bpoint=bdeepth;
if(abs==0&&apoint==0)apoint=adeepth;
}
if(key==12&&abs==0)
{
abs=1; //加号
addsub=1; //加减标志 1加2 减
}
if(key==13&&abs==0)
{
abs=1; //减
addsub=2;
}
if(key==14&&abs==0)
{
abs=1; //减
addsub=3;
}
if(key==15&&abs==1)
{
if(apoint==0)apoint=adeepth;
if(bpoint==0)bpoint=bdeepth;
opreat();
abs=2;
}
if(key==11)init();
}
}
void display() interrupt 1
{
TH0=0xF8;
TL0=0xcc;
if(abs==0)
{
if(disi!=adeepth)
{
P1=duan[adeepth-disi-1];
if((apoint!=0)&&(disi==apoint-1)) //有小数点
P0=wordcode[a[disi]]|0x80;
else
P0=wordcode[a[disi]];
disi++;
}
else disi=0;
}
if(abs==1)
{
if(disi!=bdeepth)
{
P1=duan[bdeepth-disi-1];
if((bpoint!=0)&&(disi==bpoint-1)) //有小数点
P0=wordcode[b[disi]]|0x80;
else
P0=wordcode[b[disi]];
disi++;
}
else disi=0;
}
if(abs==2)
{
if(disi!=cdeepth)
{
P1=duan[cdeepth-disi-1];
if((cpoint!=0)&&(disi==cpoint-1)) //有小数点
P0=wordcode[c[disi]]|0x80;
else
P0=wordcode[c[disi]];
disi++;
}
else disi=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -