基于STC12C5608AD设计简易计算器问题求助
[复制链接]
程序烧进板子去了后,,10个数字键能正常显示,功能键按下的时候会乱码,帮忙看下程序有什么问题,感激不尽!
源程序如下
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar e,f,temp,fu=0;
uint a=50,flag=0,key,dyh,bru,cru,i,fuhao=0;
long c=0,d=0,b=0;
uint code bite[]={0x04,0x08,0x10,0x20};
uint code DSY_CODE[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };
void delay(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
uint kescan()
{
uint com;
P1=0xf0;
e=P1;
P1=0x0f;
f=P1;
temp=e|f;
while(P1!=0x0f);
if(temp==0xb7)com=0;
if(temp==0x7e)com=1;
if(temp==0xbe)com=2;
if(temp==0xde)com=3;
if(temp==0x7d)com=4;
if(temp==0xbd)com=5;
if(temp==0xdd)com=6;
if(temp==0x7b)com=7;
if(temp==0xbb)com=8;
if(temp==0xdb)com=9;
if(temp==0x77)com=10;
if(temp==0xd7)com=11;
if(temp==0xe7)com=12;
if(temp==0xeb)com=13;
if(temp==0xed)com=14;
if(temp==0xee)com=15;
return(com);
}
void dis(uint n)
{
if(n/10000)
{
for(i=0;i<4;i++)
{ if(fu==1)
P2=~(DSY_CODE[15]&&0x7f);
if(fu==0)
P2=~DSY_CODE[15];
P3=bite[3-i];
n=n/10;
delay(4);
P3=0x00;
}
}
else if(n/1000)
{
for(i=0;i<4;i++)
{ if(fu==1)
P2=~(DSY_CODE[n%10]&0x7f);
if(fu==0)
P2=~DSY_CODE[n%10];
P3=bite[3-i];
n=n/10;
delay(4);
P3=0x00;
}
}
else if(n/100)
{
for(i=0;i<3;i++)
{ if(fu==1)
P2=~(DSY_CODE[n%10]&0x7f);
if(fu==0)
P2=~DSY_CODE[n%10];
P3=bite[3-i];
n=n/10;
delay(4);
P3=0x00;
}
}
else if(n/10)
{
for(i=0;i<2;i++)
{ if(fu==1)
P2=~(DSY_CODE[n%10]&0x7f);
if(fu==0)
P2=~DSY_CODE[n%10];
P3=bite[3-i];
n=n/10;
delay(4);
P3=0x00;
}
}
else if(n%10)
{if(fu==1)
P2=~(DSY_CODE[n]&0x7f);
if(fu==0)
P2=~DSY_CODE[n];
P3=0x20;
delay(4);
}
}
void caculate(uint z)
{ if(z==10)
{
P2=0x76;
P3=0x20;
}
if(z==11)
{
P2=0x40;
P3=0x20;
}
if(z==12)
{
P2=0x80;
P3=0x20;
}
if(z==13)
{
P2=0x49;
P3=0x20;
}
}
void div(void)
{
d=b/c;
if(d/1000)
{
for(i=0;i<4;i++)
{
P2=~DSY_CODE[d%10];
P3=bite[3-i];
d=d/10;
delay(4);
P3=0x00;
}
}
else if(d/100)
{ d=10*b/c;
for(i=0;i<4;i++)
{ if(i==1)
P2=~(DSY_CODE[d%10]&0x7f);
if(i!=1)
P2=~DSY_CODE[d%10];
P3=bite[3-i];
d=d/10;
delay(4);
P3=0x00;
}
}
else if(d/10)
{ d=100*b/c;
for(i=0;i<4;i++)
{ if(i==2)
P2=~(DSY_CODE[d%10]&0x7f);
if(i!=2)
P2=~DSY_CODE[d%10];
P3=bite[3-i];
d=d/10;
delay(4);
P3=0x00;
}
}
else if(d%10)
{ d=1000*b/c;
for(i=0;i<4;i++)
{
if(i==3)
P2=~(DSY_CODE[d%10]&0x7f);
if(i!=3)
P2=~DSY_CODE[d%10];
P3=bite[3-i];
d=d/10;
delay(4);
P3=0x00;
}
}
else
{
d=(1000*b)/c;
for(i=0;i<4;i++)
{ if(i==3)
P2=~(DSY_CODE[0]&0x7f);
if(i!=3)
P2=~DSY_CODE[d%10];
P3=bite[3-i];
d=d/10;
delay(4);
P3=0x00;
}
}
}
void main()
{
P3M1=0xff;
P2M1=0xff;
P2M0=0x00;
P3M0=0x00;
P1M0=0x00;
P1M1=0x00;
flag=0;cru=0;bru=0;dyh=0;
while(1)
{
P1=0xf0;
if(P1!=0xf0)
{
delay(30);
if(P1!=0xf0)
a=kescan();
}
if(a>9&&a<14)
{flag=1;key=a;fuhao=1;}
if(a>=0&&a<10)
{ if(flag==1)
{
c=10*c+a;
if(c/10000)
c=0;
cru=1;bru=1;
}
if(flag==0)
{
b=10*b+a;
if(b/10000)
b=0;
bru=1;
}
}
if(a==14)
{
if(flag==0)
b=b/10;
if(flag==1)
c=c/10;
}
if(a==15)
{ dyh=1;
if(flag==1&&bru==1&&cru==1)
{ switch(key)
{
case 10:d=b+c;break;
case 11:if(b>=c)
d=b-c; if(b
case 12:d=b*c;break;
case 13:d=b/c;break;
}
}
}
if(bru==1)
{
P1=0x0f;
while(P1==0x0f)
{
P1=0x0f;
if(cru!=1&&dyh!=1&&fuhao==0)
{if(b==0){ P2=~DSY_CODE[0];P3=0x20;} if(b!=0)dis(b);}
if(cru!=1&&dyh!=1&&fuhao==1)
caculate(key);
if(cru==1&&dyh!=1&&fuhao==1)
{if(c==0){ P2=~DSY_CODE[0];P3=0x20;} if(c!=0)dis(c);}
if(cru==1&&dyh==1&&key!=13&&fuhao==1)
dis(d);
if(cru==1&&dyh==1&&key==13&&fuhao==1)
{ if(b==b/c*c)dis(d);if(b!=b/c*c)div();d=b/c;}
}
if(flag==1&&cru==1&&bru==1&&dyh==1)
{flag=0;cru=0;bru=0;b=d;c=0;dyh=0;fu=0;}
}
}
}