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

時間 2021-08-30 09:49:25

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;

個位為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];

微控制器的簡易計算器,怎麼用51微控制器做簡易計算器?

基本功能介紹 簡單的加減乘除的運算。時間顯示功能,而且能實現計算器模組和時間模組之間的任意切換。按鍵音卻換功能。原理 多功能微控制器計算器是一個實現加減乘除的和時間功能的計算器,主要的硬體組成由,一個at89s52微控制器晶片,一個led液晶 1602液晶 一個4 4鍵盤,和4個特殊功能按鍵。一個時...

C簡易計算器

label 控制元件不包含content這個屬性,你把label3.content全部替換成label3.text 意思是label3控制元件顯示的內容 label3.content 沒有content,你寫成this.label3.text this,是指此頁面中的label控制元件的text文字...

微控制器做計算器的程式,怎樣用51微控制器做計算器啊?

刺友互 1 直接呼叫庫函式。2 下面是函式的配置,從中可以看出,i 0時,埠25.16.4所對應的燈亮,i 1時,埠27.28.5所對應的燈亮,在for迴圈中,兩組燈交替閃爍。3 通過自定義巨集進行操作,來實現。4 自定義的巨集如下,將燈的埠及開關,通過自定義巨集的方式,可以在程式中進行直接操作。5...