1樓:3毀滅天使
#include
//#include
#define leds 8
/***按鍵程式***/
char keyscan();
/***顯示程式***/
void display();
char dsp[9]=; //初始化顯示陣列
/***計算程式***/
void calculate(char k,char c1[8],char c2[8]);
/***片選***/
unsigned char code select=
;/***碼選***/
unsigned char code led_codes=
; //e,r,空格,.,-
/***main函式***/
void main(void)
char i,j,k,c;
char a[8],b[8];
/***定時1ms***/
tmod=0;
tl0=-(1000/256);
th0=-(1000%256);
ea = 1; //總中斷開關
et0 = 1; //開中斷
tr0 = 1; //啟用計數器0
ksc:do
for(i=1;i<9;i++) //數字錄入迴圈
dsp[0]=keyscan();
if(c==2&&dsp[0]<10) //此段**驗證是否有舊的計算結果在顯示,且不再參與新計算
dsp[1]=dsp[0];
for(j=2;j<9;j++)
dsp[j]=12;
c=0;
else if(c==2&&dsp[0]>9) //舊的計算結果將參與新的計算,作為第一個數
c=0;
if(dsp[0]==0&&dsp[1]==0&&dsp[2]==12) //個位為0且十位為空時按下0,按鍵無效,跳回ksc等待正確輸入
/***goto跳轉標誌***/
goto ksc;
else if(dsp[0]>9) break; //有操作符按下,跳出數字錄入迴圈
else
while((dsp[0]==15)&&(c==0)); //等號被按下,等待新的操作符(僅對第一個數字有效)
else if(dsp[0]==14) //按下c清零
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
while(dsp[0]==15&&c==0) //未輸滿8位且是第一個數字即按下等號,等待非等號操作符
dsp[0]=keyscan(); //獲取操作符號
if(dsp[0]==14||dsp[0]<10) //按下c或者數字都進行清零,重新輸入a
dsp[0]=14; //將dsp[0]置為14,防止因數字清零未能攔截
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
}while(dsp[0]==14); //數字輸入未完成即按下c,重新等待輸入
doif(c==0) //沒有數字輸入
k=dsp[0]; //存計算符(迴圈內已排除c、=、數字)
for(i=0;i<8;i++) //將第一個數存入a[8]
a[i]=dsp[i+1];
dsp[1]=0; //清零
for(i=2;i<9;i++)
dsp[i]=12;
c=1; //已輸入a
/***goto跳轉標誌***/
goto ksc;
else if(c==1)
for(i=0;i<8;i++) //將第二個數存入b[8]
b[i]=dsp[i+1];
c=2; //已輸入b
if(dsp[0]!=15) //b輸完後操作符不是等號
calculate(k,a,b);
for(i=0;i<8;i++) //將計算結果存入a[8],a值更新
a[i]=dsp[i+1];
k=dsp[0]; //更新計算符
c=1;
/***goto跳轉標誌***/
goto ksc;
}while((dsp[0]==15)&&(c<2)); //直到ab輸入完成且按下等號
calculate(k,a,b); //進行最後計算
/***goto跳轉標誌***/
goto ksc; //跳回ksc,等待新一輪計算
while(1); //防止程式跑飛
char keyscan()
char keyl;
char keyr;
char j;
dodo
p3=0xf0;
p3=p3|0xf0;//行掃描11110000
if(p3!=0xf0)
keyl=p3;
p3=0x0f;
p3=p3|0x0f;//列掃描00001111
keyr=p3;
}while(keyl==0xf0||keyr==0x0f);
for(j=0;j<12;j++) //延時0.001s=1ms
}while(p3!=0x0f);
switch(keyl&keyr)
case 0x28:
case 0x11:
case 0x21:
case 0x41:
case 0x12:
case 0x22:
case 0x42:
case 0x14:
case 0x24:
case 0x44:
case 0x81://加法(第一行,第四列)
case 0x82://減法(第二行,第四列)
case 0x84://乘法(第三行,第四列)
case 0x88://除法(第四行,第四列)
case 0x18://清零(第四行,第一列)
case 0x48://計算結果(第四行,第三列)
void display() interrupt 1 using 1 //利用定時器中斷實現間時顯示
char i,j,h;
et0=0;
for(j=8;j>0;j--) //掃描8次
for(i=7;i>=0;i--) //從高位到低位掃描顯示
p2=0;
p1=led_codes[dsp[8-i]];
p2=select[i];
for(h=0;h<8;h++)
tl0=-(1000/256);
th0=-(1000%256);
et0=1;
void calculate(char k,char a[8],char b[8])
char r[8];
long i,x,y;
i=0;
x=0;
y=0;
for(i=7;i>0;i--) //數值轉化,將代表空格的12轉化為數字0,因為個位不顯示空格,預設為0,所以不轉化
while(a[i]==12)a[i]=0;
while(b[i]==12)b[i]=0;
x=a[4];
x=10000*x;
x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000;
y=b[4];
y=10000*y;
y=y+b[0]+b[1]*10+b[2]*100+b[3]*1000+b[5]*100000+b[6]*1000000+b[7]*10000000;
if(k==10)//加法運算
x=x+y;
if(x>99999999) //大於8位,顯示“err”
r[0]=11; //r
r[1]=11; //r
r[2]=10; //e
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
else
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
if(k==11)//減法運算
if(xx=y-x;
if(x>9999999)
r[0]=11; //r
r[1]=11; //r
r[2]=10; //e
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
else
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
for(i=7;i>0;i--) //將有效數字的高一位轉化為-號
if(r[i]==0&&r[i-1]!=0)
r[i]=14;
break;
else
x=x-y;
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
if(k==12)//乘法運算
i=x;
x=x*y;
if(y==0)
x=0;
else if(x>99999999||xr[0]=11; //r
r[1]=11; //r
r[2]=10; //e
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
else
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
if(k==13)//除法運算
if(y==0) //被除數不能為0
r[0]=11; //r
r[1]=11; //r
r[2]=10; //e
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
else
x=x/y;
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
for(i=7;i>0;i--) //數值轉化,將高位的無效數字0轉化為空格符12
if(r[i]==0)
r[i]=12;
else
break;
for(i=0;i<8;i++) //將計算結果存入dsp[9],顯示數更新
dsp[i+1]=r[i];
123456789x9利用計算器找規律,寫式子
具體回答如下 123456789 9 1111111101123456789 18 2222222202123456789 27 3333333303123456789 36 4444444404乘法運算性質 幾個數的積乘乙個數,可以讓積裡的任意乙個因數乘這個數,再和其他數相乘。例如 25 3 9 ...
求助金融理財計算器 函式科學計算器區別
金融理財計算器仍然可以當函式科學計算器使用,只是操作手法不太一樣,要研究說明書,他比科學計算器功能強大很多,可以直接算終值,貼現率等等 牌子就買德州儀器的吧,所有大型的考試都可以帶它,它就三種型號吧,你根據自己能承受的價位選吧, 金融計算器是針對銀行 保險 房地產 投資以及商業等相關行業的特點開發的...
用計算器計算混和運算時按0N c開啟計算器先輸入前一步再輸入
ms 儲存當前顯示的資料 a 只能儲存乙個資料,之前已經儲存的資料被改寫回。m 加法運算,答當前顯示的資料b 儲存的資料a 得到c,儲存結果資料c。顯示資料仍為b。mr 顯示儲存的結果資料c mc 清除所儲存的資料 用計算器汁算25x14時,按on c鍵開啟計算器,先輸入什麼,再輸入什麼?先輸入25...