筒子们,上周参考了好多单片机计算器的文章,但是全文阅读基本都是付费,看了好几篇;参考了某个思路,外加周末让我老公帮忙调式,终于完成了一个简易版的计算器;
1.8位数码管显示
2.简单的四则运算(加减乘除)
3.PS,以下代码目前还不具备累计功能,后续待完善;
数据移位那里是否可以利用指针,简化代码,还有待完善,有知道的大神们,也可以留言分享哦~
8位数码管简易计算器代码如下
#include
#include "math.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
long m,l;
long t;
char a, j;
u8 b[8];
char n=0, fuhao;
char bj=0, xs, xsbj, xsb=0, x,xa;
char Equal_Set = 0;
u8 KeyValue;
u8 DisplayData[8];
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)*/
if(a<0&&a!=-5)
{
n=0;
}
if(a == -4)
{
n = 0;
m = 0;
l = 0;
}
}
}
}
//以上这个函数判断哪个键按下,并将计算器的0~9,四则运算符号等赋值定义到4*4矩阵键盘;
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第0位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第1位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第2位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第3位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第4位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第5位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第6位
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第7位
}
P0=DisplayData[i];
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
//以上函数利用138译码器进行位选
void shuruzhi()
{
static int i = 0;
if(n==0)
{
b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;b[6]=0;b[7]=0;
b[0]=0;
}
switch(n)
{
case 0:
DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;
DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;
DisplayData[6]=0x00;DisplayData[7]=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;DisplayData[4]=0x00;DisplayData[5]=0x00;
DisplayData[6]=0x00;DisplayData[7]=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[4]=0x00;
DisplayData[5]=0x00;DisplayData[6]=0x00;
DisplayData[7]=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[3]=0x00;DisplayData[4]=0x00;
DisplayData[5]=0x00;DisplayData[6]=0x00;
DisplayData[7]=0x00;DisplayData[0]=smgduan[a];
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[4]=0x00;
DisplayData[5]=0x00;DisplayData[6]=0x00;
DisplayData[7]=0x00;DisplayData[0]=smgduan[a];
i++;
x=4;
}
break;
case 5:
if(i==4)
{
b[4]=b[3];b[3]=b[2];
b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];
DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];
DisplayData[5]=0x00;DisplayData[6]=0x00;
DisplayData[7]=0x00;DisplayData[0]=smgduan[a];
i++;
x=5;
}
break;
case 6:
if(i==5)
{
b[5]=b[4];b[4]=b[3];b[3]=b[2];
b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[5]=DisplayData[4];
DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];
DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];
DisplayData[6]=0x00;
DisplayData[7]=0x00;DisplayData[0]=smgduan[a];
i++;
x=6;
}
break;
case 7:
if(i==6)
{
b[6]=b[5]; b[5]=b[4];b[4]=b[3];b[3]=b[2];
b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[6]=DisplayData[5];DisplayData[5]=DisplayData[4];
DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];
DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];
DisplayData[7]=0x00;DisplayData[0]=smgduan[a];
i++;
x=7;
}
break;
case 8:
if(i==7)
{
b[7]=b[6];b[6]=b[5]; b[5]=b[4];b[4]=b[3];
b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[7]=DisplayData[6];DisplayData[6]=DisplayData[5];
DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];
DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];
DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];
i++;
i = 0;
x=8;
}
break;
}
if(n > 0)
{
l=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
}
}
void yunsuan()
{
if((bj == 0)&&(a<0)&&(a!= -4))
{
m=l;
bj++;
fuhao=a;
a=66;
}
else
{
if(a!=-5&&a<0&&a!=-4)
{
switch(fuhao)
{
case -1:
m=m+l;
fuhao=a;
a=66;
break;
case -2:
m=m-l;
fuhao=a;
a=66;
break;
case -3:
m=m*l;
fuhao=a;
a=66;
break;
case -6:
m=m/l;
fuhao=a;
a=66;
break;
}
}
if(a==-5)
{
switch(fuhao)
{
case -1:
m=m+l;
fuhao=-1;
a=66;
break;
case -2:
m=m-l;
fuhao=-2;
a=66;
break;
case -3:
m=m*l;
fuhao=-3;
a=66;
break;
case -6:
m=m/l;
fuhao=-6;
a=66;
break;
}
bj = 0;
l = 0;
t=m;
}
if(t<10)
{
DisplayData[7]=0x00;
DisplayData[6]=0x00;
DisplayData[5]=0x00;
DisplayData[4]=0x00;
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=0x00;
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=10&&t<100)
{
DisplayData[7]=0x00;
DisplayData[6]=0x00;
DisplayData[5]=0x00;
DisplayData[4]=0x00;
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=100&&t<1000)
{
DisplayData[7]=0x00;
DisplayData[6]=0x00;
DisplayData[5]=0x00;
DisplayData[4]=0x00;
DisplayData[3]=0x00;
DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=1000&t<10000)
{
DisplayData[7]=0x00;
DisplayData[6]=0x00;
DisplayData[5]=0x00;
DisplayData[4]=0x00;
DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];
DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=10000&t<100000)
{
DisplayData[7]=0x00;
DisplayData[6]=0x00;
DisplayData[5]=0x00;
DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];
DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];
DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=100000&t<1000000)
{
DisplayData[7]=0x00;
DisplayData[6]=0x00;
DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];
DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];
DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];
DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=1000000&t<10000000)
{
DisplayData[7]=0x00;
DisplayData[6]=smgduan[(t%10000000)/1000000];
DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];
DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];
DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];
DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
if(t>=10000000&t<100000000)
{
DisplayData[7]=smgduan[t/10000000];
DisplayData[6]=smgduan[(t%10000000)/1000000];
DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];
DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];
DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];
DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];
DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];
DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];
}
}
}
}
}
void main()
{ char i,t=0;
for(i=0;i<8;i++)
{
DisplayData[i]=~0x3f; //此次实验的数码管是共阳数码管;
b[i]=0;
}
while(1)
{
KeyDown();
shuruzhi();
yunsuan();
DigDisplay();
}
}