#include<reg52.h>
#include"delay.h"
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar n,f,m,stop;
long k1,k2,k; //满足数据大小
uchar yun;
uchar a[6] = {0,0,0,0,0,0};//定义初始数码管显示
uchar code table[]={ //数码管花样数组
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x89,0x86,
0xc7,0xc7,0xc0,0xff};
long jia(long x,long y) //运算加
{
long z;
z = x + y;
if (z < 999999)
return z;
else
return 0;
}
long jian(long x, long y) //运算减
{
long z;
if (x> y)
z = x - y;
else
z = y - x;
return z;
}
long cheng(long x, long y) //运算乘
{
long z;
z = x * y;
if(z < 999999)
return z;
else
return 0;
}
long chu(long x,long y) //运算除
{
long z;
if(x > y)
z = x / y;
else
z = y / x;
return z;
}
void quwei(long x,uchar a[]) //取位函数
{
uchar i;
for(i=0;i<=5;i++)
{
a[i] = x % 10; //取出各位
x = x / 10;
}
}
void display(uchar a[]) //动态扫描显示 函数
{
uchar i,j2;
j2 = 0xdf;
for(i = 0; i<= 5; i++)
{
P2 = j2;
P0 = table[a[i]];
delay(1);
j2 = _cror_(j2,1);
}
}
uchar keyscan()
{
uchar num,temp;
P1=0xfe; //扫描第一行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=10;
break;
case 0xde:num=9;
break;
case 0xbe:num=8;
break;
case 0x7e:num=7;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
P1=0xfd; //扫描第二行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1; //保存按键值
switch(temp)
{
case 0xed:num=11;
break;
case 0xdd:num=6;
break;
case 0xbd:num=5;
break;
case 0x7d:num=4;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
P1=0xfb; //扫描第三行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=12;
break;
case 0xdb:num=3;
break;
case 0xbb:num=2;
break;
case 0x7b:num=1;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
P1=0xf7; //扫描第四行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1; //保存按键值
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=0;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
return num;
}
void main()
{
n = 0; //初始化
k1 = 0;
k2 = 0;
k = 0;
yun = 0;
f = 0;
while(1)
{
if(f == 0)
{
switch(keyscan()) //读取按键号
{
case 0: m=0;f=1;break;//0
case 1: m=1;f=1;break;//1
case 2: m=2;f=1;break;//2
case 3: m=3;f=1;break;//3
case 4: m=4;f=1;break;//4
case 5: m=5;f=1;break;//5
case 6: m=6;f=1;break;//6
case 7: m=7;f=1;break;//7
case 8: m=8;f=1;break;//8
case 9: m=9;f=1;break;//9
case 10:m=10;f=1;yun=1;break; //加
case 11:m=11;f=1;yun=2;break; //减
case 12:m=12;f=1;yun=3;break; //乘
case 13:m=13;f=1;yun=4;break; //除
case 14:m=14;f=2;break; //等于
case 15:m=15;k1=0;k2=0;f=1;k=0;break;//清除
}
if(f == 1) //有按键按下
{
if(m < 10) //按的是数字键
{
n++;
if(n == 1) //只有个位
k1 = m;
else if(n > 1) //多位时
k1 = m * 10 + k1;
quwei(k1,a); //取出各位的数值
}
else //按的是功能键
{
k2 = k1; //将第一个接收的值储存
k1 = 0; //清零 继续接收数字
n = 0;
}
f = 0;
}
}
if(f == 2)
{
switch(yun) //读运算符
{
case 1: k = jia(k1,k2);break; //加
case 2: k = jian(k1,k2);break; //减
case 3: k = cheng(k1,k2);break; //乘
case 4: k = chu(k1,k2);break; //除
}
quwei(k,a); //取出结果各位的值
}
display(a); //动态扫描显示
}
}
#include"delay.h"
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar n,f,m,stop;
long k1,k2,k; //满足数据大小
uchar yun;
uchar a[6] = {0,0,0,0,0,0};//定义初始数码管显示
uchar code table[]={ //数码管花样数组
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x89,0x86,
0xc7,0xc7,0xc0,0xff};
long jia(long x,long y) //运算加
{
long z;
z = x + y;
if (z < 999999)
return z;
else
return 0;
}
long jian(long x, long y) //运算减
{
long z;
if (x> y)
z = x - y;
else
z = y - x;
return z;
}
long cheng(long x, long y) //运算乘
{
long z;
z = x * y;
if(z < 999999)
return z;
else
return 0;
}
long chu(long x,long y) //运算除
{
long z;
if(x > y)
z = x / y;
else
z = y / x;
return z;
}
void quwei(long x,uchar a[]) //取位函数
{
uchar i;
for(i=0;i<=5;i++)
{
a[i] = x % 10; //取出各位
x = x / 10;
}
}
void display(uchar a[]) //动态扫描显示 函数
{
uchar i,j2;
j2 = 0xdf;
for(i = 0; i<= 5; i++)
{
P2 = j2;
P0 = table[a[i]];
delay(1);
j2 = _cror_(j2,1);
}
}
uchar keyscan()
{
uchar num,temp;
P1=0xfe; //扫描第一行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=10;
break;
case 0xde:num=9;
break;
case 0xbe:num=8;
break;
case 0x7e:num=7;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
P1=0xfd; //扫描第二行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1; //保存按键值
switch(temp)
{
case 0xed:num=11;
break;
case 0xdd:num=6;
break;
case 0xbd:num=5;
break;
case 0x7d:num=4;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
P1=0xfb; //扫描第三行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=12;
break;
case 0xdb:num=3;
break;
case 0xbb:num=2;
break;
case 0x7b:num=1;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
P1=0xf7; //扫描第四行
temp=P1;
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
delay(5);
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
while(temp!=0xf0)
{
temp=P1; //保存按键值
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=0;
break;
}
while(temp!=0xf0)
{
temp=P1; //保存按键值
temp=temp&0xf0; // 读取P1按键数据
}
}
}
return num;
}
void main()
{
n = 0; //初始化
k1 = 0;
k2 = 0;
k = 0;
yun = 0;
f = 0;
while(1)
{
if(f == 0)
{
switch(keyscan()) //读取按键号
{
case 0: m=0;f=1;break;//0
case 1: m=1;f=1;break;//1
case 2: m=2;f=1;break;//2
case 3: m=3;f=1;break;//3
case 4: m=4;f=1;break;//4
case 5: m=5;f=1;break;//5
case 6: m=6;f=1;break;//6
case 7: m=7;f=1;break;//7
case 8: m=8;f=1;break;//8
case 9: m=9;f=1;break;//9
case 10:m=10;f=1;yun=1;break; //加
case 11:m=11;f=1;yun=2;break; //减
case 12:m=12;f=1;yun=3;break; //乘
case 13:m=13;f=1;yun=4;break; //除
case 14:m=14;f=2;break; //等于
case 15:m=15;k1=0;k2=0;f=1;k=0;break;//清除
}
if(f == 1) //有按键按下
{
if(m < 10) //按的是数字键
{
n++;
if(n == 1) //只有个位
k1 = m;
else if(n > 1) //多位时
k1 = m * 10 + k1;
quwei(k1,a); //取出各位的数值
}
else //按的是功能键
{
k2 = k1; //将第一个接收的值储存
k1 = 0; //清零 继续接收数字
n = 0;
}
f = 0;
}
}
if(f == 2)
{
switch(yun) //读运算符
{
case 1: k = jia(k1,k2);break; //加
case 2: k = jian(k1,k2);break; //减
case 3: k = cheng(k1,k2);break; //乘
case 4: k = chu(k1,k2);break; //除
}
quwei(k,a); //取出结果各位的值
}
display(a); //动态扫描显示
}
}