誰有簡易計算器利用微控制器制作的,LED數碼管顯示的

2021-08-20 22:09:24 字數 6140 閱讀 1185

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...