第一次输入时会卡两次,除颤试过了,没用,除了第一次意外都能正常输入
还有输入1时会闪一下然后变成0;
下面是程序
#include <REGX52.h>
#define uint unsigned int //
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
uchar anjian[ ]={0x7f,0xbf,0xdf,0xef};//
sbit w1=P2^0;
sbit w2=P2^1;
sbit w3=P2^2;
sbit w4=P2^3;
int result=0;//
int higher=0;//×î¸ßλ
int play;//
>
uchar c,now=0,k,temp;
int i;
int ok;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void delay(unsigned int z)//延时函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
uint jiance()//°按键检测程序
{
int k,a,b,f=0,g=0;
for(a=0;a<4;a++)
{
P1=anjian[a];
temp=P1&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x07:b=0;delay(25);break;
case 0x0b:b=1;delay(25);break;
case 0x0d:b=2;delay(25);break;
case 0x0e:b=3;delay(25);break;
}
break;
}
}
f++;
if(f==g)
{
ok=1;
}
else
{
ok=0;
}
g=f;
c=b+(a*4);
switch(c)
{
case 0: k=1; break;
case 1: k=2; break;
case 2: k=3; break;
case 3: k=11; break;//+
case 4: k=4; break;
case 5: k=5; break;
case 6: k=6; break;
case 7: k=12; break;//-
case 8: k=7; break;
case 9: k=8; break;
case 10: k=9; break;
case 11: k=13; break;//*
case 12: k=16; break;//Í˸ñ
case 13: k=0; break;
case 14: k=15; break;//=
case 15: k=13; break;// /
}
return(k);
}
void display(int number)//¾数码管显示函数
{
int L1,L2,L3,L4;
int l1,l2,l3,l4;
L4=(number%10);//¸öλ
l4=L4;
L3=((number-L4)%100)/10;//ʮλ
if(number<10)
{
l3=10;
}
if(number>=10)
{
l3=L3;
}
L2=((number-L4-(L3*10))%1000)/100;//°Ùλ
if(number<100)
{
l2=10;
}
if(number>=100)
{
l2=L2;
}
L1=((number-L4-(L3*10)-(L2*100))%10000)/1000;//ǧλ
if(number<1000)
{
l1=10;
}
if(number>=1000)
{
l1=L1;
}
while(1)
{
P0=table[l1];
w1=0;
delay(1);
w1=1;
P0=table[l2];
w2=0;
delay(1);
w2=1;
P0=table[l3];
w3=0;
delay(1);
w3=1;
P0=table[l4];
w4=0;
delay(1);
w4=1;
jiance();
if(ok==0)
{
break;
}
}
}
void accum(int i)/累加
{
result=result*10+i;
play=result;//Ö±½ÓÏÔʾ
delay(20);
}
void addition()//加减乘除
{
switch(now)
{
case 0: higher=result; result=0; break;//µÚÒ»´Î
case 1: higher=higher+result; result=0; play=result; break;//¼Ó·¨
case 2: higher=higher-result; result=0; play=result; break;//¼õ·¨
case 3: higher=higher*result; result=0; play=result; break;//³Ë·¨
case 4: higher=higher+result; result=0; play=result; break;//³ý·¨
}
}
void back()//Í˸ñ
{
result=result/10;
play=result;
}
void is()//µÈÓÚ
{
switch(now)
{
case 0: higher=result;result=0; break;//µÚÒ»´Î
case 1: higher=higher+result; play=result; result=0; break;//¼Ó·¨
case 2: higher=higher-result; play=result; result=0; break;//¼õ·¨
case 3: higher=higher*result; play=result; result=0; break;//³Ë·¨
case 4: higher=higher/result; play=result; result=0; break;//³ý·¨
}
now=0;
display(higher);
play=higher;
}
uint ererr()//±¨´í
{
return(12);
}
void main()//¼ÆËãÖ÷º¯Êý
{
int mo=1;
while(1)
{
while(mo)
{
i=jiance();
if(ok==0)
{
delay(100);
if(ok==0)
{
mo=0;
}
}
}
mo=1;
switch(i)
{
case 0:accum(i); break;//累加
case 1:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 2:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 3:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 4:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 5:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 6:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 7:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 8:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 9:accum(i); break;//Ê®±¶ÀÛ¼Ó
case 11: addition(); now=1; break;//加
case 12: addition(); now=2; break;//减
case 13: addition(); now=3; break;/乘
case 14: addition(); now=4; break;//除
case 15: is(); break;//等于
case 16: back(); break;//退格
case 17: ererr(); break;//
}
display(play);
}
}