📄 yuns1.c
字号:
/*************************************************************/
/* Filename: yuns1.c
功能: 实现键入两个数,然后再根据键入的算子来实现加、减、乘、除
/*程序于2007年11月29日在程序yuns.c基础上修改 */
/**************************************************************/
#include<reg52.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar code value[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00,0xff};//段选码
uchar data tab1[6]={0,0,0,0,0,0};
uchar data tab2[6]={0,0,0,0,0,0};
void delay(void);
void delay1(void);
void delay2(void);
uchar keyscan();
void show(h);
void over_error(h);
void add1(int m,int n);
void sub1(int m,int n);
void mul1(int m,int n);
void div1(int m,int n);
//====================================
void main()
{
uchar i=0,j=0,l=0,p=0,q=0,k=0; //k是键盘的换回值 ,i是输入的第一个数长度跟踪 ,j是输入第二数长度
uchar ok=0,add=0, sub=0, mul=0, div=0; //分别 是确认 , 加,减,乘,除的标志位
long m=0, n=0; //分别是第一、二个数的真实值
while(1)
{
k=keyscan();
delay1();
delay1();
if(k!=15) // 不是按的“=” 键
{
if((add||sub||mul||div)==1)
{
switch(k)
{
case 0: tab2[j]=0; j++;break;
case 1: tab2[j]=1; j++;break;
case 2: tab2[j]=2; j++;break;
case 3: tab2[j]=3; j++;break;
case 4: tab2[j]=4; j++;break;
case 5: tab2[j]=5; j++;break;
case 6: tab2[j]=6; j++;break;
case 7: tab2[j]=7; j++;break;
case 8: tab2[j]=8; j++;break;
case 9: tab2[j]=9; j++;break;
default : break;
}
if(j==0)
{
P0=value[15];
}
else if(j==1)
{
P2=0x0fe;
P0=value[tab2[0]];
delay1();
}
else if(j==2)
{
P2=0x0fe;
P0=value[tab2[1]];
delay1();
P2=0x0fd;
P0=value[tab2[0]];
delay1();
}
else if(j==3)
{
P2=0x0fe;
P0=value[tab2[2]];
delay1();
P2=0x0fd;
P0=value[tab2[1]];
delay1();
P2=0x0fb;
P0=value[tab2[0]];
delay1();
}
else if(j==4)
{
P2=0x0fe;
P0=value[tab2[0]];
delay1();
P2=0x0fd;
P0=value[tab2[1]];
delay1();
P2=0x0fb;
P0=value[tab2[2]];
delay1();
P2=0x0f7;
P0=value[tab2[3]];
delay1();
}
else if(j==5)
{
P2=0x0fe;
P0=value[tab2[0]];
delay1();
P2=0x0fd;
P0=value[tab2[1]];
delay1();
P2=0x0fb;
P0=value[tab2[2]];
delay1();
P2=0x0f7;
P0=value[tab2[3]];
delay1();
P2=0x0ef;
P0=value[tab2[4]];
delay1();
}
else if(j==6)
{
P2=0x0fe;
P0=value[tab2[0]];
delay1();
P2=0x0fd;
P0=value[tab2[1]];
delay1();
P2=0x0fb;
P0=value[tab2[2]];
delay1();
P2=0x0f7;
P0=value[tab2[3]];
delay1();
P2=0x0ef;
P0=value[tab2[4]];
delay1();
P2=0x0df;
P0=value[tab2[5]];
delay1();
}
else
{
P0=value[15];
}
}
//=============================================
else // 这是第一个数,
{
switch(k)
{
case 0: tab1[i]=0; i++;break;
case 1: tab1[i]=1; i++;break;
case 2: tab1[i]=2; i++;break;
case 3: tab1[i]=3; i++;break;
case 4: tab1[i]=4; i++;break;
case 5: tab1[i]=5; i++;break;
case 6: tab1[i]=6; i++;break;
case 7: tab1[i]=7; i++;break;
case 8: tab1[i]=8; i++;break;
case 9: tab1[i]=9; i++;break;
case 10: add++; break;
case 11: sub++; break;
case 12: mul++; break;
case 13: div++; break;
default : break;
}
if(i==1)
{
P2=0x0fe;
P0=value[tab1[0]];
delay1();
}
else if(i==2)
{
P2=0x0fe;
P0=value[tab1[0]];
delay1();
P2=0x0fd;
P0=value[tab1[1]];
delay1();
}
else if(i==3)
{
P2=0x0fe;
P0=value[tab1[0]];
delay1();
P2=0x0fd;
P0=value[tab1[1]];
delay1();
P2=0x0fb;
P0=value[tab1[2]];
delay1();
}
else if(i==4)
{
P2=0x0fe;
P0=value[tab1[0]];
delay1();
P2=0x0fd;
P0=value[tab1[1]];
delay1();
P2=0x0fb;
P0=value[tab1[2]];
delay1();
P2=0x0f7;
P0=value[tab1[3]];
delay1();
}
else if(i==5)
{
P2=0x0fe;
P0=value[tab1[0]];
delay1();
P2=0x0fd;
P0=value[tab1[1]];
delay1();
P2=0x0fb;
P0=value[tab1[2]];
delay1();
P2=0x0f7;
P0=value[tab1[3]];
delay1();
P2=0x0ef;
P0=value[tab1[4]];
delay1();
}
else if(i==6)
{
P2=0x0fe;
P0=value[tab1[0]];
delay1();
P2=0x0fd;
P0=value[tab1[1]];
delay1();
P2=0x0fb;
P0=value[tab1[2]];
delay1();
P2=0x0f7;
P0=value[tab1[3]];
delay1();
P2=0x0ef;
P0=value[tab1[4]];
delay1();
P2=0x0df;
P0=value[tab1[5]]; //显示第一组数字
delay1();
}
else
{
P0=value[15];
}
}
}
else //说明已经按下了“=” 键
{
//计算第一个数的真值 ,因为按键都是放在数组里的,如:第一个数放在tab1[]里
for (p=0;p<i;p++)
{ //将tab1[]中的每一个数变成实际代表的数值
for(q=p;q<i-1;q++)
{
tab1[p]=tab1[p]*10;
}
}
p=0; // 下面还要用到P,所以将P清零
for(p=0;p<i;p++)
{
m=m+tab1[p]; // 用m表示整个实际数值
}
p=0;
q=0;
for(p=0;p<j;p++) //计算第二个数的真值
{
for(q=p;q<j-1;q++)
{
tab2[p]=tab2[p]*10;
}
}
p=0;
for(p=0;p<i;p++)
{
n=n+tab2[p];
}
if(add==1)
{
add1(m,n);
}
else if(sub==1)
{
sub1(m,n);
}
else if(mul==1)
{
mul1(m,n);
}
else if(div==1)
{
div1(m,n);
}
else show(0);
}
}
}
//==============================================
void delay(void) /*延时程序 */
{
uchar i;
for(i=0;i<200;i++){;}
}
//=================
void delay1(void) /*延时程序 */
{
uint i;
for(i=0;i<6000;i++){;}
}
void delay2(void) /*延时程序 */
{
uint i;
for(i=0;i<500;i++){;}
}
//=============== 键盘扫描
uchar keyscan(void)
{
uchar KEY=0;
uchar codeh,codel,H=0,L=0;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
delay();
if ((P1&0xf0)!=0xf0)
{
codeh=0xfe;
do{
P1=codeh;
if((P1&0xf0)!=0xf0)
{
codel=~P1;
L=codel>>5;
if(L==4)L=3;
H<<=2;
KEY=H+L;
return(KEY);
}
else
{
codeh=(codeh<<1)|0x01;
H++;
}
} while((codeh&0x10)!=0xf0) ;
}
}
return(-1);
}
//===========================
//加法运算
void add1(int m,int n)
{
long h;
h=m+n;
over_error(h);
}
//============================
//减法运算
void sub1(int m,int n)
{
int h;
h=m-n;
over_error(h);
}
//=============================
//乘法运算
void mul1(int m,int n)
{
long h;
h=m*n;
over_error(h);
}
//=============================
//除法运算
void div1(int m,int n)
{
int h;
if (n==0)
{
P0=value[15]; //错误处理
P2=0xfe;
}
h=m/n;
over_error(h);
}
//=============================
void show(h1)
{
uchar show[6];
if (h1<0)
{
P2=0x0fe;
P0=value[16]; //第一数码管显示“-”
h1=abs(h1); //对负数取绝对值
}
else
{
P2 = 0xfe;
P0 =value[17]; //计算的结果为正数,那么第一个数码管不亮
}
if((h1>=0)&&(h1<10)) //结果为一位数,只要一个数码管
{
P2=0x0fd;
P0=value[h1];
}
else
if((h1>=10)&&(h1<100)) //结果为二位数
{
show[1]=h1/10;
show[0]=h1%10;
while(1)
{
P0=value[show[1]];
P2=0x0fd;
delay2();
P0=value[show[0]];
P2=0x0fb;
delay2();
}
}
else
if((h1>=100)&&(h1<1000)) //结果为三位数
{
show[2]=h1/100;
show[1]=(h1/10)%10;
show[0]=h1%10;
while(1)
{
P0=value[show[2]];
P2=0x0fd;
delay2();
P0=value[show[1]];
P2=0x0fb;
delay2();
P0=value[show[0]];
P2=0x0f7;
delay2();
}
}
else
if((h1>=1000)&&(h1<10000))
{
show[3]=h1/1000;
show[2]=(h1/100)%10;
show[1]=(h1/10)%10;
show[0]=h1%10;
while(1)
{
P0=value[show[3]];
P2=0x0fd;
delay2();
P0=value[show[2]];
P2=0x0fb;
delay2();
P0=value[show[1]];
P2=0x0f7;
delay2();
P0=value[show[0]];
P2=0x0ef;
delay2();
}
}
else
if((h1>=10000)&&(h1<100000))
{
show[4]=(h1/10000);
show[3]=(h1/1000)%10;
show[2]=(h1/100)%10;
show[1]=(h1/10)%10;
show[0]=h1%10;
while(1)
{
P0=value[show[4]];
P2=0x0fd;
delay2();
P0=value[show[3]];
P2=0x0fb;
delay2();
P0=value[show[2]];
P2=0x0f7;
delay2();
P0=value[show[1]];
P2=0x0ef;
delay2();
P0=value[show[0]];
P2=0x0df;
delay2();
}
}
/* else
if((h1>=100000)&&(h1<1000000))
{
show[5]=(h1/100000);
show[4]=(h1/10000)%10;
show[3]=(h1/1000)%10;
show[2]=(h1/100)%10;
show[1]=(h1/10)%10;
show[0]=h1%10;
while(1)
{
P0=value[show[5]];
P2=0x0fe;
delay2();
P0=value[show[4]];
P2=0x0fd;
delay2();
P0=value[show[3]];
P2=0x0fb;
delay2();
P0=value[show[2]];
P2=0x0f7;
delay2();
P0=value[show[1]];
P2=0x0ef;
delay2();
P0=value[show[0]];
P2=0x0df;
delay2();
}
} */
else
{
P0=value[15];
}
}
/****************************************/
//溢出处理函数
//功能:加、减、乘、除结果超过计算范围是的处理
//让一个数码管全亮
/***************************************/
void over_error(h)
{
if ((h > 99999) && (h< -99999)) //溢出处理
{
P2 = 0xfe;
P0 = value[18];
}
else
{
show(h);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -