单片机计算器源代码
#include sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit beep=P2^1;
unsigned char code table[] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
int X,Y,Z,S=0; unsigned char qianwan,baiwan,shiwan,wan,qian,bai,shi,ge;
/*延时函数*/
void delay()
{
unsigned int n;
for(n=0;n<400;n++); }
/*各个位上的数*/
void jisuan(unsigned long int m)
{
qianwan=m/10000000;
baiwan=(m/1000000)%10;
shiwan=(m/100000)%10;
wan=(m/10000)%10;
qian=(m/1000)%10;
bai=(m/100)%10;
shi=(m/10)%10;
ge=m%10;
}
/*显示函数*/
void display(void) {
P0=table[qianwan];
P30=0;
delay();
P3=0xFF;
P0=table[baiwan];
P31=0;
delay();
P3=0xFF;
P0=table[shiwan];
P32=0;
delay();
P3=0xFF;
P0=table[wan];
P33=0;
delay();
P3=0xFF;
P0=table[qian];
P34=0;
delay();
P3=0xFF;
P0=table[bai];
P35=0;
delay();
P3=0xFF;
P0=table[shi];
P36=0;
delay();
P3=0xFF;
P0=table[ge];
P37=0;
delay();
P3=0xFF;
}
/*键盘扫描函数*/
void scan()
{
switch(P1)
{
case 0xE0: X=0x10;break;
case 0xD0: X=0x20;break;
case 0xB0: X=0x40;break;
case 0x70: X=0x80;break;
default: break;
}
P1=0x0F;
switch(P1)
{
case 0x0E: Y=0x01;break;
case 0x0D: Y=0x02;break;
case 0x0B: Y=0x04;break;
case 0x07: Y=0x08;break;
default: break;
}
Z=X+Y;
switch(Z)
{
case 0x11: S=0;break;
case 0x21: S=1;break;
case 0x41: S=2;break;
case 0x81: S=3;break;
case 0x12: S=4;break;
case 0x22: S=5;break;
case 0x42: S=6;break;
case 0x82: S=7;break;
case 0x14: S=8;break;
case 0x24: S=9;break;
case 0x44: S=10;break;
case 0x84: S=11;break;
case 0x18: S=12;break;
case 0x28: S=13;break;
case 0x48: S=14;break;
case 0x88: S=15;break;
default: S=16;break;
}
}
/*主函数*/
void main()
{
unsigned long int num1=0,num2=0,num=0;
int S1[10]={0},S2[10]={0},S3,i;
beep=1;
while(1)
{
P1=0xF0;
while(P1==0xF0)
{
}
/*数1*/
i=0;
scan();
while(S<=9)
{
S1[i]=S;
P1=0xF0;
num1=10*num1+S1[i++];
jisuan(num1);
while(P1!=0xF0)
{
beep=0;
display();
}
delay();
beep=1;
while(P1==0xF0)
{
display();
}
scan();
}
/*算法*/
while((S>=12&&S<=15)||S3==0)
{
S3=S;
P1=0xF0;
while(P1!=0xF0)
{
beep=0;
display();
}
delay();
beep=1;
while(P1==0xF0)
{
display();
}
scan();
}
/*数2*/
i=0;
while(S<=9)
{
S2[i]=S;
P1=0xF0;
num2=10*num2+S2[i++];
jisuan(num2);
while(P1!=0xF0)
{
beep=0;
display();
}
delay();
beep=1;
while(P1==0xF0)
{
display();
}
scan();
}
/*求和*/
while(S!=11)
{
P1=0xF0;
while(P1!=0xF0)
{
beep=0;
display();
}
delay();
beep=1;
while(P1==0xF0)
{
display();
}
scan();
}
P1=0xF0;
while(P1!=0xF0)
{
beep=0;
display();
}
delay();
beep=1;
switch(S3)
{
case 12: num=num1+num2;break;
case 13: num=num1-num2;break;
case 14: num=num1*num2;break;
case 15: num=num1/num2; break;
default: break;
}
jisuan(num);
while(1)
{
display();
}
}
}