#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();
}
}
}
|