自己弄了一个计算机简单的程序,初学,动态数码管只有最后一位显示,能有大佬告诉我出了什么问题吗
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 Keyvalue;
int n=0;
int number=0;
int mathsign=0;
int sign1=0,sign2=0,sign3=0,sign4=0;
int num1=0,num2=0;num3=0;num4=0;
int show1,show2,show3,show4,show5=16;
u8 mark=0;
u8 k;
int flag=0;
reset=0;
#define DigDisplay P0
#define Key P1
sbit LSA=P2^2; //动态数码管位选IO口
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴数码管 数组
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(u16 i) //延时函数
{
while(i--);
}
void Appear() //动态数码管显示
{
if((number<10000)&&(number>1000)) //将计算最终结果个十百千位数取出
{
show1=number/1000;
show2=number%1000/100;
show3=number%100/10;
show4=number%10;
}
if((number<1000)&&(number>100))
{
show1=number/100;
show2=number%100/10;
show3=number%10;
show4=16;
}
if((number<100)&&(number>10))
{
show1=number/10;
show2=number%10;
show3=16;
show4=16; //0xf0
}
if(number<10)
{
show1=number;
show2=16;
show3=16;
show4=16;
}
if(number==0)
{
show1=16;
show2=16;
show3=16;
show4=16;
}
for(k=0;k<8;k++) //动态数码管位选循环,达到同时显示目的
{
switch(k)
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
if(k==0)
{
DigDisplay=smgduan[show1];
delay(100);
DigDisplay=0x00;
}
if(k==1)
{
DigDisplay=smgduan[show2];
delay(100);
DigDisplay=0x00;
}
if(k==2)
{
DigDisplay=smgduan[show3];
delay(100);
DigDisplay=0x00;
}
if(k==3)
{
DigDisplay=smgduan[show4];
delay(100);
DigDisplay=0x00;
}
if(k>3)
{
DigDisplay=smgduan[show5];
delay(100);
DigDisplay=0x00;
}
}
}
void Keydown(void) //矩阵按键
{
char a=0;
Key=0x0f; //检测列电平确认按下的按键
if(Key!=0x0f)
{
delay(1000);
if(Key!=0x0f)
{
Key=0x0f;
switch(Key)
{
case 0x07:Keyvalue=0;break;
case 0x0b:Keyvalue=1;break;
case 0x0d:Keyvalue=2;break;
case 0x0e:mathsign=1;break; //最后一列为数学运算符
}
Key=0xf0; //检测行电平,确认按下按键所在行
if(mathsign==0)
{
switch(Key) //给按下的数字键一个数
{
case 0x70:Keyvalue=Keyvalue;break; // 0 1 2 +
case 0xb0:Keyvalue=Keyvalue+3;break; // 3 4 5 -
case 0xd0:Keyvalue=Keyvalue+6;break; // 6 7 8 *
case 0xe0:Keyvalue=Keyvalue+9;break; // 9 C = /
}
if(Keyvalue==11) //按下为11的键相当于按下等号,flag标志位置1
{
flag=1;
}
n++; //每按下一个键,n+1,当n为奇数按下数字,偶数按下运算符
}
if(Keyvalue==10) //按下10的键相当于按下重置键,reset同样为标志位
{
reset=1;
}
if(mathsign==1) //按下第四列按键时,sign代表各个运算符
{
switch(Key)
{
case 0x70:sign1=1;break;
case 0xb0:sign2=1;break;
case 0xd0:sign3=1;break;
case 0xe0:sign4=1;break;
}
n++;
}
}
if(n%2==1) //将按下的数字值赋给变量num
{
switch(n)
{
case(1):
num1=Keyvalue;break;
case(3):
num2=Keyvalue;break;
case(5):
num3=Keyvalue;break;
case(7):
num4=Keyvalue;break;
}
Keyvalue=0;
}
}
while((a<50)&&(Key!=0xf0)) //按下一段时间自动退出,按下一次只有一个数
{
delay(100);
a++;
}
}
void InitInt0() //中断允许位打开
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
while(1)
{
Keydown();
InitInt0();
if(flag==1) //按下等号时显示最终结果
{
Appear();
if(reset==1) //重置
{
n=0;
flag=0;
show1=0;
show2=0;
show3=0;
show4=0;
num1=0;
num2=0;
num3=0;
num4=0;
reset=0;
}
}
}
}
void Int0() interrupt 0 //外部中断0
{
delay(1000);
if((sign1==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1+num2;break;
case 4:
number=number+num3;break;
case 6:
number=number+num4;break;
}
}
if((sign2==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1-num2;break;
case 4:
number=number-num3;break;
case 6:
number=number-num4;break;
}
}
if((sign3==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1*num2;break;
case 4:
number=number*num3;break;
case 6:
number=number*num4;break;
}
}
if((sign4==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1/num2;break;
case 4:
number=number/num3;break;
case 6:
number=number/num4;break;
}
}
}