从网上找的没有实践过;
/*--------------------------------------
计算器源程序
Calculator progarm V1.0
MCU STC89C52RC XAL 12MHz
Build by Gavin Hu, 2007.11.23
--------------------------------------*/
#include <reg51.h>
//
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define MAX_NUM 99999992.0
#define MIN_NUM -9999992.0
sbit BUZZ=P3^7;
uchar dec_flag;
void delay(uint);
void display(uchar*);
uchar key_scan(uint);
uchar add_number(uchar*,uchar);
float str2float(uchar*);
uchar float2str(uchar*,float);
float calcu(float,float,uchar);
void err_sound(void);
/*--------------------------------------
main function
--------------------------------------*/
void main(void)
{
uchar kk,mm,err,lk,d1ok,ec;
uchar dispram[9];
float d1,d2;
err=0;
d1ok=0;
ec=0;
mm=0;
dec_flag=0;
d1=0.0;
d2=0.0;
float2str(dispram,d1);
BUZZ=0;
for (kk=10;kk;kk--) display(dispram);
BUZZ=1;
while (!err)
{
display(dispram);
kk=key_scan(((uint)(P3)<<8)|P1);
if (kk!=0xff)
{
BUZZ=0;
display(dispram);
BUZZ=1;
switch (kk)
{
case 0: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,7);
lk=0; ec=0; break;
case 1: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,8);
lk=0; ec=0; break;
case 2: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,9);
lk=0; ec=0; break;
case 3: if (!d1ok) {d1=str2float(dispram); d1ok=1;}
else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
kk=float2str(dispram,d1);
if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
lk=1; mm=4; ec=0; break;
case 4: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,4);
lk=0; ec=0; break;
case 5: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,5);
lk=0; ec=0; break;
case 6: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,6);
lk=0; ec=0; break;
case 7: if (!d1ok) {d1=str2float(dispram); d1ok=1;}
else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
kk=float2str(dispram,d1);
if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
lk=1; mm=3; ec=0; break;
case 8: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,1);
lk=0; ec=0; break;
case 9: if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,2);
lk=0; ec=0; break;
case 10:if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,3);
lk=0; ec=0; break;
case 11:if (!d1ok) {d1=str2float(dispram); d1ok=1;}
else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
kk=float2str(dispram,d1);
if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
lk=1; mm=2; ec=0; break;
case 12:if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,0);
lk=0; ec=0; break;
case 13:if (lk) {float2str(dispram,0.0); dec_flag=0;}
add_number(dispram,10);
lk=0; ec=0; break;
case 14:if (!d1ok) {d1=str2float(dispram); d1ok=1;}
else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
kk=float2str(dispram,d1);
if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
lk=1; mm=1; ec=0; break;
case 15:if (ec==0)
{
if (!d1ok) d1=str2float(dispram);
else {d2=str2float(dispram); d1=calcu(d1,d2,mm); ec=1;}
}
else {d1=calcu(d1,d2,mm);}
kk=float2str(dispram,d1);
if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
lk=2; d1ok=0; break;
}
while ((P1&P3)!=0xff) display(dispram);
}
}
dispram[0]=14;
for (kk=1;kk<8;kk++) dispram[kk]=17;
dispram[8]=255;
err_sound();
while (1)
{
display(dispram);
kk=key_scan(((uint)(P3)<<8)|P1);
if (kk!=0xff)
{
err_sound();
while ((P1&P3)!=0xff) display(dispram);
}
}
}
/*--------------------------------------
Delay function
Parameter: unsigned int dt
Delay time=dt(ms)
--------------------------------------*/
void delay(unsigned int dt)
{
register unsigned char bt,ct;
for (; dt; dt--)
for (ct=2;ct;ct--)
for (bt=250; --bt; );
}
/*--------------------------------------
8 LED digital tubes display function
Parameter: sting pointer to display
--------------------------------------*/
void display(uchar*disp_ram)
{
unsigned char i;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
for (i=0;i<8;i++)
{
if (disp_ram[8]==i) P0 =table[disp_ram]&0x7f;
else P0 =table[disp_ram];
P2 =0x01<<i;
delay(2);
P0 =0xff;
P2 =0;
}
}
/*--------------------------------------
Key scan function
Parameter key port state word
Return key number,255 no key press
--------------------------------------*/
uchar key_scan(uint key_port)
{
unsigned char i;
for (i=0;i<16;i++)
{
if (!(key_port&0x0001)) return i;
key_port >>=1;
key_port |=0x8000;
}
return 0xff;
}
/*--------------------------------------
Add number (input figures) function
Parameter:pointer for result,new number
Retrun:0 fail,other ok
--------------------------------------*/
uchar add_number(uchar*ch,uchar num)
{
uchar i;
if (ch[0]!=17) return 0;
if (num==10)
if (!dec_flag)
{dec_flag=1;return 2;}
else return 0;
if ((!dec_flag)&&(ch[7]==0)&&(ch[6]==17)) {ch[7]=num;return 1;}
for (i=0;i<7;i++) ch=ch[i+1];
ch[7]=num;
ch[8]-=dec_flag;
return 1;
}
/*--------------------------------------
String to float function
Parameter:pointer of string
Return result, 0xffffffff fail
--------------------------------------*/
float str2float(uchar*ch)
{
uchar i,ng;
float dt,ft;
ng=0;
dt=0.0;
ft=1.0;
i=ch[8];
do {
if (ch>9)
{
if (ch==16) ng=1;
break;
}
dt+=ch*ft;
ft*=10.0;
} while (i--);
ft=0.1;
for (i=ch[8]+1;i<8;i++)
{
dt+=ch*ft;
ft/=10.0;
}
if (ng) dt*=-1.0;
if ((dt>MAX_NUM)||(dt<MIN_NUM)) return 0xffffffff;
else return dt;
}
接下一个
|