📄 int_calc.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 + -