#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(); //調用顯示程序
}
}