前段时间,本人写了基于51单片机和四位数码管的智能计算器算法,由于时间关系,算法没能实现小数部分,但已为小数部分留出空间,有兴趣的可以添加进去
下面是源代码(矩阵键盘的检测部分参考了普中科技的实验例程)
#include "reg52.h"
#include "math.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
float m,l;
int t;
char a, j;
char b[4];
char n=0, fuhao;
char bj=0, xs, xsbj, xsb=0, x,xa;
u8 KeyValue;
u8 DisplayData[4];
u8 data smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//显示0~F的值
u8 data smgxiaoshu[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef};
void delay(u16 i)
{
while(i--);
}
void KeyDown(void)
{
char c=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((c<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
c++;
}
switch(KeyValue)
{
case 0: a=7;break;
case 1: a=8;break;
case 2: a=9;break;
case 3: a=-1;break;
case 4: a=4;break;
case 5: a=5;break;
case 6: a=6;break;
case 7: a=-2;break;
case 8: a=1;break;
case 9: a=2;break;
case 10: a=3;break;
case 11: a=-3;break;
case 12: a=-4;break;
case 13: a=0;break;
case 14: a=-5;break;
case 15: a=-6;break;
}
if(a>=0)
{
n++;
}
if(a<0&&a!=-5&&a!=-4)
{
n=0;
}
}
}
}
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
}
P0=DisplayData[i];
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void shuruzhi()
{
int i;
switch(n)
{
case 0:
DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;
i=0; break;
case 1:
if(i==0)
{
b[0]=a;
DisplayData[0]=smgduan[a]; DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;
i++ ;
x=1;
}
break;
case 2:
if(i==1)
{
b[1]=b[0];b[0]=a;
DisplayData[1]=DisplayData[0];DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[0]=smgduan[a];
i++;
x=2;
}
break;
case 3:
if(i==2)
{
b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];DisplayData[3]=0x00;
i++;
x=3;
}
break;
case 4:
if(i==3)
{
b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];
i++;
x=4;
}
break;
}
if(a==-4)
{
DisplayData[0]=smgxiaoshu[b[0]];
xs=a;
xsbj=x;
}
if(n==1)
{
b[1]=0;b[2]=0;b[3]=0;
}
if(n==2)
{
b[2]=0;b[3]=0;
}
if(n==3)
{
b[3]=0;
}
if(a<0)
{
if(xs==-4)
{
xsbj=x-xsbj;
if(xs==-4&&xsbj!=0)
{
if(xsbj==1)
{
l=b[3]*100+b[2]*10+b[1]*1+b[0]*0.1;
}
if(xsbj==2)
{
l=b[3]*10+b[2]*1+b[1]*0.1+b[0]*0.01;
}
if(xsbj==3)
{
l=b[3]*1+b[2]*0.1+b[1]*0.01+b[0]*0.001;
}
xsbj=0;
}
xa=xs;
xs=0;
}
else
l=b[3]*1000+b[2]*100+b[1]*10+b[0];
}
}
void yunsuan()
{
if(bj==0&&a<0)
{
m=l;
bj++;
fuhao=a;
a=11;
}
else
{
if(a!=-5&&a<0&&a!=-4)
{
switch(fuhao)
{
case -1:
m=m+l;
fuhao=a;
a=11;
break;
case -2:
m=m-l;
fuhao=a;
a=11;
break;
case -3:
m=m*l;
fuhao=a;
a=11;
break;
case -6:
m=m/l;
fuhao=a;
a=11;
break;
}
}
if(a==-5)
{
switch(fuhao)
{
case -1:
m=m+l;
fuhao=-1;
a=11;
break;
case -2:
m=m-l;
fuhao=-2;
a=11;
break;
case -3:
m=m*l;
fuhao=-3;
a=11;
break;
case -6:
m=m/l;
fuhao=-6;
a=11;
break;
}
if(m<0)
{
if(xs==-4)
{
t=-m*100;
}
else
{
t=-m;
if(t<10)
{
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=0x40;
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t<100&&t>=10)
{
DisplayData[3]=0x00;
DisplayData[2]=0x40;
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t<1000&&t>=100)
{
DisplayData[3]=0x40;
DisplayData[2]=smgduan[((t%1000)/100)];
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
}
}
else
{
if(xa==-4)
{
t=m*100;
xa=0;
}
else
{
t=m;
}
if(t<10)
{
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=0x00;
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t>=10&&t<100)
{
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t>=100&&t<1000)
{
DisplayData[3]=0x00;
DisplayData[2]=smgduan[((t%1000)/100)];
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t>=1000&t<10000)
{
DisplayData[3]=smgduan[(t/1000)];
DisplayData[2]=smgduan[((t%1000)/100)];
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
}
}
}
}
void main()
{ char i,t=0;
for(i=0;i<4;i++)
{
DisplayData[0]=0x3f;
b[i]=0;
}
while(1)
{
KeyDown();
shuruzhi();
yunsuan();
DigDisplay();
}
}
如需借用请标明出处!