|
发表于 2007-5-22 18:37:32
|
显示全部楼层
做过一个,显示和键盘都是从旧机器上拆下来的,不过机器早已给一个朋友了。
好象程序还在:
这个还是个带时钟的。
- //---------------------------------------------------
- //CLOCK CALCULATOR 1.0 written by HeLiang 2000.2.25
- //Email:lianghe@126.com [url]http://spacemirror.yeah.net[/url]
- //This is a freeware. If you find bugs please tell me.
- //Thanks! He Liang 2000.2.25
- //---------------------------------------------------
- #include <reg51.h>
- #include <stdio.h>
- #include <absacc.h>
- #define dbp (*((unsigned int *)0x2C001L))
- unsigned char dbuf[12];
- unsigned int delaycnt=0;
- idata unsigned char number[7];
- idata unsigned char prenumber[7];
- idata unsigned char memory[7];
- bit pointON=0,newenter=1,overflow=0,result=0,numenter=1;
- unsigned char temp[12],lastc=0,tpoint=0;
- #include "clockfnc.c"
- void inittimer0(void)
- {
- TMOD&=0xf0;
- TMOD+=0x02;
- TH0=TL0=6;
- TR0=1;
- ET0=1;
- EA=1;
- }
- void cls(void)
- {
- unsigned char i;
- for(i=0;i<12;i++)dbuf[i]=0;
- }
- void settime(void)
- {
- code unsigned char stbl[]={0,1,3,4,6,7};
- unsigned char i,c;
- cls();
- dbuf[2]=asctb['-'-0x20];
- dbuf[5]=asctb['-'-0x20];
- for(i=5;i<7;i--)
- {
- c=_getkey();
- if(c=='o')c='0';
- if(c>='0'&&c<='9')
- {
- temp[i]=c-0x30;
- dbuf[stbl[i]]=asctb[temp[i]+0x10];
- }
- else goto stquit;
- }
- EA=0;
- sec=(temp[0]+temp[1]*10)%60;
- min=(temp[2]+temp[3]*10)%60;
- hour=(temp[4]+temp[5]*10)%24;
- timcnt=4000;
- EA=1;
- stquit:
- return;
- }
- void showtime(void)
- {
- unsigned char se;
- cls();
- while(1)
- {
- se=timekey();
- if(se=='B')settime();
- else if(se=='R')break;
- }
- }
- unsigned char getbcd(unsigned char *p,unsigned char c)
- {
- if((c&1)==0)
- {
- c>>=1;
- return p[c]&0xf;
- }
- else
- {
- c>>=1;
- return (p[c]&0xf0)>>4;
- }
- }
- void putbcd(unsigned char *p,unsigned char c,unsigned char a)
- {
- if((c&1)==0)
- {
- c>>=1;
- p[c]&=0xf0;
- p[c]|=a&0xf;
- }
- else
- {
- c>>=1;
- a<<=4;
- p[c]&=0xf;
- p[c]|=a&0xf0;
- }
- }
- void transbuf(void)
- {
- unsigned char i;
- for(i=0;i<7;i++)prenumber[i]=number[i];
- }
- void alterbuf(void)
- {
- unsigned char i,c;
- for(i=0;i<7;i++)
- {
- c=number[i];
- number[i]=prenumber[i];
- prenumber[i]=c;
- }
- }
- void clearbuf(void)
- {
- unsigned char i;
- for(i=0;i<7;i++)number[i]=0;
- pointON=0;
- numenter=0;
- newenter=0;
- }
- void movebuf(void)
- {
- unsigned char i;
- for(i=10;i>0;i--)putbcd(number,i,getbcd(number,i-1));
- if(pointON)number[6]++;
- }
- void unmove(void)
- {
- unsigned char i;
- putbcd(number,10,0);
- for(i=0;i<11;i++)putbcd(number,i,getbcd(number,i+1));
- if((number[6]&0x7f)>0)number[6]--;
- else pointON=0;
- }
- bit inputnumber(unsigned char c)
- {
- unsigned char i;
- if(numenter)clearbuf();
- if(getbcd(number,10)!=0||(number[6]&0x7f)>9)return 0;
- movebuf();
- putbcd(number,0,c-0x30);
- return 1;
- }
- void dispnumber(void)
- {
- unsigned char i;
- bit zero=0;
- if(overflow)
- {
- for(i=1;i<12;i++)dbuf[i]=0;
- dbuf[4]=asctb['E'-0x20];
- dbuf[3]=asctb['R'-0x20];
- dbuf[2]=asctb['R'-0x20];
- dbuf[1]=asctb['O'-0x20];
- dbuf[0]=asctb['R'-0x20];
- return;
- }
- for(i=10;i<11;i--)
- {
- if(zero||getbcd(number,i)!=0||i==(number[6]&0x7f))
- {
- dbuf[i]=asctb[getbcd(number,i)+0x10];
- zero=1;
- }
- else dbuf[i]=0;
- }
- dbuf[number[6]&0x7f]|=0x8;
- if(number[6]&0x80)dbuf[11]=0x80;else dbuf[11]=0;
- for(i=0;i<6;i++)if(memory[i]!=0)break;
- if(i!=6)dbuf[11]|=0x20;
- }
- void tempmove(unsigned char c)
- {
- unsigned char i;
- c%=24;
- for(i=0;i<24-c;i++)putbcd(temp,i,getbcd(temp,i+c));
- for(;i<24;i++)putbcd(temp,i,0);
- }
- void temp2num(unsigned char *p)
- {
- unsigned char i;
- for(i=0;i<24;i++)
- {
- if(getbcd(temp,i)!=0)break;
- if(tpoint==0)break;
- tpoint--;
- }
- if(tpoint>10){i+=tpoint-10;tpoint=10;}
- tempmove(i);
- for(i=23;i!=0;i--)if(getbcd(temp,i)!=0)break;
- if(i>10)
- {
- i-=10;
- if(tpoint>=i)
- {
- tempmove(i);
- tpoint-=i;
- }
- else overflow=1;
- }
- if(tpoint>10)tpoint%=11;
- p[6]&=0x80;
- p[6]|=tpoint;
- for(i=0;i<11;i++)putbcd(p,i,getbcd(temp,i));
- }
- //----------------------add-------------------------------
- void add(unsigned char *p1,unsigned char *p2,unsigned char *p3)
- {
- unsigned char i,c,prec,a,b;
- unsigned char cy=0;
- bit big=0;
- tpoint=p2[6]&0x7f;
- c=p1[6]&0x7f;
- if(tpoint<c)tpoint=c;
- c=tpoint-p1[6]&0x7f;
- prec=tpoint-p2[6]&0x7f;
- if((p1[6]&0x80)==(p2[6]&0x80))
- {
- for(i=0;i<24;i++)
- {
- if(i-c<11)a=getbcd(p1,i-c);else a=0;
- if(i-prec<11)b=getbcd(p2,i-prec);else b=0;
- a=a+b+cy;
- if(a>9){putbcd(temp,i,a-10);cy=1;}
- else {putbcd(temp,i,a);cy=0;}
- }
- }
- else
- {
- for(i=23;i<24;i--)
- {
- if(i-c<11)a=getbcd(p1,i-c);else a=0;
- if(i-prec<11)b=getbcd(p2,i-prec);else b=0;
- if(a>b){big=1;break;}
- if(a<b){big=0;break;}
- }
- for(i=0;i<24;i++)
- {
- if(i-c<11)a=getbcd(p1,i-c);else a=0;
- if(i-prec<11)b=getbcd(p2,i-prec);else b=0;
- if(big)a=a-b-cy;else a=b-a-cy;
- if(a>9){putbcd(temp,i,a+10);cy=1;}
- else {putbcd(temp,i,a);cy=0;}
- }
- p3[6]&=0x7f;
- if(big)p3[6]|=(p2[6]&0x80)^0x80; else p3[6]|=p2[6]&0x80;
- }
- temp2num(p3);
- }
- //-----------------------multi------------------------------
- void multi(unsigned char *p1,unsigned char *p2,unsigned char *p3)
- {
- unsigned char i,j,c,t;
- for(i=0;i<12;i++)temp[i]=0;
- for(i=0;i<11;i++)
- {
- c=0;
- for(j=0;j<11;j++)
- {
- t=getbcd(p1,j)*getbcd(p2,i)+c+getbcd(temp,i+j);
- c=t/10;
- putbcd(temp,i+j,t%10);
- }
- putbcd(temp,i+j,c);
- }
- tpoint=(p1[6]&0x7f)+(p2[6]&0x7f);
- c=(p1[6]&0x80)^(p2[6]&0x80);
- p3[6]&=0x7f;
- p3[6]|=c;
- temp2num(p3);
- }
- //------------------------divide----------------------------
- void moveright(unsigned char *p,unsigned char c)
- {
- unsigned char i;
- c%=12;
- for(i=0;i<12-c;i++)putbcd(p,i,getbcd(p,i+c));
- for(;i<12;i++)putbcd(p,i,0);
- }
- void moveleft(unsigned char *p,unsigned char c)
- {
- unsigned char i;
- if(c==0)return;
- for(i=11;i>=c;i--)putbcd(p,i,getbcd(p,i-c));
- for(;i<12;i--)putbcd(p,i,0);
- }
- unsigned char sub(unsigned char *p1,unsigned char *p2) //0 p1>=p2 1 p1<p2
- {
- unsigned char i,c,cy=0,cn;
- cn=0;
- while(cn<10)
- {
- for(i=11;i<12;i--)
- {
- if(getbcd(p1,i)<getbcd(p2,i))return cn;
- if(getbcd(p1,i)>getbcd(p2,i))break;
- }
- cy=0;
- for(i=0;i<12;i++)
- {
- c=getbcd(p1,i)-getbcd(p2,i)-cy;
- if(c>=10){cy=1;c+=10;}
- else cy=0;
- putbcd(p1,i,c);
- }
- cn++;
- }
- return 0;
- }
- void div(unsigned char *p1,unsigned char *p2,unsigned char *p3)
- {
- unsigned char i,po1,po2,c;
- po1=p1[6]&0x7f;po2=p2[6]&0x7f;
- for(i=0;i<6;i++)temp[i]=p1[i];
- for(i=0;i<6;i++)temp[i+6]=p2[i];
- for(i=10;i!=0;i--)if(getbcd(temp,i)!=0)break;
- if(i<10){moveleft(temp,10-i);po1+=10-i;}
- for(i=10;i<11;i--)if(getbcd(temp+6,i)!=0)break;
- if(i<10){moveleft(temp+6,10-i);po2+=10-i;}else{overflow=1;return;}
- for(i=11;i<12;i--)
- {
- c=sub(temp,temp+6);
- putbcd(p3,i,c);
- moveleft(temp,1);
- }
- if(getbcd(p3,11)!=0){moveright(p3,1);c=10;}
- else c=11;
- c+=po1-po2;
- if(c<0x80)
- {
- if(c>10)
- {
- c-=10;
- moveright(p3,c);
- c=10;
- }
- }
- else
- {
- overflow=1;
- }
- if(c>10)c%=11;
- c|=(p1[6]&0x80)^(p2[6]&0x80);
- p3[6]=c;
- }
- //------------------------MR--------------------------
- void memoryrestore(void)
- {
- unsigned char i;
- for(i=0;i<7;i++)number[i]=memory[i];
- }
- //----------------------------------------------------
- void sortzero(unsigned char *p)
- {
- unsigned char i;
- for(i=0;i<11;i++)
- {
- if(getbcd(p,i)!=0)break;
- if((p[6]&0x7f)==0)break;
- p[6]--;
- }
- moveright(p,i);
- for(i=0;i<6;i++)if(p[i]!=0)break;
- if(i==6)p[6]=0;
- }
- //------------------------ M+ ----------------------------
- void memoryplus(void)
- {
- add(memory,number,memory);
- sortzero(memory);
- }
- //------------------------MC--------------------------
- void memoryclear(void)
- {
- unsigned char i;
- for(i=0;i<7;i++)memory[i]=0;
- }
- //------------------------ M- ---------------------------
- void memorysub(void)
- {
- number[6]^=0x80;
- add(memory,number,memory);
- number[6]^=0x80;
- sortzero(memory);
- }
- //----------------------------------------------------
- void cal(void)
- {
- if(lastc==0)return;
- if(result)return;
- cls();
- dbuf[10]=asctb['r'-0x20];
- dbuf[9]=asctb['v'-0x20];
- dbuf[8]=asctb['n'-0x20];
- if(!newenter)alterbuf();
- switch(lastc)
- {
- case '+':
- add(number,prenumber,number);
- break;
- case '-':
- prenumber[6]^=0x80;
- add(number,prenumber,number);
- prenumber[6]^=0x80;
- break;
- case '*':
- multi(number,prenumber,number);
- break;
- case '/':
- div(number,prenumber,number);
- break;
- }
- sortzero(number);
- }
- void cputs(char *p)
- {
- while(*p!=0){putchar(*p);p++;delay(500);}
- }
- main()
- {
- unsigned char c;
- inittimer0();
- cputs("Clock Calculator 1.0 By He Liang");
- delay(4000);
- showtime();
- overflow=0;
- clearbuf();
- transbuf();
- lastc=0;
- result=0;
- newenter=1;
- numenter=1;
- while(1)
- {
- dispnumber();
- c=_getkey();
- if(c>='0'&&c<='9')inputnumber(c);
- else if(c=='o')
- {
- inputnumber('0');
- inputnumber('0');
- }
- else if(c=='.'){if(numenter)clearbuf();pointON=1;}
- else if(c=='H'){if(!numenter)unmove();}
- else if(c=='F')number[6]^=0x80;
- else
- {
- switch(c)
- {
- case '+':
- if(!newenter)cal();
- transbuf();
- lastc='+';
- result=0;
- break;
- case '-':
- if(!newenter)cal();
- transbuf();
- lastc='-';
- result=0;
- break;
- case '*':
- if(!newenter)cal();
- transbuf();
- lastc='*';
- result=0;
- break;
- case '/':
- if(!newenter)cal();
- transbuf();
- result=0;
- lastc='/';
- break;
- case 'S':
- if(result)newenter=1;
- result=0;
- cal();
- result=1;
- break;
- case 'R':
- clearbuf();
- transbuf();
- overflow=0;
- lastc=0;
- result=0;
- break;
- case 'G':
- if(overflow)
- {
- overflow=0;
- clearbuf();
- transbuf();
- lastc=0;
- result=0;
- }
- clearbuf();
- break;
- case 'B':
- if(!newenter)cal();
- memoryplus();
- lastc=0;
- break;
- case 'C':
- if(!newenter)cal();
- memorysub();
- lastc=0;
- break;
- case 'D':
- memoryclear();
- break;
- case 'E':
- showtime();
- break;
- }
- numenter=1;
- if(c=='A')
- {
- memoryrestore();
- newenter=0;
- }
- else newenter=1;
- }
- }
- }
- code char ver[]="Written by He Liang 2000.2.25 Email:lianghe@126.com";
复制代码 |
|