|
本帖最后由 xuwei 于 2015-6-13 19:50 編輯
硬件要求,矩陣鍵盤(4*4)、數碼管、52單片機最小系統及其連接。
鄙人不才,這個是BATE1.0測試版。(無法計算小數、負數、爆表數)
#include<reg52.h>
#include<intrins.h>
//sbit led=P2^0;
sbit duan=P2^1;
sbit wei=P2^2;
unsigned char code duanma[]={
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
};
unsigned char dqxs[8]={0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char num1[8],num2[8],dq=1,ysf=0,zt=0;//num1是被操作數,num為原操作數,dq是當前操作數,ysf是運算符保存,zt按鍵狀態;
unsigned char error=0;
void xianshishu()
{
char i;
if(dq==1)
{
for(i=7;i>0;i--)
{
if(num1[ i])
break;
dqxs[ i]=0xff;
}
while(i>=0)
{
dqxs[ i]=duanma[num1[ i]];
i--;
}
}
if(dq==2)
{
for(i=7;i>0;i--)
{
if(num2[ i])
break;
dqxs[ i]=0xff;
}
while(i>=0)
{
dqxs[ i]=duanma[num2[ i]];
i--;
}
}
}
void xieshu(unsigned char a)
{
int i;
if(dq==1)
{for(i=7;i>0;i--)
num1[ i]=num1[i-1];
num1[0]=a;
}
else if(dq==2)
{
for(i=7;i>0;i--)
num2[ i]=num2[i-1];
num2[0]=a;
}
xianshishu();
}
void delay()
{
unsigned char a=255;
while(a--);
}
void display()
{
unsigned char x=0x01,i;
for(i=0;i<8;i++)
{
P0=x;
wei=1;
wei=0;
P0=dqxs[ i];
duan=1;
delay();
P0=0xff;
duan=0;
x=_crol_(x,1);
}
}
void yunsuan()
{
unsigned char fs=0x7f;
int i;
long int a=0,b=0;
if(ysf==0)
return;
for(i=7;i>=0;i--)
{
a=a*10+num1[ i];
b=b*10+num2[ i];
}
switch(ysf)
{
case 1:a+=b;break;
case 2:a-=b;break;
case 3:a*=b;break;
case 4:a/=b;break;
}
/*P0=0x00;
wei=1;
wei=0;
led=1;
for(i=0;i<8;i++)
{
P0=fs;
delay();delay();delay();delay();delay();delay();delay();delay();delay();delay();delay();
fs=_cror_(fs,1);
}
P0=0xff;
led=0;
*/
if(a>=100000000||a<0)
{
dqxs[0]=0x84;
for(i=1;i<8;i++)
dqxs[ i]=0xff;
error=1;
}
else
{
for(i=0;i<8;i++)
{
num1[ i]=a%10;
a/=10;
}
dq=1;
xianshishu();
}
}
main()//主函數除了顯示啥都不用干,Jibs程序就是這么牛逼
{
//led=0;
EA=1;
ET0=1;
TMOD=0x02;
TH0=0;
TL0=0;
TR0=1;
while(1)
display();
}
void t0() interrupt 1
{
unsigned char h=0,l=0,i;
P1=0x0f;
if(zt)
{
if(P1==0x0f)
zt=0;
return;
}
else
{
if(P1!=0x0f)
{
zt=1;
switch(P1)
{
case 0x0e:h=1;break;
case 0x0d:h=2;break;
case 0x0b:h=3;break;
case 0x07:h=4;break;
}
P1=0xf0;
switch(P1)
{
case 0xe0:l=1;break;
case 0xd0:l=2;break;
case 0xb0:l=3;break;
case 0x70:l=4;break;
}
if(h==1)
{
switch(l)
{
case 1:if(error)break;xieshu(1);break;
case 2:if(error)break;xieshu(2);break;
case 3:if(error)break;xieshu(3);break;
case 4:if(error)break;ysf=1;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
}
}
else if(h==2)
{
switch(l)
{
case 1:if(error)break;xieshu(4);break;
case 2:if(error)break;xieshu(5);break;
case 3:if(error)break;xieshu(6);break;
case 4:if(error)break;ysf=2;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
}
}
else if(h==3)
{
switch(l)
{
case 1:if(error)break;xieshu(7);break;
case 2:if(error)break;xieshu(8);break;
case 3:if(error)break;xieshu(9);break;
case 4:if(error)break;ysf=3;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
}
}
else if(h==4)
{
switch(l)
{
case 1:ysf=0;dq=1;error=0;
for(i=0;i<8;i++)
{ num1[ i]=0;
num2[ i]=0;
}
xianshishu();
break;
case 2:if(error)break;xieshu(0);break;
case 3:if(error)break;yunsuan();break;
case 4:if(error)break;ysf=4;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
}
}
}
}
} |
|