#include<reg51.h> /*包含的头文件 */
#define uchar unsigned char /* 宏定义 */
#define uint unsigned int
uchar Led[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,
0x6f, 0x00}; /* 数码管段选 */
float Number[]={0,0,0,0}; /* 数码管显示位控制寄存器 */
uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00};
int D[] = {0,0,0,0,0,0}; //数码管显示内容寄存器
uchar code C[] = {0x0, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF}; /* 数码管位选 */
/* 列扫描控制 LED 1位 2位 3位 4位 5位 6位 */
uchar k=16; /* 按键对外控制 */
uchar b; /* 按键【+】【-】 【*】 【/】对外的控制 */
float Out_put; /* 定义变量【Out_put】作为结果 */
uchar e=0; /* 数字的位存储递进的控制 */
uchar g=0; /* 运算方式的控制变量 */
uchar L=0; /* 运算方式的控制变量 */
uchar g1=0; /* 运算方式的控制变量 */
uchar g2=0; /* 运算方式的控制变量 */
uchar g3=0; /* 运算方式的控制变量 */
uchar g4=0; /* 运算方式的控制变量 */
char j=-1; /* 与Number[]数组连用 */
uchar m=0; /* 按键【=】的控制变量 */
uchar n=0; /* 按键【.】的控制变量 */
uchar x=0; /* 小数点个数的记录变量 */
uchar xo=0; /* 控制开始计数小数点的变量 */
int result;
sbit dula=P2^6;
sbit wela=P2^7;
void Key_scan();
void Yun_suan();
void delay(uint t3)
{
uint t1,t2;
for(t1=t3;t1>0;t1--)
for(t2=110;t2>0;t2--);
}
void show(float Out_put)
{
uchar r,k,i,s=0;
int q,p,temp;
temp=Out_put;
if((Out_put-temp)!=0)
{
result=Out_put*10;
r=1; //小数点后有一位小数
}
else
{
result=Out_put;
r=0; //小数点后面没有数
}
p=result;
if(m==1)
{
if(result<0)
{
result=-result;
p=result;
q=result;
for(i=1;i<=6;i++) //判断result的位数
{
q=q/10;
if(q==0)
{
k=i;
i=9;
}
}
dula=1;
P0=0x40; //显示负号
dula=0;
wela=1;
P0=C[6-k];
delay(1);
wela=0;
}
/*dula=1;
P0=0x80;
dula=0;
wela=1;
P0=C[r];
wela=0;
delay(10);
dula=1;
P0=0x00;
dula=0;*/
result=p;
dula=1;
P0=Led[result%10];
dula=0;
wela=1;
P0=C[6];
wela=0;
//result=result/10;
delay(1);
if((result>=0)&&(result<=10))
{
dula=1;
P0=Led[0]|0x80;
dula=0;
wela=1;
P0=C[5];
wela=0;
delay(5);
}
else
{
if( (result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0))
{
P0=0x00;
}
else
{
if(r==1)
{
dula=1;
P0=Led[result%10]|0x80;
dula=0;
wela=1;
P0=C[5];
wela=0;
result=result/10;
delay(5);
}
else
{
dula=1;
P0=Led[result%10];
dula=0;
wela=1;
P0=C[5];
wela=0;
result=result/10;
delay(5);
}
}
if( (result%10==0)&&(result%100==0)&&(result%1000==0))
{
P0=0x00;
}
else
{
dula=1;
P0=Led[result%10];
dula=0;
wela=1;
P0=C[4];
wela=0;
result=result/10;
delay(5);
}
if( (result%10==0)&&(result%100==0))
{
P0=0x00;
}
else
{
dula=1;
P0=Led[result%10];
dula=0;
wela=1;
P0=C[3];
wela=0;
result=result/10;
delay(5);
}
if( (result%10==0))
{
P0=0x00;
}
else
{
dula=1;
P0=Led[result%10];
dula=0;
wela=1;
P0=C[2];
wela=0;
result=result/10;
delay(5);
}
if(result==0)
{
P0=0x00;
}
else
{
dula=1;
P0=Led[result%10];
dula=0;
wela=1;
P0=C[1];
wela=0;
result=result/10;
delay(5);
}
}
}
}
void In_put() // 输入函数 输入小数 加小数点
{
uchar i;
if(k>=0&&k<=9)
switch(e)
{
case 6: D[5]=D[4];A[5]=A[4]; //用来存放数值
case 5: D[4]=D[3];A[4]=A[3];
case 4: D[3]=D[2];A[3]=A[2];
case 3: D[2]=D[1];A[2]=A[1];
case 2: D[1]=D[0];A[1]=A[0];
case 1: if(n==0)
{
D[0]=k; A[0]=Led[k];
if(xo==1)
x++;
}
if(n==1)
{
A[0]=Led[k]|0x80;
xo=1;
n=0;
}
}
if(k>=11&&k<=15&&b==1)
{
switch(k)
{
case 11: g1++;g++;if(g2==1) L=1; if(g3==1) L=2; if(g4==1) L=3;break; // +
case 12: g2++;g++;if(g1==1) L=4; if(g3==1) L=5; if(g4==1) L=6;break; // -
case 13: g3++;g++;if(g1==1) L=7; if(g2==1) L=8; if(g4==1) L=9;break; // *
case 14: g4++;g++;if(g1==1) L=10;if(g2==1) L=11;if(g3==1) L=12;break; // /
}
j++;
Number[j]=100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];
for(i=1;i<=x;i++)
{
Number[j]=(float)Number[j]/10;
}
x=0;
for(i=0;i<=5;i++) // 数据存储器清零
D[i]=0;
for(i=0;i<=6;i++) // 数据显示清零
{
A[i]=0x00;
}
b=0;e=0;xo=0;
}
}
void Key_scan() // 键盘扫描函数 Key_scan()
{
unsigned char X,Y,Z,t;
P3 = 0xff;
t=P3;
P3 = 0x0f; //先对P2置数 行扫描
if(P3!=0x0f) //判断是否有键按下
{
delay(20); //延时10ms,软件去干扰
if(P3!=0x0f) //确认按键按下;
{
X=P3; //保存行扫描时有键按下时状态
P3=0xf0; //列扫描
Y=P3; //保存列扫描时有键按下时状态
Z=X|Y; //取出键值
while(P3!=0xf0); // 按键防止抖动
switch ( Z ) //判断键值(那一个键按下)
{
case 0xee: k=0; e++; In_put(); break; //数字 【0】
case 0xde: k=1; e++; In_put(); break; //数字 【1】
case 0xbe: k=2; e++; In_put(); break; //数字 【2】
case 0x7e: k=3; e++; In_put(); break; //数字 【3】
case 0xed: k=4; e++; In_put(); break; //数字 【4】
case 0xdd: k=5; e++; In_put(); break; //数字 【5】
case 0xbd: k=6; e++; In_put(); break; //数字 【6】
case 0x7d: k=7; e++; In_put(); break; //数字【7】
case 0xeb: k=8; e++; In_put(); break; //数字 【8】
case 0xdb: k=9; e++; In_put(); break; //数字 【9】
case 0xbb: n=1; In_put(); break; //小数点 【 .】
case 0x7b: k=11;b=1; In_put(); break; //字符 【B +】
case 0xe7: k=12;b=1; In_put(); break; //字符 【C -】
case 0xd7: k=13;b=1; In_put(); break; //字符 【D *】
case 0xb7: k=14;b=1; In_put(); break; //字符 【E /】
case 0x77: k=15;m=1;b=1;In_put();break; //字符 【F =】
}
}
}
}
void Yun_suan()
{
if(g1==1&&g==1) Out_put=Number[0]+Number[1];
if(g2==1&&g==1) Out_put=Number[0]-Number[1];
if(g3==1&&g==1) Out_put=Number[0]*Number[1];
if(g4==1&&g==1) Out_put=Number[0]/Number[1];
if(g1==2&&g==2) Out_put=Number[0]+Number[1]+Number[2];
if(g2==2&&g==2) Out_put=Number[0]-Number[1]-Number[2];
if(g3==2&&g==2) Out_put=Number[0]*Number[1]*Number[2];
if(g4==2&&g==2) Out_put=Number[0]/Number[1]/Number[2];
if(L==1) Out_put=Number[0]-Number[1]+Number[2];
if(L==2) Out_put=Number[0]*Number[1]+Number[2];
if(L==3) Out_put=Number[0]/Number[1]+Number[2];
if(L==4) Out_put=Number[0]+Number[1]-Number[2];
if(L==5) Out_put=Number[0]*Number[1]-Number[2];
if(L==6) Out_put=Number[0]/Number[1]-Number[2];
if(L==7) Out_put=Number[0]+Number[1]*Number[2];
if(L==8) Out_put=Number[0]-Number[1]*Number[2];
if(L==9) Out_put=Number[0]/Number[1]*Number[2];
if(L==10) Out_put=Number[0]+Number[1]/Number[2];
if(L==11) Out_put=Number[0]-Number[1]/Number[2];
if(L==12) Out_put=Number[0]*Number[1]/Number[2];
}
void Xian_shi()
{
if(m!=1)
{
Key_scan();
/* 显示函数 与A[i]有关 */
dula=1;P0=A[0];dula=0;wela=1; P0=C[6];wela=0;delay(1);
dula=1;P0=A[1];dula=0;wela=1;P0=C[5];wela=0;delay(1);
dula=1;P0=A[2];dula=0;wela=1;P0=C[4];wela=0;delay(1);
dula=1;P0=A[3];dula=0;wela=1; P0=C[3];wela=0;delay(1);
评论3