任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,利用矩阵键盘定义0~9数字键,并定义+、-、*、/、=等五个功能键。编程实现两个一位十进制数的四则运算,并显示结果。

项目三简易计算器 任务3-4四则运算计算器_单片机

项目三简易计算器 任务3-4四则运算计算器_单片机_02

项目三简易计算器 任务3-4四则运算计算器_单片机_03

项目三简易计算器 任务3-4四则运算计算器_矩阵键盘_04

 注意:与运算&&-->两个条件并列

位于运算&-->按位完成与,完成指定位置清零。

最低位清零^1111 1110

最高位清零^0111 1111

项目三简易计算器 任务3-4四则运算计算器_四则运算_05


项目三简易计算器 任务3-4四则运算计算器_矩阵键盘_06

项目三简易计算器 任务3-4四则运算计算器_单片机_07

/*************************
项目名称:项目三简易计算器
任务名称:任务3-4四则运算计算器
任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,
					利用矩阵键盘定义0~9数字键,并定义+、-、*、/、=等五个功能键。
					编程实现两个一位十进制数的四则运算,并显示结果。
姓名日期:物联网2202黄杉,2024-04-16
*************************/
#include<reg51.h>
#include<intrins.h>
//51单片机寄存器定义头文件
sbit row0=P1^0;
sbit row1=P1^1;
sbit row2=P1^2;
sbit row3=P1^3;
sbit col0=P1^4;
sbit col1=P1^5;
sbit col2=P1^6;
sbit col3=P1^7;
int n;//存放按键编号
int t;//存放运算类型编号1~+  2~-  3~X  4~/
int m1,m2;//存放两个加数
int dis[2];//存放结果的十位和个位
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//定义0~9共阳极七段码,0xbf是-(负号)
void key1();//等待按键按下,无限查询
void key2();//扫描按键位置,行列扫描
void key3();//处理按键请求,显示编号
void display();//显示两位结果子函数
/**********************************************/
void delay(int i)
{
	int k,j;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/**********************************************/
void main()
{
	while(1)
	{
		key1();
		key2();
		key3();
	}
}
/**********************************************/
void key1()
{
	while(1)
	{
		P1=0x0f;
		if(P1!=0x0f)//有变化,一定是有按键按下,导致某行某列短路
			break;//退出查询
	}
}
/**********************************************/
void key2()
{
	P1=0xff;//行列都写1
	col0=0;//清零0列
	if(row0==0) n=0;
	if(row1==0) n=1;
	if(row2==0) n=2;
	if(row3==0) n=3;
	
	P1=0xff;//行列都写1
	col1=0;//清零1列
	if(row0==0) n=4;
	if(row1==0) n=5;
	if(row2==0) n=6;
	if(row3==0) n=7;
	
	P1=0xff;//行列都写1
	col2=0;//清零2列
	if(row0==0) n=8;
	if(row1==0) n=9;
	if(row2==0){m1=n;t=1;}//'+'键:保存数字1,运算类型编号1
	if(row3==0){m1=n;t=2;}//'-'键:保存数字1,运算类型编号2
	
	P1=0xff;//行列都写1
	col3=0;//清零3列
	if(row0==0){m1=n;t=3;}//'*'键:保存数字1,运算类型编号3
	if(row1==0){m1=n;t=4;}//'\'键:保存数字1,运算类型编号4
	if(row3==0) {m2=n;n=10;}//'=':保存数字2,并且按键编号10
}
/**********************************************/
void key3()
{
	if(n<10)//按下数字键,显示数字
	{
	P2=0xfe;//1111 1110
	P0=seg[n];
	}
	else//按下等号键
		display();//显示两位结果
}
/**********************************************/
void display()
{
	int i,j;
	switch(t)
	{
		case 1://求和
					dis[0]=(m1+m2)/10;//求和并拆字得到十位显示值
					dis[1]=(m1+m2)%10;//求和并拆字得到个位显示值
					break;
		case 2://求差
					if(m1>=m2)//差为正
					{
						dis[0]=0;
						dis[1]=m1-m2;
					}
					else
					{
						dis[0]=10;//负号的查表值
						dis[1]=m2-m1;
					}
					break;
		case 3://求积
					dis[0]=(m1*m2)/10;//求积并拆字得到十位显示值
					dis[1]=(m1*m2)%10;//求积并拆字得到个位显示值
					break;
		case 4://求商
					dis[0]=m1/m2;//个位的值
					dis[1]=m1%m2*10/m2;//十分位的值
	}
	
	while(1)
	{
		for(i=0,j=0xfd;i<2;i++)//1111 1101
		{
			P2=j;
			P0=seg[dis[i]];
			if(t==4 && i==0)//除法运算显示高位时
				P0=P0 & 0x7f;//利用位于运算清零七段码最高位(dp字段),点亮小数点
			delay(2);
			j=_cror_(j,1);
		}
	}
}