⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator_1.c

📁 keil开发51加减乘计算器 都说单片机做乘法很吃力 自己做了一个乘法计算器 感觉还可以 至少我没感觉有多慢
💻 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 + -