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

📄 calc.c

📁 基于51系列单片机的计算器程序.开发环境:KEIL,开发语言:c51,仿真环境Proteus
💻 C
字号:
/*******************************************************
51单片机4*4键盘简单计算器程序
作者:QRNU->川草风絮
开发环境:keil
开发语言:c51
备注:程序简单,存在漏洞及不规范之处,仅为实验或新手学习使用
********************************************************/
/*******************************************************
硬件接线:附图
*******************************************************/
#include<reg51.h>
#include<absacc.h>
#define led1 XBYTE[0x7fff]		//51外部16位存储器寻址地址,此处用来通过								
#define led2 XBYTE[0xbfff]		//锁存器向数码管输出段选和位选数据
#define led3 XBYTE[0xdfff]
#define led4 XBYTE[0xefff]
#define led5 XBYTE[0xf7ff]
#define led6 XBYTE[0xfbff]
#define led8 XBYTE[0xfeff]


unsigned char code tab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段选码表
	long value1,value2,result;
	bit s;
	int keyt;
int key1;
/*****************************************************
函数名称:getkey()
作用:扫描键盘并获得键值,利用反选法扫描键盘
*****************************************************/	
int getkey()
{int key=0;
	P3=0xfe;
	P1=0xff;
	while(P1!=0xff)		//行扫描有低电平信号出现
	{
		switch(P1)		//则在P1口全输出高电平的情况下进行列扫描
		{
			case 0xfe:key=7;break;	//得出键值
			case 0xfd:key=8;break;
			case 0xfb:key=9;break;
			case 0xf7:key=14;break;		
		}

	}
	if(key)return(key);
	P3=0xfd;
	P1=0xff;
	while(P1!=0xff)
	{
		switch(P1)
		{
			case 0xfe:key=4;break;
			case 0xfd:key=5;break;
			case 0xfb:key=6;break;
			case 0xf7:key=13;break;
		}
	}
	if(key)return(key);
	P3=0xfb;
	P1=0xff;
	while(P1!=0xff)
	{
		switch(P1)
		{
			case 0xfe:key=1;break;
			case 0xfd:key=2;break;
			case 0xfb:key=3;break;
			case 0xf7:key=12;break;
		}	
	}
if(key)return(key);
	P3=0xf7;
	P1=0xff;
	while(P1!=0xff)
	{
		switch(P1)
		{
			case 0xfe:key=16;break;
			case 0xfd:key=10;break;
			case 0xfb:key=15;break;
			case 0xf7:key=11;break;
		}
	}
	return(key);
}
/****************************************************************
函数名称:display()
功能:动态显示任意999999以内的十进制整数,同时监测键盘
****************************************************************/	
void display(long value)
{	int neg=0,tempkey=0;		//neg代表是否为负值
	int k[6]={0};
	
	if(value<0){value=-value;neg=1;}
	k[5]=value/100000;			//分解整数各位
	k[4]=value%100000/10000;
	k[3]=value%10000/1000;
	k[2]=value%1000/100;
	k[1]=value%100/10;
	k[0]=value%10;
	while(1)				//分别显示各位
	{
	if(value>=100000)
		led6=tab[k[5]];
	if(value>=10000)
		led5=tab[k[4]];
	if(value>=1000)
		led4=tab[k[3]];
	if(value>=100)
		led3=tab[k[2]];
	if(value>=10)
		led2=tab[k[1]];
	led1=tab[k[0]];
	if(neg==1)led8=tab[10];
	tempkey=getkey();
	if(tempkey!=0){key1=tempkey;break;}		//有键按下,则退出循环向下执行
	}
	neg=0;
}
/***********************************************************
主函数:main()
功能:进行接收数据和命令,完成计算器计算流程
注:key=1~9分别表示按键数字1~8,key=10表示按键数字0,key=11~16
分别代表计算器功能键"+" "-" "*" "/" "=" "CE"(清零)
***********************************************************/	
main()
{
	key1=0;
//读入初值
reset1: s=0;		//s代表是否有"上一次计算结果"
reset:	value1=result=0;
		
read:	if(key1<11&&key1>0)			//非功能键,则从低到高依次读入整数的每一位
	{
		value1=value1*10+key1;
		display(value1);
	if(key1==16)	goto reset1;	//任何情况下有"="按下便得出结果,返回
		goto read;				
	}
	if(key1<16&&key1>10)
	{
		if(s==0)
			{value2=value1;value1=0;keyt=key1;s=1;
			display(value2);
			if(key1==16)goto reset1;
			goto read;}			//把初值给被运算数
	
			//		else s=0;
	}

	if(keyt==11)result=value1+value2;	//功能键 +
	if(keyt==12)result=value2-value1;	//"-"
	if(keyt==13)result=value2*value1; 	//"*"
	if(keyt==14)result=value2/value1;	//"/"
//	if(keyt==15)
	display(result);		//显示结果
	if(key1==16)goto reset1;	
	value2=result;			//把结果赋给"上次运算结果",以备继续运算
	goto reset;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -