|
#define uchar unsigned char
#define uint unsigned int
uchar temp/*接收的字符*/,i/*通用數(shù)*/,gao/*兩位數(shù)的十位*/,di/*個(gè)位*/;
bit fun_two;//第二功能標(biāo)志
float val1/*運(yùn)算數(shù)1*/,val2/*運(yùn)算數(shù)2*/,ans/*最終結(jié)果*/;
char tab[32]/*輸入接收數(shù)組*/,weishu/*浮點(diǎn)數(shù)位數(shù)*/;
char tab2[9]/*輸出緩沖數(shù)組*/;
uchar fuhao/*運(yùn)算符號(hào)標(biāo)志*/;
//鍵盤鍵碼數(shù)組,部分為ASCII碼
//鍵盤上的ABCDF,鍵并沒有用上(E作為浮點(diǎn)數(shù)的格式符了),
//這是由于單片機(jī)ROM只有8K,不能再擴(kuò)展功能了(十六進(jìn)制),但是保留按鍵。
uchar code keyval[5][7]={
0Xb2,0X31,0X34,0X37,0X2E,0X41,0Xa9,
0X20,0X32,0X35,0X38,0X30,0XA1,0Xaa,
0Xb3,0X33,0X36,0X39,0XA6,0XA5,0Xb1,
0X20,0X2b,0Xb0,0X2a,0X2f,0Xa0,0X20,
0Xb4,0Xa2,0Xa3,0XA4,0XA7,0XA8,0X3d,
};
//數(shù)據(jù)處理函數(shù)
void come_in()
{
val1=atof(tab); //ASCII碼轉(zhuǎn)浮點(diǎn)數(shù)
for(i=0;i<32;i++) //數(shù)組復(fù)位0
{
tab[i]=0;
}
i=0;
}
//鍵盤掃描程序
//5*7鍵盤,列在P3口的高5位上,行在P1口低7位上
//返回值為keyval[]中的對(duì)應(yīng)鍵碼
uchar keyscan()
{
uchar temp;
uchar hang,lie;
P3=0xf8|P3;
P3_7=0;
if(P1!=0xff)
{
lie=0;
temp=P1;
}
else
{
P3=0xf8|P3;
P3_6=0;
if(P1!=0xff)
{
lie=1;
temp=P1;
}
else
{
P3=0xf8|P3;
P3_5=0;
if(P1!=0xff)
{
lie=2;
temp=P1;
}
else
{
P3=0xf8|P3;
P3_4=0;
if(P1!=0xff)
{
lie=3;
temp=P1;
}
else
{
P3=0xf8|P3;
P3_3=0;
if(P1!=0xff)
{
lie=4;
temp=P1;
}
}
}
}
}
switch(temp)
{
case 0xbf:hang=0;break;
case 0xdf:hang=1;break;
case 0xef:hang=2;break;
case 0xf7:hang=3;break;
case 0xfb:hang=4;break;
case 0xfd:hang=5;break;
case 0xfe:hang=6;break;
}
while(P1!=0xff); //松手檢測(cè)
return (keyval[lie][hang]);
}
void keypad()
{
P3=0x07&P3; //
P1=0xff; //
if(P1!=0xff); // 判斷有無(wú)按鍵
delay(10); //延時(shí)去抖
if(P1!=0xff) //再次判斷
{
temp=keyscan(); //掃描鍵盤,取得鍵碼
if(((temp>=0x30)&&(temp<=0x39))||(temp==0x2e)||(temp==0x2d)||(temp==0x45))//判斷鍵碼是否為浮點(diǎn)數(shù)關(guān)鍵字
{
write_1602dat(temp); //顯示鍵碼
tab[i]=temp; //數(shù)據(jù)給tab[]
i++;
}
else //若不為浮點(diǎn)數(shù)數(shù)關(guān)鍵字,則復(fù)雜了!�。�!
{
switch(temp) //判斷鍵碼
{
case 0x2b: //加號(hào)
{
come_in(); //數(shù)據(jù)處理
write_1602dat(0x2b); //寫加號(hào)
fuhao=temp; //取得運(yùn)算符
val2=val1; //數(shù)據(jù)轉(zhuǎn)移
val1=0; //val1復(fù)位,等待下一個(gè)數(shù)
}
break;
case 0xb0: //減號(hào)
{
come_in(); //同加號(hào)
write_1602dat(0x2d); //寫減號(hào)
val2=val1; //同加號(hào)
fuhao=temp; //同加號(hào)
val1=0; //同加號(hào)
}
break;
case 0x2a: //乘號(hào)
{
come_in(); //同加號(hào)
write_1602dat(0x2a); //寫乘號(hào)
val2=val1; //同加號(hào)
fuhao=temp; //同加號(hào)
val1=0; //同加號(hào)
}
break;
case 0x2f: //除號(hào)
{ //同加號(hào)
come_in(); //同加號(hào)
write_1602dat(0x2f); //寫除號(hào)
val2=val1; //同加號(hào)
fuhao=temp; //同加號(hào)
val1=0; //同加號(hào)
}
break;
case 0xa0: //N次方
{
come_in(); //同加號(hào)
write_1602dat(0x5e); //寫‘^’
val2=val1; //同加號(hào)
fuhao=temp; //同加號(hào)
val1=0; //同加號(hào)
}
break;
case 0xa1: //N次方根
{
come_in(); //同加號(hào)
write_1602dat(0xa2); //寫根號(hào)
val2=val1; //同加號(hào)
fuhao=temp; //同加號(hào)
val1=0; //同加號(hào)
}
break;
case 0xa2: //sin
{
if(fun_two==0) //判斷第二功能標(biāo)準(zhǔn),如果0,寫“sin:”
{
write_1602dat('s');
write_1602dat('i');
write_1602dat('n');
write_1602dat(':');
}
else //如果0,寫“asin:”
{
write_1602dat('a');
write_1602dat('s');
write_1602dat('i');
write_1602dat('n');
write_1602dat(':');
}
fuhao=temp;
val1=0;
}
break;
case 0xa3: //cos
{
if(fun_two==0) //判斷第二功能標(biāo)準(zhǔn),如果0,寫“cos:”
{
write_1602dat('c');
write_1602dat('o');
write_1602dat('s');
write_1602dat(':');
}
else //判斷第二功能標(biāo)準(zhǔn),如果0,寫“acos:”
{
write_1602dat('a');
write_1602dat('c');
write_1602dat('o');
write_1602dat('s');
write_1602dat(':');
};
fuhao=temp;
val1=0;
}
break;
case 0xa4: //tan
{
if(fun_two==0) //判斷第二功能標(biāo)準(zhǔn),如果0,寫“tan:”
{
write_1602dat('t');
write_1602dat('a');
write_1602dat('n');
write_1602dat(':');
}
else //判斷第二功能標(biāo)準(zhǔn),如果0,寫“atan:”
{
write_1602dat('a');
write_1602dat('t');
write_1602dat('a');
write_1602dat('n');
write_1602dat(':');
};
fuhao=temp;
val1=0;
}
break;
case 0xa5: //log
{
come_in();
write_1602dat(0x7e); //寫對(duì)數(shù)符號(hào)
write_1602dat('l');
write_1602dat('o');
write_1602dat('g');
write_1602dat(0x7f);
val2=val1;
fuhao=temp;
val1=0;
}
break;
case 0xa6: //階乘
{
come_in();
write_1602dat('!'); //寫階乘符號(hào)
fuhao=temp;
val2=val1;
val1=0;
}
break;
case 0xa7: //排列組合
{
come_in();
write_1602dat(0x7e);
if(fun_two==0)write_1602dat('C');//判斷第二功能標(biāo)準(zhǔn),如果0,則為排列,如果1為組合”
else write_1602dat('A');
write_1602dat(0x7f);
val2=val1;
fuhao=temp;
val1=0;
}
break;
case 0xa8: //累加
{
come_in();
write_1602dat(0x7e); //寫累加符號(hào)
val2=val1;
fuhao=temp;
val1=0;
}
break;
case 0xaa: //left
{
weizhi=weizhi+1; //左移
write_1602com(weizhi);
i=i+1;
}
break;
case 0xa9: //right
{
weizhi=weizhi-1; //右移
write_1602com(weizhi);
i=i-1;
}
break;
case 0xb1: //刪除
{
weizhi=weizhi-1;
write_1602com(weizhi);
write_1602dat(0x20);
weizhi=weizhi-1;
write_1602com(weizhi);
i=i-1;
tab[i]=' ';
}
break;
case 0xb2: //第二功能
{
P2_7=!P2_7;
fun_two=!fun_two;
}
break;
case 0xb3: //led
{
P3_2=!P3_2;
}
break;
case 0x3d: //OK鍵
{
come_in();
switch(fuhao)
{
case 0x2b:ans=val1+val2;break;// 加
case 0xb0:ans=val2-val1;break;// 減
case 0x2a:ans=val2*val1;break;// 乘
case 0x2f:ans=val2/val1;break;// 除
case 0xa0:ans=pow(val2,val1);break;//N次方
case 0xa1:ans=exp(log(val1)/val2);break;//開N次方
case 0xa2:{if(fun_two==0)ans=sin(val1);else ans=asin(val1);fun_two=0;}break;// sin
case 0xa3:{if(fun_two==0)ans=cos(val1);else ans=acos(val1);fun_two=0;}break;//cos
case 0xa4:{if(fun_two==0)ans=tan(val1);else ans=atan(val1);fun_two=0;}break;//tan
case 0xa5:ans=log(val1)/log(val2);break;//log
case 0xa6:ans=jiecheng(val2);break;//階乘
case 0xa7:{if(fun_two==0)ans=zuhe(val2,val1);else ans=pailie(val2,val1);}break;//組合
case 0xa8:ans=leijia(val2,val1);break;//累加
default:ans=val1;
}
sprintf(tab2,"%f",ans); //浮點(diǎn)數(shù)轉(zhuǎn)字符串
weishu=lang(ans); //取得浮點(diǎn)數(shù)位數(shù)
if(weishu>7) //位數(shù)大于7科學(xué)計(jì)數(shù)顯示
{
for(i=8;i>1;i--)
{
tab2[i]=tab2[i-1];
}
tab2[1]='.';
write_1602com(er+9);
weizhi=er+8;
write_1602dat('x');
write_1602dat('1');
write_1602dat('0');
write_1602dat('^');
if(weishu>9) //大于9,取得位數(shù)十位,個(gè)位,分別顯示
{
gao=weishu/10;
di=weishu%10;
write_1602dat(gao+'0');
write_1602dat(di+'0');
}
else
write_1602dat(weishu+'0');
}
else if(weishu<(-7)) //位數(shù)為負(fù)數(shù)
{
weishu=0-weishu; //變正數(shù)
ans=ans*pow(10,weishu); //ans變假分?jǐn)?shù)
sprintf(tab2,"%f",ans); //后面基本同上
write_1602com(er+9);
weizhi=er+9;
write_1602dat('x');
write_1602dat('1');
write_1602dat('0');
write_1602dat('^');
write_1602dat('-');
if(weishu>9)
{
gao=weishu/10;
di=weishu%10;
write_1602dat(gao+'0');
write_1602dat(di+'0');
}
else
write_1602dat(weishu+'0');
}
write_1602com(er);
weizhi=er;
for(i=0;i<8;i++)
{
write_1602dat(tab2[i]);
delay(1);
}
write_1602com(er+15);
weizhi=er+15;
}
break;
case 0xb4: //復(fù)位鍵
{
write_1602com(0x01); //清顯示
write_1602com(0x80); //指針復(fù)位
weizhi=0x80;
for(i=0;i<32;i++)
{
tab[i]=0; //tab[]清0
}
for(i=0;i<9;i++)
{
tab2[i]=0; //tab2[]清0
}
val2=0; //該清0的都清0
val1=0;
fun_two=0;
ans=0;
i=0;
gao=0;di=0;
temp=0;
fuhao=0;
P2_7=0;
}
break;
}
}
}
} |
|