用51单片机实现的计算器
去年刚学1个月左右写的,还很稚嫩,初学者理解下思路水水就行了
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define led P1
#define juzhen P0
sbit u1=P2^3;
sbit u2=P2^4;
sbit u3=P2^5;
sbit beer=P2^6;
u16 code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
typedef unsigned int u16;
typedef unsigned char u8;
#define led P1
#define juzhen P0
sbit u1=P2^3;
sbit u2=P2^4;
sbit u3=P2^5;
sbit beer=P2^6;
u16 code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
long int we=0,qian=0,hou=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,jia=0,jian=0,
cheng=0,chu=0,qingling=0,dengyu=0;
void delay(u16 i)
{
while(i--)
{
}
}
void baibai()
{
we=0,qian=0,hou=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,jia=0,jian=0,
cheng=0,chu=0,qingling=0,dengyu=0;
}
void sing()
{ unsigned char a,b,c;
for(c=18;c>0;c--)
{
for(b=50;b>0;b--)
{
for(a=33;a>0;a--)
{
beer=~beer;
delay(200);
}
}
}
}
{ unsigned char a,b,c;
for(c=18;c>0;c--)
{
for(b=50;b>0;b--)
{
for(a=33;a>0;a--)
{
beer=~beer;
delay(200);
}
}
}
}
void display ()
{
int i;
if(qingling==1)
baibai();
for(i=0;i<8;i++)
{
led=0x00;
switch(i)
{
case 0:u1=0;u2=0;u3=0;led=duan[qianwan];delay(100);break;
case 1:u1=1;u2=0;u3=0;led=duan[baiwan];delay(100);break;
case 2:u1=0;u2=1;u3=0;led=duan[shiwan];delay(100);break;
case 3:u1=1;u2=1;u3=0;led=duan[wan];delay(100);break;
case 4:u1=0;u2=0;u3=1;led=duan[qian1];delay(100);break;
case 5:u1=1;u2=0;u3=1;led=duan[bai];delay(100);break;
case 6:u1=0;u2=1;u3=1;led=duan[shi];delay(100);break;
case 7:u1=1;u2=1;u3=1;led=duan[ge];delay(100);break;
}
}
}
void input ()
{
long int gaibian=20;
juzhen=0x0f;
if(juzhen!=0x0f)
delay(1000);
if(juzhen!=0x0f)
{
switch(juzhen)
{
case 0x07:gaibian=0;break;
case 0x0b:gaibian=1;break;
case 0x0d:gaibian=2;break;
case 0x0e:gaibian=3;break;
}
}
juzhen=0xf0;
if(juzhen!=0xf0)
delay(1000);
if(juzhen!=0xf0)
{
switch(juzhen)
{
case 0x70:gaibian=gaibian+0;break;
case 0xb0:gaibian=gaibian+4;break;
case 0xd0:gaibian=gaibian+8;break;
case 0xe0:gaibian=gaibian+12;break;
}
}
juzhen=0xf0;
while(1)
{
if (juzhen==0xf0)
{
break;
}
}
if(gaibian!=20)
{
switch(gaibian)
{
case 10:qingling=1;break;
case 11:dengyu=1;break;
case 12:jia=1;break;
case 13:jian=1;break;
case 14:cheng=1;break;
case 15:chu=1;break;
default :we=we+1;break;
}
}
if(gaibian<10)
{
switch(we)
{
case 0:ge=16;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 1:ge=gaibian;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*1;break;
case 2:shi=gaibian;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*10;break;
case 3:bai=gaibian;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*100;break;
case 4:qian1=gaibian;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*1000;break;
case 5:wan=gaibian;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*10000;break;
case 6:shiwan=gaibian;baiwan=16;qianwan=16;qian=qian+gaibian*100000;break;
case 7:baiwan=gaibian;qianwan=16;qian=qian+gaibian*1000000;break;
case 8:qianwan=gaibian;qian=qian+gaibian*10000000;break;
}
}
}
{
int i;
if(qingling==1)
baibai();
for(i=0;i<8;i++)
{
led=0x00;
switch(i)
{
case 0:u1=0;u2=0;u3=0;led=duan[qianwan];delay(100);break;
case 1:u1=1;u2=0;u3=0;led=duan[baiwan];delay(100);break;
case 2:u1=0;u2=1;u3=0;led=duan[shiwan];delay(100);break;
case 3:u1=1;u2=1;u3=0;led=duan[wan];delay(100);break;
case 4:u1=0;u2=0;u3=1;led=duan[qian1];delay(100);break;
case 5:u1=1;u2=0;u3=1;led=duan[bai];delay(100);break;
case 6:u1=0;u2=1;u3=1;led=duan[shi];delay(100);break;
case 7:u1=1;u2=1;u3=1;led=duan[ge];delay(100);break;
}
}
}
void input ()
{
long int gaibian=20;
juzhen=0x0f;
if(juzhen!=0x0f)
delay(1000);
if(juzhen!=0x0f)
{
switch(juzhen)
{
case 0x07:gaibian=0;break;
case 0x0b:gaibian=1;break;
case 0x0d:gaibian=2;break;
case 0x0e:gaibian=3;break;
}
}
juzhen=0xf0;
if(juzhen!=0xf0)
delay(1000);
if(juzhen!=0xf0)
{
switch(juzhen)
{
case 0x70:gaibian=gaibian+0;break;
case 0xb0:gaibian=gaibian+4;break;
case 0xd0:gaibian=gaibian+8;break;
case 0xe0:gaibian=gaibian+12;break;
}
}
juzhen=0xf0;
while(1)
{
if (juzhen==0xf0)
{
break;
}
}
if(gaibian!=20)
{
switch(gaibian)
{
case 10:qingling=1;break;
case 11:dengyu=1;break;
case 12:jia=1;break;
case 13:jian=1;break;
case 14:cheng=1;break;
case 15:chu=1;break;
default :we=we+1;break;
}
}
if(gaibian<10)
{
switch(we)
{
case 0:ge=16;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 1:ge=gaibian;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*1;break;
case 2:shi=gaibian;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*10;break;
case 3:bai=gaibian;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*100;break;
case 4:qian1=gaibian;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*1000;break;
case 5:wan=gaibian;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*10000;break;
case 6:shiwan=gaibian;baiwan=16;qianwan=16;qian=qian+gaibian*100000;break;
case 7:baiwan=gaibian;qianwan=16;qian=qian+gaibian*1000000;break;
case 8:qianwan=gaibian;qian=qian+gaibian*10000000;break;
}
}
}
void main()
{
long int pp;
beer=0;
while(1)
{
display();
if(jia==0&&jian==0&&cheng==0&&chu==0)
{
input();
}
else
{
hou=qian;
qian=0;
we=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,qian=0;
while(dengyu==0)
{
display();
input();
}
if(jia==1)
{
hou=hou+qian;
{
long int pp;
beer=0;
while(1)
{
display();
if(jia==0&&jian==0&&cheng==0&&chu==0)
{
input();
}
else
{
hou=qian;
qian=0;
we=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,qian=0;
while(dengyu==0)
{
display();
input();
}
if(jia==1)
{
hou=hou+qian;
}
if(jian==1)
{
hou=hou-qian;
}
if(cheng==1)
{
hou=hou*qian ;
}
if(chu==1)
{
if(qian==0)
{
hou=0;break;
}
hou=hou/qian;
}
we=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16;
pp=hou ;
while(pp!=0)
{
pp=pp/10;
we=we+1;
if(jian==1)
{
hou=hou-qian;
}
if(cheng==1)
{
hou=hou*qian ;
}
if(chu==1)
{
if(qian==0)
{
hou=0;break;
}
hou=hou/qian;
}
we=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16;
pp=hou ;
while(pp!=0)
{
pp=pp/10;
we=we+1;
}
if(we>8)
{
sing();
we=0;
}
switch(we)
{
case 0:ge=0;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 1:ge=hou;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 2:ge=hou%10;shi=hou/10;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 3:ge=hou%10;shi=hou/10%10;bai=hou/100;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 4:ge=hou%10;shi=hou%100/10;bai=hou/100%10;qian1=hou/1000;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 5:ge=hou%10;shi=hou/1000%10;bai=hou/100%10;qian1=hou/1000%10;wan=hou/10000;shiwan=16;baiwan=16;qianwan=16;break;
case 6:ge=hou%10;shi=hou/10000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000;baiwan=16;qianwan=16;break;
case 7:ge=hou%10;shi=hou/100000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000%10;baiwan=hou/1000000;qianwan=16;break;
case 8:ge=hou%10;shi=hou/1000000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000%10;baiwan=hou/1000000%10;qianwan=hou/10000000;break;
}
while(1)
{
input();
display();
}
}
}
}
if(we>8)
{
sing();
we=0;
}
switch(we)
{
case 0:ge=0;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 1:ge=hou;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 2:ge=hou%10;shi=hou/10;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 3:ge=hou%10;shi=hou/10%10;bai=hou/100;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 4:ge=hou%10;shi=hou%100/10;bai=hou/100%10;qian1=hou/1000;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
case 5:ge=hou%10;shi=hou/1000%10;bai=hou/100%10;qian1=hou/1000%10;wan=hou/10000;shiwan=16;baiwan=16;qianwan=16;break;
case 6:ge=hou%10;shi=hou/10000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000;baiwan=16;qianwan=16;break;
case 7:ge=hou%10;shi=hou/100000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000%10;baiwan=hou/1000000;qianwan=16;break;
case 8:ge=hou%10;shi=hou/1000000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000%10;baiwan=hou/1000000%10;qianwan=hou/10000000;break;
}
while(1)
{
input();
display();
}
}
}
}