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

📄 int_calc.c

📁 针对51单片机的中断触发按键的程序
💻 C
字号:
/*************************************************************************************
*Author:PanXiaoguang  -  hack_ziyoutt@qq.com
*Created Date:2009-03-09 10:30
*Last Modified:2009-03-09 18:10
*Description: A small calculator,can calculate +,-,*,/ of the integer number【INT-OK】
**************************************************************************************/

#include <AT89X52.H>

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

/*
共阴极LED显示管字段码和显示控制码
*/
code numCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x00,0x40};
//               0    1    2    3    4    5    6    7    8    9    E    灭   -
code disControl[]={0xfe,0xfd,0xfb,0xf7};

unsigned  int data led[4];
int data numBuf[4]={0,0,0,0};
unsigned  char data keyTemp;
unsigned  char data keyCode;
unsigned  char data keyValue;
unsigned  char data keyOp;
int data keyNum1=-1;
int data keyNum2=-1;
unsigned  char data numCount=0;
unsigned  char data key;
unsigned  char data count=1;

bit isEQ=false;
bit isOP=false;
bit hasOP=false;
bit full=false;

void delay(unsigned  char t)
{
	for(;t>0;t--);
}

void disTest(void)
{
	unsigned  char i,j;

	if(numCount==0)
	{
		led[0]=led[1]=led[2]=11;
		led[3]=0;	
	}
	else if(numCount==1)
	{
		led[0]=led[1]=led[2]=11;
		led[3]=numBuf[0];
	}
	else if(numCount==2)
	{
		led[0]=led[1]=11;
		led[2]=numBuf[0];
		led[3]=numBuf[1];		
	}
	else if(numCount==3)
	{
		led[0]=11;
		led[1]=numBuf[0];
		led[2]=numBuf[1];
		led[3]=numBuf[2];	
	}
	else if(numCount==4)
	{
		led[0]=numBuf[0];
		led[1]=numBuf[1];
		led[2]=numBuf[2];
		led[3]=numBuf[3];	
	}
	else
	{
		led[0]=led[1]=led[2]=11;
		led[3]=10;	
	}
	for(j=0;j<4;j++)
	{
		if(led[j]==-2)
		{
			led[j]=12;
		}
		i=led[j];
		P0=numCode[i];
		P2=disControl[j];
		delay(500);
	}
}

void initCalc(void)
{
	numBuf[0]=numBuf[1]=numBuf[2]=numBuf[3]=0;
	keyNum1=keyNum2=-1;
	keyOp=0;
	numCount=0;
	isOP=false;
	hasOP=false;
	isEQ=false;
	count=1;
	full=false;
	disTest();
}

void answerDisplay(int answer)
{
	unsigned  char j;
	if(10000 > answer && answer > 999)
	{
		numCount=4;
		numBuf[0]=answer/1000;
		numBuf[1]=answer%1000/100;
		numBuf[2]=answer%100/10;
		numBuf[3]=answer%10;
	}
	else if(1000 > answer && answer > 99)
	{
		numCount=3;
		numBuf[0]=answer/100;
		numBuf[1]=answer%100/10;
		numBuf[2]=answer%10;
	}
	else if(100 > answer && answer > 9)
	{
		numCount=2;
		numBuf[0]=answer/10;
		numBuf[1]=answer%10;		
	}
	else if(10 > answer && answer >= 0)
	{
		numCount=1;
		numBuf[0]=answer;		
	}
	else if(0 > answer && answer > -10)
	{
		numCount=2;
		numBuf[0]=-2;
		numBuf[1]=-answer;
	}
	else if(-9 > answer && answer > -100)
	{
		numCount=3;
		numBuf[0]=-2;
		numBuf[1]=(-answer)/10;
		numBuf[2]=(-answer)%10;		
	}
	else if(-99 > answer && answer > -1000)
	{
		numCount=4;
		numBuf[0]=-2;
		numBuf[1]=(-answer)/100;
		numBuf[2]=(-answer)%100/10;
		numBuf[3]=(-answer)%10;		
	}
	else
	{		
		numCount=4;
		for(j=0;j<4;j++)
		{
			numBuf[j]=-2;
		}
	}
	disTest();
}

