单片机做的计算器,用可以用八位数码管显示,我只有六个就装了六个,矩阵键盘输入,把复位键装到左下角就可以归零了
元件清单
stc89c52 1片
插座一个
12M晶振一个
33pf电容两个
10uf电容一个
10K电阻一个
1n4007二极管两个
c1815三极管六个
三位数码管两个
按钮开关16个。
导线若干。
综合演示
flash: http://www.tudou.com/v/WOLpkQJ2Ifo/&rpid=78698299/v.swf键盘按键
flash: http://www.tudou.com/v/FPZotmUxyEQ/&rpid=78698299/v.swf 加法运算演示
flash: http://www.tudou.com/v/yD5dVoGPiKo/&rpid=78698299/v.swf 乘法运算演示
flash: http://www.tudou.com/v/5rmgiRrxT6g/&rpid=78698299/v.swf 除法运算演示
flash: http://www.tudou.com/v/WBhr_qn64GU/&rpid=78698299/v.swf
仿真程序如下
程序如下
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint temp;
uchar num,ca,count;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0xff,0x0c,0x89,0x7f,0xbf};
uchar zero[8]={0,0,0,0,0,0,0,0};
uchar table1[8],table2[8];
void delay(uint z) //* zhongduan *//
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void sta()
{ num=16;
P1=0xf0;
EA=1;
EX0=1;
IT0=0;
P0=0xc0;
P2=0x80;
}
void exchange(uchar w[],uchar m[])
{
uchar k;
for(k=0;k<8;k++)
w[k]=m[k];
}
uchar keyscan() //* jianpansaomiao *//
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=7;
break;
case 0xde:num=8;
break;
case 0xbe:num=9;
break;
case 0x7e:num='/';
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=4;
break;
case 0xdd:num=5;
break;
case 0xbd:num=6;
break;
case 0x7d:num='*';
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=1;
break;
case 0xdb:num=2;
break;
case 0xbb:num=3;
break;
case 0x7b:num='-';
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num='r';
break;
case 0xd7:num=0;
break;
case 0xb7:num='=';
break;
case 0x77:num='+';
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return num;
}
int0_pr() interrupt 0
{
EA=0;
num=keyscan();
P1=0xf0;
EA=1;
}
void move(uchar *a)
{ uchar k;
for(k=7;k>0;k--)
a[k]=a[k-1];
}
uchar cnt()
{
if(num<10)
{
move(table1);
table1[0]=num;
count++;
}
num=16;
return count;
}
void display() //* xianshi *//
{
exchange(table1,zero);
while(1)
{
uchar k,n=0x80;
count=cnt();
for ( k=0;k<count;k++)
{
P2=n;
P0=table[table1[k]];
delay(4);
n=n>>1;
}
if(num=='+'||num=='-'||num=='*'||num=='/'||num=='='||num=='r')
{count=0; break; }
}
}
void dp(uchar *a,uint z)
{
while(1)
{
uchar k,n=0x80;
for ( k=0;k<z;k++)
{
P2=n;
P0=table[a[k]];
delay(4);
n=n>>1;
}
if(num=='+'||num=='-'||num=='*'||num=='/'||num=='='||num=='r') break;
}
}
long cale(uchar ca)
{
long A,B,C;
B=table2[7]*10000000+table2[6]*1000000+table2[5]*100000+table2[4]*10000+table1[3]*1000+table1[2]*100+table2[1]*10+table2[0];
A=table1[7]*10000000+table1[6]*1000000+table1[5]*100000+table1[4]*10000+table1[3]*1000+table1[2]*100+table1[1]*10+table1[0];
if(ca=='+')
{
C=A+B;
}
else if(ca=='-')
{
C=B-A;
}
return C;
}
void main ()
{
long C;uchar k;
sta();
display();
while(1)
{
if(num<10)
{
exchange( table2,table1);
display();
}
else if( num=='+'||num=='-'||num=='*'||num=='/')
{ P0=0xc0;
P2=0x80;
switch(num)
{ case '+' : ca='+';break;
case '-' : ca='-';break; }
}
else if(num=='=')
{
num=16;
C= cale(ca);
table1[7]=C/10000000;
table1[6]=C%10000000/1000000;
table1[5]=C%1000000/100000;
table1[4]=C%100000/10000;
table1[3]=C%10000/1000;
table1[2]=C%1000/100;
table1[1]=C%100/10;
table1[0]=C%10;
for(k=7;k>0;k--)
{
if(table1[k])break;
}
dp(table1,k+1);
}
}
}
[ 此帖被974315793在2011-06-13 22:20重新编辑 ]