#include <reg52.h> #include <intrins.h>//循環左右移要用該頭文件(-cror-(),-crol-()) #define uchar unsigned char #define ulong unsigned long uchararray[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}; uchararray1[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}; uchar a; ulong num1=0,num2=0; sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3; sbit F1=PSW^1;//定義一個標志位,F0在頭文件里已定義 void displayljy(void);//聲明"顯示"子函數 void inkeylove(void);//聲明"判斷按下的是什么鍵"子函數 void iskeyyou(void);//聲明"判斷是否有鍵按下"子函數 void bian1(void);//聲明"將uchar型變量轉化為ulong型變量"子函數 void bian2(void);//聲明"將ulong型變量轉化為uchar型變量"子函數 void jia(void);//聲明"加運算"子函數 void jian(void);//聲明"減運算"子函數 void cheng(void);//聲明"乘運算"子函數 void chu(void);//聲明"除運算"子函數 void error(void);//聲明"出錯顯示"子函數 void main() {uchar r7=0x00,i; while(1) {displayljy(); inkeylove(); if(a!=0xff)//如果有鍵輸入,繼續往下執行,否則從新開始 {if(a==0x0f) //如果輸入的是"清除"鍵,將顯示器清屏,同時清存放運算符號的單元 {r7=0x00; for(i=0;i<8;i++) {array=0x10; array1=0x10; } } else if(a==0x0e)//如果輸入的是"=",繼續往下執行,否則從新開始 {if(r7==0x0d)//如果r7中存放的是"+",則執行加運算 {bian1(); jia(); bian2(); } else if(r7==0x0c)//如果r7中存放的是"-",則執行減運算 {bian1(); jian(); } elseif(r7==0x0b)//如果r7中存放的是"*",則執行乘運算 {bian1(); cheng(); bian2(); } elseif(r7==0x0a)//如果r7中存放的是"÷",則執行除運算 {bian1(); chu(); } else error();//如果r7沒有存進運算符,則轉出錯處理 } else {if(r7!=0x00)//如果已按過運算鍵,往下執行,否則轉else {if(a>0x09&&a<0x0e)//如果還按下運算鍵,則后按的取代前面按的 r7=a; elseif(array1[0]==0x10)//判斷是不是輸入加數(減數...)的第一個數 {for(i=0;i<8;i++)//是的話,將被加數(被減數...)存入array1中 array1=array; for(i=0;i<8;i++) array=0x10; for(i=7;i>0;i--)//array中存入加數(減數...) array=array[i-1]; array[0]=a; } else //不是輸入加數(減數...)的第一個數 {if(array[7]!=0x10)//如果加數(減數...)已是八位整數,則轉出錯處理 error(); else {for(i=7;i>0;i--)//否則將加數左移 array=array[i-1]; array[0]=a; } } } else//之前還沒有運算鍵按下 {if(a>0x09)//有運算鍵按下 {if(array[0]==0x10)//但是在運算鍵按下之前沒有輸入被加數,則轉出錯 error(); else r7=a;//否則將運算鍵輸入r7中保存 } else if(array[7]!=0x10)//如果被加數已是八位整數,則轉出錯 error(); else //否則將被加數左移 {for(i=7;i>0;i--) array=array[i-1]; array[0]=a; } } } } } } void bian1(void)//"將uchar型變量轉化為ulong型變量"子函數 {uchar i; for(i=7;i>0;i--) {if(array==0x10) array=0x00; if(array1==0x10) array1=0x00; } num1=(ulong)array1[7]*10000000; num1+=(ulong)array1[6]*1000000; num1+=(ulong)array1[5]*100000; num1+=(ulong)array1[4]*10000; num1+=(ulong)array1[3]*1000; num1+=(ulong)array1[2]*100; num1+=(ulong)array1[1]*10; num1+=(ulong)array1[0]; num2=(ulong)array[7]*10000000; num2+=(ulong)array[6]*1000000; num2+=(ulong)array[5]*100000; num2+=(ulong)array[4]*10000; num2+=(ulong)array[3]*1000; num2+=(ulong)array[2]*100; num2+=(ulong)array[1]*10; num2+=(ulong)array[0]; } void bian2(void)//聲明"將ulong型變量轉化為uchar型變量"子函數 {uchar i=7,F0=1; if(num1>99999999) error(); else {array[7]=(uchar)(num1/10000000); array[6]=(uchar)(num1%10000000/1000000); array[5]=(uchar)(num1%1000000/100000); array[4]=(uchar)(num1%100000/10000); array[3]=(uchar)(num1%10000/1000); array[2]=(uchar)(num1%1000/100); array[1]=(uchar)(num1%100/10); array[0]=(uchar)(num1%10); while(i>0&&F0) {if(array==0x00) {array=0x10; i--; } else F0=0; } } } void jia(void)//"加運算"子函數 {num1+=num2; } void jian(void)//"減運算"子函數 {uchar i; if(num1>num2) {num1-=num2; bian2(); } else if(num1==num2) {for(i=1;i<8;i++) array=0x10; array[0]=0x00; } else {num1=num2-num1; bian2(); if(array[7]!=0x10) error(); else array[7]=0x11; } } void cheng(void)////聲明"乘運算"子函數 {num1*=num2; } void chu(void)//"除運算"子函數 {uchar i,j=0x00,k; double num3; num3=(double)(num1)/(double)(num2); num1=(ulong)(num3); num3-=num1; if(num3==0||num1>9999999) bian2(); else {bian2(); while(array[7]==0x10) {j++; for(i=7;i>0;i--) array=array[i-1]; array[0]=0x10; } array[j]+=0x12; k=j-1; while(k>0) {num3*=10; num2=(ulong)(num3); num3-=num2; array[k]=(uchar)(num2); k--; } array[0]=(uchar)(num3*10); while(array[0]==0x00) {for(i=0;i<7;i++) array=array[i+1]; array[7]=0x10; } } } void error(void)//"出錯顯示"子函數(出錯顯示"Chu cuo.") {array[7]=0x0c; array[6]=0x1d; array[5]=0x1f; array[4]=0x10; array[3]=0x10; array[2]=0x1c; array[1]=0x1f; array[0]=0x1e; } void displayljy(void)//"顯示"子函數 {uchararray3[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00,0x40,0xbf,0x86,0xdb, 0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef, 0x58,0x74,0xdc,0x1c}; uchar *p=array,count=0x80,i,time; F0=1; while(F0) {i=*(p+7); P2=count; P0=array3; for(time=0xff;time>0x00;time--); p--; count=_cror_(count,1); if(count==0x80) F0=0; } } void iskeyyou(void)//"判斷是否有鍵按下"子函數 {P2=0x00; P1|=0x0f; a=P1; a|=0xf0; } void inkeylove(void)//"判斷按下的是什么鍵"子函數 {uchar b=0xfe,c=0x00,d; uchar array4[16]={0x07,0x08,0x04,0x05,0x01,0x02,0x0f,0x00, 0x09,0x0a,0x06,0x0b,0x03,0x0c,0x0e,0x0d}; F1=0; iskeyyou(); if(a!=0xff) {displayljy(); displayljy(); iskeyyou(); if(a!=0xff) {F0=1; while(F0) {P2=b; P1|=0x0f; if(P10==0) {a=0x00; F1=1; } else if(P11==0) {a=0x02; F1=1; } else if(P12==0) {a=0x04; F1=1; } else if(P13==0) {a=0x06; F1=1; } else {a=c; a%=4; if(a==0x01) {a=0x07; c+=a; } else c++; b=_crol_(b,1); if(b&0x10==0) {F0=0; a=0xff; } } while(F1) {a+=c; a=array4[a]; d=a; while(a!=0xff) {displayljy(); iskeyyou(); } a=d; F1=0; F0=0; } } } } }
|