#include <reg52.h>
#include <intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit DU=P2^6;
sbit WE=P2^7;
uchar code SMGduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar code LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int num;
int n1=0,n2=0;//数据传递的中间变量
uchar flag;//运算符号标志位
uchar F,T;//输入负数的标志位
uchar j=0;//计算器开关标志位
uchar A=0;//储存结果数组变量
uchar C=0;//读取结果数组变量
int tabel5[20]={0};//计算器计算结果储存数组
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(int i)//显示函数
{
if(i>=0)
{
if(i<10)
{
P0=0XFF;//数码管清零,避免程序执行时混乱
WE=1;//打开位选
P0=0XFE;//点亮第二位数码管
WE=0;关闭位选
DU=1;打开段选
P0=SMGduan[ i];//从P0口输出数字i的段码
DU=0;//关闭段选
delay(8);//去抖动
}
if(i>=10&&i<99)
{
P0=0XFF;
WE=1;
P0=0XFE;
WE=0;
DU=1;
P0=SMGduan[i/10];
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFd;
WE=0;
DU=1;
P0=SMGduan[i%10];
DU=0;
delay(8);
}
if(i>=100&&i<999)
{
P0=0XFF;
WE=1;
P0=0XFE;
WE=0;
DU=1;
P0=SMGduan[i/100];
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFd;
WE=0;
DU=1;
P0=SMGduan[i%100/10];
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFb;
WE=0;
DU=1;
P0=SMGduan[i%10];
DU=0;
delay(8);
}
}
else
{
i=-i;
if(i<9)
{
P0=0XFF;
WE=1;
P0=0XFE;
WE=0;
DU=1;
P0=0x40;
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFd;
WE=0;
DU=1;
P0=SMGduan[ i];
DU=0;
delay(8);
}
if(i>=10&&i<99)
{
P0=0XFF;
WE=1;
P0=0XFe;
WE=0;
DU=1;
P0=0x40;
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFd;
WE=0;
DU=1;
P0=SMGduan[i/10];
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFb;
WE=0;
DU=1;
P0=SMGduan[i%10];
DU=0;
delay(8);
}
if(i>=100&&i<999)
{
P0=0XFF;
WE=1;
P0=0XFe;
WE=0;
DU=1;
P0=0x40;
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFd;
WE=0;
DU=1;
P0=SMGduan[i/100];
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XFb;
WE=0;
DU=1;
P0=SMGduan[i%100/10];
DU=0;
delay(8);
P0=0XFF;
WE=1;
P0=0XF7;
WE=0;
DU=1;
P0=SMGduan[i%10];
DU=0;
delay(8);
}
}
}
//也可以用中断来实现
//矩阵键盘的扫描
void keyscan()
{
uchar temp;
P3=0XFF;
P3=0XFE;
temp=P3&0XF0;
if(temp!=0xf0)
{
delay(20);
P3=0XFE;
temp=P3&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
delay(20);
if(T==0)
{
n1=10*n1+7;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-7;num=n1;F=1;i++;break;
}
case 0xde:
delay(20);
if(T==0)
{
n1=10*n1+8;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-8;num=n1;F=1;i++;break;
}
case 0xbe:
delay(20);
if(T==0)
{
n1=10*n1+9;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-9;num=n1;F=1;i++;break;
}
case 0x7e:
delay(20);
n2=n1;
n1=0;
flag=1;
WE=1;
P0=0XFF;
WE=0;
T=0;
F=0;
i++;
break;
}//+
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
P3=0XFF;
}
}
P3=0XFF;
P3=0XFD;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay(20);
P3=0XFD;
temp=P3&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
delay(20);
if(T==0)
{
n1=10*n1+4;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-4;num=n1;F=1;i++;break;
}
case 0xdd:
delay(10);
if(T==0)
{
n1=10*n1+5;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-5;num=n1;F=1;i++;break;
}
case 0xbd:
delay(20);
if(T==0)
{
n1=10*n1+6;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-6;num=n1;F=1;i++;break;
}
case 0x7d:
delay(20);
if(F==1)
{
n2=n1;
n1=0;
flag=2;
WE=1;
P0=0XFF;
WE=0;
T=0;
F=0;
i++;
break;
}//-
if(F==0)
{
T=1;
break;
}//负号
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
P3=0XFF;
}
}
P3=0XFF;
P3=0XFB;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay(20);
P3=0XFB;
temp=P3&0XF0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
delay(20);
if(T==0)
{
n1=10*n1+1;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-1;num=n1;F=1;i++;break;
}
case 0xdb:
delay(20);
if(T==0)
{
n1=10*n1+2;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-2;num=n1;F=1;i++;break;
}
case 0xbb:
delay(20);
if(T==0)
{
n1=10*n1+3;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1-3;num=n1;F=1;i++;break;
}
case 0x7b:
delay(20);
n2=n1;
n1=0;
flag=3;
WE=1;
P0=0XFF;
WE=0;
T=0;
F=0;
i++;
break;
}// X
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
P3=0XFF;
}
}
P3=0XFF;
P3=0XF7;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay(20);
P3=0XF7;
temp=P3&0xf7;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
delay(20);
i++;
n1=n1/10;
num=n1;
break;
case 0xd7:
delay(20);
if(T==0)
{
n1=10*n1;num=n1;F=1;i++;break;
}
if(T==1)
{
n1=10*n1;num=n1;F=1;i++;break;
}
case 0xb7:
delay(20);
if(flag==1) num=n2+n1;
if(flag==2) num=n2-n1;
if(flag==3) num=n2*n1;
if(flag==4) num=n2/n1;
n1=0;
WE=1;
P0=0XFF;
WE=0;
F=0;//一次计算完成后重置标志位
i++;
break;//=
case 0x77:
delay(20);
n2=n1;
n1=0;
flag=4;
WE=1;
P0=0XFF;
WE=0;
T=0;
F=0;
i++;
break;//÷
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
P3=0XFF;
}
}
P3=0XFF;
if(P3==0XFB)
{
delay(20);
if(P3==0XFB)
{
tabel5[A]=num;
C=A;//将数组变量赋给读取数组的变量
A++;
n1=0;
num=0;
if(A>9)
{
for(A=9;A>-1;A--)
{
tabel5[A]=0;
}
A=0;
}//存满后自动清零
while(P3==0XFB);
}
}
if(P3==0XF7)
{
delay(20);
if(P3==0XF7)
{
num=tabel5[C];
C--;
while(P3==0XF7);
}
}
}
void keyscan1()//部分独立键盘判断
{
if(P3==0XFE)
{
delay(10);
if(P3==0XFE)
{
j=1;
WE=1;
P0=0xFF;
WE=0;
num=0;
n1=0;
delay(20);
P1=0XFF;
while(P3==0XFE);
}
}
P3=0XFF;
if(P3==0XFD)
{
delay(20);
if(P3==0XFD)
{
j=0;
delay(20);
while(P3==0XFD);
}
}
}
void main()
{
while(1)
{
if(j==1)
{
keyscan1();
}
if(j==0)
{
keyscan();
display(num);
P1=LED[ i];
if(i>7)
{
i=0;
}
keyscan1();
}
}
}
|