使用51单片机实现简单计算器:仅需100行代码,附源码

 不引流,项目最后附上本项目百行源码!!

如果对你有帮助不妨点个赞!

本项目使用:51单片机矩阵键盘四位数码管

使用LCD显示的思路相差不大,由于是仿真,包容性比较强,所以还有很大优化空间

先上仿真图!

先上代码,看不太明白的接着往下看

#include <REGX52.H>		//程序核心:始终显示num,操作改变num
void display(int num1);			//显示函数
void DelayXms(unsigned int x);	//延时函数
void keyScan();					//按键扫描
void keyAdd();					//数字多位输入
void pd();						//判断
int n1, n2, n3, n4, numKey=10000, num=0, num0=0;//显示的个十百千位  键值,显示值,存储值1
char fuhao='0',fuhao0='0';		//键入的符号值,存储的符号值
unsigned char duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void main(){
	while(1){
		keyScan();				//扫描键值
		pd();					//判断键值情况
		display(num);			//显示函数
	}
}
void keyAdd(){              //实现键入多位数的效果
	if(numKey<10000){
		num=num*10+numKey;
		numKey=10000;
	}
}
void pd(){
	keyAdd();				//判断为数字,则为数字输入
	if(fuhao=='c'){			//清零
		num=0;
		num0=0;
		fuhao0='0';
		fuhao='0';
	}
	if(fuhao=='+'){			//加法
		fuhao0='+';			//将符号'+'存到变量fuhao0
		fuhao='0';			//符号清零
		num0=num;			//将加数0存到变量num0
		num=0;
	}
	if(fuhao=='-'){			//减法		
		fuhao0='-';
		fuhao='0';
		num0=num;
		num=0;
	}	
	if(fuhao=='*'){			//乘法		
		fuhao0='*';
		fuhao='0';
		num0=num;
		num=0;
	}	
	if(fuhao=='/'){			//除法
		fuhao0='/';
		fuhao='0';
		num0=num;
		num=0;
	}
	if(fuhao=='='){			//检测到符号为等号,则进行运算
		if(fuhao0=='+')num=num0+num;
		else if(fuhao0=='-')num=num0-num;
		else if(fuhao0=='*')num=num0*num;
		else if(fuhao0=='/')num=num0/num;
		fuhao='0';
		num0=0;
	}
}
void keyScan(){
	P3=0xef;//1110 1111
	if(!P3_3){numKey=7;while(!P3_3);}if(!P3_2){numKey=8;while(!P3_2);}if(!P3_1){numKey=9;while(!P3_1);}if(!P3_0){fuhao='+';while(!P3_0);}
	P3=0xdf;
	if(!P3_3){numKey=4;while(!P3_3);}if(!P3_2){numKey=5;while(!P3_2);}if(!P3_1){numKey=6;while(!P3_1);}if(!P3_0){fuhao='-';while(!P3_0);}
	P3=0xbf;
	if(!P3_3){numKey=1;while(!P3_3);}if(!P3_2){numKey=2;while(!P3_2);}if(!P3_1){numKey=3;while(!P3_1);}if(!P3_0){fuhao='*';while(!P3_0);}
	P3=0x7f;
	if(!P3_3){fuhao='c';while(!P3_3);}if(!P3_2){numKey=0;while(!P3_2);}if(!P3_1){fuhao='=';while(!P3_1);}if(!P3_0){fuhao='/';while(!P3_0);}
}
void display(int num1){        //数码管动态显示
	n4=num1%10;
	n3=num1/10%10;
	n2=num1/100%10;
	n1=num1/1000%10;
	P2=0x01;
	P0=duan[n1];
	DelayXms(4);
	P2=0x02;
	P0=duan[n2];
	DelayXms(4);
	P2=0x04;
	P0=duan[n3];
	DelayXms(4);
	P2=0x08;
	P0=duan[n4];
	DelayXms(4);
}
void DelayXms(unsigned int x)		//@12.000MHz
{	unsigned char i, j;
	while(x--)
	{	i = 2;
		j = 239;
		do{while (--j);
		}while (--i);
	}
}

        实际上有一定编程基础的同学借助代码里的注释应该都能看明白,单片机程序要考虑很多问题,例如数码管的显示需要调动cpu资源,所以在程序的设计上就不能面向过程,而是采用如上面代码所示对各种情况做判断。判断键值,改变不同的参数,通过各种处理函数达到计算器的目的。

        我个人比较菜,喜欢使用全局变量,个人感觉比较直观,喜欢用指针的大神轻喷。

        技术能力有限,欢迎各位在评论区交流指正,使用以下GitHub链接可以直接下载。欢迎大家点赞支持。GitHub – biexuhao/51-jisuanqi: 比较简短的一种实现加减乘除计算功能的计算器,基于51单片机,使用数码管显示

