當前位置:編程學習大全網 - 編程語言 - 怎樣用單片機實驗板上的矩陣鍵盤和顯示器編寫壹個簡單的計算器,要求能壹位數和兩位數的加減乘除?

怎樣用單片機實驗板上的矩陣鍵盤和顯示器編寫壹個簡單的計算器,要求能壹位數和兩位數的加減乘除?

#include <reg51.h>

#define uchar unsigned char

long First,End; //定義全局變量

void delay(int n) //***延時程序***//

{int i,j;

for(i=0;i<n;i++)

{for(j=0;j<50;j++)

;}

}

long add(long x,long y) //***加法程序***//

{long z;

z=x+y;

return(z);

}

long sub(long x,long y) //***減法程序***//

{long z;

if(x>=y)

z=x-y;

else

{z=y-x;

z=z+10e6;} //***最高位用1表示負數***//

return(z);

}

long mul(long x,long y) //***乘法程序***//

{long z;

z=x*y;

return(z);

}

long div(long x,long y) //***除法程序***//

{long z;

z=x/y;

return(z);

}

uchar kbscan(void) //***鍵盤掃描程序***//

{

uchar sccode;

P1=0xf0;

if((P1&0xf0)!=0xf0) //發全0行掃描碼,列線輸入

{ delay(222); //延時去抖

if((P1&0xf0)!=0xf0)

{sccode=0xfe; //逐行掃描初值

while((sccode&0x10)!=0)

{P1=sccode; //輸出行掃描碼

if((P1&0xf0)!=0xf0)

{

return(P1);} //如果檢測到有鍵按下,返回鍵值

else

sccode=(sccode<<1)|0x01; //行掃描碼左移壹位

}

}

}

return(0); //無鍵按下,返回值為0

}

void display(void) //***顯示程序***//

{int i;

uchar code rel[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //數碼管選通

uchar code led[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //定義0-9

uchar data num[8];

num[0]=First/10000000; //千萬位

num[1]=First/1000000%10; //百萬位

num[2]=First/100000%10; //十萬位

num[3]=First/10000%10; //萬位

num[4]=First/1000%10; //千位

num[5]=First/100%10; //百位

num[6]=First/10%10; //十位

num[7]=First%10; //個位

for(i=7;i>=0;i--)

{P3=rel[i]; //位選輸出

P2=led[num[i]]; //數據輸出

delay(2); //此延時必不可少?

}

}

void main(void) //***主程序***//

{ int k,n;

uchar f,g,key,gn1;

n=0;

f=0;

P0=0; //初始時指示燈滅

while(1) //不斷查詢是否有按鍵動作

{ key=kbscan(); //獲取返回鍵值

if(key!=0)

{

switch(key) //譯碼,將對應按鍵返回值轉換為相應數值

{

case 0xee: k=0;break;//0

case 0xde: k=1;break;//1

case 0xbe: k=2;break;//2

case 0x7e: k=3;break;//3

case 0xed: k=4;break;//4

case 0xdd: k=5;break;//5

case 0xbd: k=6;break;//6

case 0x7d: k=7;break;//7

case 0xeb: k=8;break;//8

case 0xdb: k=9;break;//9

case 0xbb: k=10;First=0;End=0;f=0;break;//清除

case 0x7b: k=11;break;//等於

case 0xe7: k=12;f=1;break;//加

case 0xd7: k=13;f=2;break;//減

case 0xb7: k=14;f=3;break;//乘

case 0x77: k=15;f=4;break;//除

}

P0=1;

delay(280); //有按鍵時,指示燈的顯示時間

P0=0; //按鍵指示滅

if(k<10) //為數字鍵時(0-9)

{

if(f!=0) //為數字鍵時,如果已經有功能鍵按下

{

n++; //記錄數字鍵所按次數

gn1=0; //清除標誌,再次為功能鍵時進行運算

g=f; //保存運算標誌

if(n==1) //輸入為各位數時,直接賦值

First=k;

else if(n>1) //輸入為多位數時,將它轉化為10進制的多位數

First=First*10+k;

}

else //如果沒有功能鍵按下

{

n++;

gn1=1; //定義標誌,當下壹次為功能鍵時,停止數據輸入

if(n==1)

First=k;

else if(n>1)

First=First*10+k;

End=First; //將第壹個數保存

}

}

else if(k>11) //為功能鍵時(+-*/)

{

if(gn1==1) //前壹次數字鍵之後為功能鍵時

{

n=0; //清除計數標誌

}

else //如果再次輸入功能鍵,則進行運算

{n=0; //清除計數標誌

switch(g)

{case 1: First=add(End,First);break;

case 2: First=sub(End,First);break;

case 3: First=mul(End,First);break;

case 4: First=div(End,First);break;}

}

End=First; //保存本次結果

}

else if(k==11) //為等於號時(=)

{n=0;

gn1=1; //接著輸入為功能鍵時可以繼續運算

switch(g)

{case 1: First=add(End,First);break;

case 2: First=sub(End,First);break;

case 3: First=mul(End,First);break;

case 4: First=div(End,First);break;

}

End=First; //保存最終運算結果

f=0; //清除運算標誌

}

}

display(); //調用顯示程序

}

}

  • 上一篇:我非常想學電腦,我現在初中畢業,我不懂能去哪裏學,能學到真技術
  • 下一篇:山東交通學院專升本專業介紹:電氣工程及其自動化專業?
  • copyright 2024編程學習大全網