C51编写的计算器小程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code leddp[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//未带小数点的数码管显示代码
uchar code leddot[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的数码显示代码
uchar code wey[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//八位显示码
uchar load[]={0,0,0,0,0,0,0,0};//八位装值数组
double figure1,figure2;//参加运算的两个数字
uchar keynum;
void display();
/*************************************
延时1ms基准
**************************************/
void delay(uint i)
{
uchar j;
while(i--)
for (j=0;j<115;j++);//延时1毫秒程序
}


//按键扫描函数
uchar keyscan()
{
uchar temp,scan1,scan2,num;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0)
{
delay(20);
scan1=P1;
if((scan1&0xf0)!=0xf0)
{
P1=0x0f;
scan2=P1;
temp=scan1|scan2;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=11;break;//加号
case 0xed:num=4;break;
case 0xdd:num=5;break;
case 0xbd:num=6;break;
case 0x7d:num=12;break;//减号
case 0xeb:num=7;break;
case 0xdb:num=8;break;
case 0xbb:num=9;break;
case 0x7b:num=13;break;//乘号
case 0xe7:num=16;break;//小数点
case 0xd7:num=0;break;
case 0xb7:num=15;break;//等号
case 0x77:num=14;break;//除号
}
while(1)//等待按键释放
{
P1=0xf0;
if((P1&0xf0)==0xf0)
break;
else display();
}
return num;
}
}
return 55;//表示无信号
}


//数码管显示函数
void display()
{
double figure;
uchar seat,i;
figure=figure1;
//确定显示数位
if(figure>99999)
seat=8;
else if(figure>9999)
seat=7;
else if(figure>999)
seat=6;
else if(figure>99)
seat=5;
else if(figure>9)
seat=4;
else
seat=3;

//把数装到数组中
load[0]=(long)(figure*100)%10;//两位浮点型数的注入
load[1]=(long)(figure*10)%10;
for(i=2;i<seat;i++)
{
load[i]=(long)figure%10;//取最低位
figure=figure/10;//缩进
}

//显示
for(i=0;i<seat;i++)
{
P2=wey[i];
if(i==2)
P0=leddot[load[i]];//第三位带小数点
else
P0=leddp[load[i]];
delay(2);
P2=0xff;
}
}

//主函数
void main()
{
uchar decimal,count,mark=0;
figure1=figure2=keynum=decimal=count=0;
while(1)
{
keynum=keyscan();
if((keynum>=0)&&(keynum<=9))//输入的是数字
{
if(decimal==0)//整数部分
figure1=keynum+figure1*10;
if(decimal==1)//小数部分
{
count++;
switch(count)
{
case 1:figure1=figure1+keynum*0.1;break;
case 2:{figure1=figure1+keynum*0.01;count=0;decimal=0;};break;
}
}
}
if((keynum>=11)&&(keynum<=14))
{
mark=keynum;//符号
figure2=figure1;
figure1=0;
decimal=
0;
}
if(keynum==15)//输入等号
{
switch(mark)
{
case 11:figure1=figure2+figure1;break;
case 12:

figure1=figure2-figure1;break;
case 13:figure1=figure2*figure1;break;
case 14:figure1=figure2/figure1;break;
}
decimal=0;
}
if(keynum==16)
{
decimal=1;//小数位
}
display();
}
}









相关文档
最新文档