int getNum(void)
{
	int num;

	if(numCount==0)
	{
		num=-1;
	}
	else if(numCount==1)
	{
		num=numBuf[0];
	}
	else if(numCount==2)
	{
		num=numBuf[0]*10+numBuf[1];
	}
	else if(numCount==3)
	{
		num=numBuf[0]*100+numBuf[1]*10+numBuf[2];
	}
	else if(numCount==4)
	{
		num=numBuf[0]*1000+numBuf[1]*100+numBuf[2]*10+numBuf[3];
	}
	else
	{
		num=-1;
	}
	return num;
}

void getKey(void)
{	
	switch(keyCode)
	{
		case 215:key=0;isOP=false;isEQ=false;break;
		case 235:key=1;isOP=false;isEQ=false;break;
		case 219:key=2;isOP=false;isEQ=false;break;
		case 187:key=3;isOP=false;isEQ=false;break;
		case 237:key=4;isOP=false;isEQ=false;break;
		case 221:key=5;isOP=false;isEQ=false;break;
		case 189:key=6;isOP=false;isEQ=false;break;
		case 238:key=7;isOP=false;isEQ=false;break;
		case 222:key=8;isOP=false;isEQ=false;break;
		case 190:key=9;isOP=false;isEQ=false;break;

		case 119:key=10;isOP=true;isEQ=false;break;// +
		case 123:key=11;isOP=true;isEQ=false;break;// -
		case 125:key=12;isOP=true;isEQ=false;break;// *
		case 126:key=13;isOP=true;isEQ=false;break;// /
		case 183:key=14;isOP=true;isEQ=true; break;// =

		case 231:initCalc();return;

		default:return;
	}

	if(!isOP)
	{
		if(!full)
		{
			if(hasOP && !(count++))
			{
				numCount=0;
			}
			numBuf[numCount++]=key;
			if(numCount>4)
			{
				full=true;
			}	
		}
		else
		{
			numCount=0;
		}
	}
	if(isOP && !isEQ)
	{
		hasOP=true;
		count=0;
		keyOp=key;
		keyNum1=getNum();	
	}
	if(isEQ)
	{	
		if(!count)
		{
			numCount=0;
		}
		if(hasOP)
		{
			keyNum2=getNum();
		}
		else
		{
			keyNum1=getNum();
			keyOp=0;
		}		
	}
}

void getKeyCode(void)
{
	unsigned char k,i;
	P1=0xff;
	P1=0x0f;
	k=P1;
	P1=0xff;
	P1=0xf0;
	i=P1;
	keyValue=i+k;
}

void numCalc(void)
{
	int data keyAnswer=0;
	numCount=0;
	isEQ=false;
	isOP=false;
	switch(keyOp)
	{
		case 0 :keyAnswer=keyNum1;break;
		case 10:keyAnswer=keyNum1+keyNum2;break;
		case 11:keyAnswer=keyNum1-keyNum2;break;
		case 12:keyAnswer=keyNum1*keyNum2;break;
		case 13:keyAnswer=keyNum1/keyNum2;break;

		default:keyAnswer=0;
	}
	answerDisplay(keyAnswer);
}

void int0() interrupt 0
{
	getKeyCode();
	keyCode=keyValue;
	getKey();
	disTest();
}

void main()
{	
	EA=1;
	EX0=1;
	while(1)
	{	
		P1=0x0f;
		disTest();
		if(isEQ)
		{
			if(keyOp==0)
			{
				numCalc();
			}
			else
			{
				if(keyNum2==-1)
				{
					numCount=1;
					numBuf[0]=-2;
					isOP=false;
					isEQ=false;
				}
				else
				{
					numCalc();
				}
			}
		}	
	}
}

⌨️ 快捷键说明

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