为了方便观看,下面将各个功能分开列出来:

头文件引入,函数声明,定义变量

#include <REGX52.H>		//程序核心:始终显示num,操作改变num
void display(int num1);			//显示函数
void DelayXms(unsigned int x);	//延时函数
void keyScan();					//按键扫描
void keyAdd();					//数字多位输入
void pd();						//判断
int n1, n2, n3, n4, numKey=10000, num=0, num0=0;//显示的个十百千位  键值,显示值,存储值1
char fuhao='0',fuhao0='0';		//键入的符号值,存储的符号值
unsigned char duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

主函数

void main(){
	while(1){
		keyScan();				//扫描键值
		pd();					//判断键值情况
		display(num);			//显示函数
	}
}

多位数字的键入实现函数

void keyAdd(){
	if(numKey<10000){
		num=num*10+numKey;
		numKey=10000;
	}
}

键值判断函数

void pd(){
	keyAdd();				//判断为数字,则为数字输入
	if(fuhao=='c'){			//清零
		num=0;
		num0=0;
		fuhao0='0';
		fuhao='0';
	}
	if(fuhao=='+'){			//加法
		fuhao0='+';			//将符号'+'存到变量fuhao0
		fuhao='0';			//符号清零
		num0=num;			//将加数0存到变量num0
		num=0;
	}
	if(fuhao=='-'){			//减法		
		fuhao0='-';
		fuhao='0';
		num0=num;
		num=0;
	}	
	if(fuhao=='*'){			//乘法		
		fuhao0='*';
		fuhao='0';
		num0=num;
		num=0;
	}	
	if(fuhao=='/'){			//除法
		fuhao0='/';
		fuhao='0';
		num0=num;
		num=0;
	}
	if(fuhao=='='){			//检测到符号为等号,则进行运算
		if(fuhao0=='+')num=num0+num;
		else if(fuhao0=='-')num=num0-num;
		else if(fuhao0=='*')num=num0*num;
		else if(fuhao0=='/')num=num0/num;
		fuhao='0';
		num0=0;
	}
}

矩阵键盘扫描函数

void keyScan(){
	P3=0xef;//1110 1111
	if(!P3_3){numKey=7;while(!P3_3);}if(!P3_2){numKey=8;while(!P3_2);}if(!P3_1){numKey=9;while(!P3_1);}if(!P3_0){fuhao='+';while(!P3_0);}
	P3=0xdf;
	if(!P3_3){numKey=4;while(!P3_3);}if(!P3_2){numKey=5;while(!P3_2);}if(!P3_1){numKey=6;while(!P3_1);}if(!P3_0){fuhao='-';while(!P3_0);}
	P3=0xbf;
	if(!P3_3){numKey=1;while(!P3_3);}if(!P3_2){numKey=2;while(!P3_2);}if(!P3_1){numKey=3;while(!P3_1);}if(!P3_0){fuhao='*';while(!P3_0);}
	P3=0x7f;
	if(!P3_3){fuhao='c';while(!P3_3);}if(!P3_2){numKey=0;while(!P3_2);}if(!P3_1){fuhao='=';while(!P3_1);}if(!P3_0){fuhao='/';while(!P3_0);}
}

数码管动态显示函数

void display(int num1){
	n4=num1%10;
	n3=num1/10%10;
	n2=num1/100%10;
	n1=num1/1000%10;
	P2=0x01;
	P0=duan[n1];
	DelayXms(4);
	P2=0x02;
	P0=duan[n2];
	DelayXms(4);
	P2=0x04;
	P0=duan[n3];
	DelayXms(4);
	P2=0x08;
	P0=duan[n4];
	DelayXms(4);
}

最后是延时函数

void DelayXms(unsigned int x)		//@12.000MHz
{	unsigned char i, j;
	while(x--)
	{	i = 2;
		j = 239;
		do{while (--j);
		}while (--i);
	}
}

      


物联沃分享整理
物联沃-IOTWORD物联网 » 使用51单片机实现简单计算器:仅需100行代码,附源码

发表评论