基于51单片机的简易计算器多位数码管显示proteus仿真设计
1.设计功能
-
本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)。
-
设计一个简易计算器,能够进行最多八位数的加、减、乘、除连续运算。
-
采用4*4的矩形按键,通过八位数码管显示输入数字和结果。
2.proteus仿真图
3.程序代码
- 数码管显示函数,参数为要显示的数
void tube(long n)
{
long i,k,m = 10000,a[8] = {~0};
P2 = 0xf0;
while(m--)
{
k =1;
for(i = 0;i<8;i++)
{
if(i != 0)
{
if(n/k == 0)
break;
}
a[i] = n/k%10;
k *= 10;
P3 = (1<<i);
P1 = (~0);
switch(a[i]){
case 0:P1 = ~0x3f;break;
case 1:P1 = ~0x06;break;
case 2:P1 = ~0x5b;break;
case 3:P1 = ~0x4f;break;
case 4:P1 = ~0x66;break;
case 5:P1 = ~0x6d;break;
case 6:P1 = ~0x7d;break;
case 7:P1 = ~0x07;break;
case 8:P1 = ~0x7f;break;
case 9:P1 = ~0x6f;break;
}
}
if(P2>>4 != 15)
{
break;
}
}
P3 = 0;
}
- 键盘矩阵函数,返回值为按下的按键对应的键值
int matrix()
{
int arr[4][4] = {
{7,8,9,14},
{4,5,6,13},
{1,2,3,12},
{16,0,15,11}
};
int row,col,i;
int n = (~0);
while(1)
{
for(i = 0;;i++)
{
P2 = 0xff - (1<<i);
if(P2>>4 != 15)
{
row = i;
for(i = 0;i<4;i++)
{
if((1<<i & P2>>4) == 0)
{
col = i;
n = arr[row][col];
break;
}
}
break;
}
if(i == 3)
i = -1;
}
while(P2>>4 != 0x0f);
return n;
}
}
- 返回值为参加运算的值并将运算符存入*x
long innumber(int *x)
{
int i,k = 1,temp[9];
long m = 0;
for(i = 0;i<9;i++)
{
temp[i] = matrix();
if(temp[i] == 16)
{
tube(0);
n = 0;
return 0;
}
if(temp[i] >=11 && temp[i] <= 14)
{
if(*x == 0)
tube(n);
else
tube(m);
*x = temp[i]; //保存运算符
return m;
}
if(temp[i] == 15)
{
*x = 0;
return m;
}
m = m*k+temp[i];
k = 10;
tube(m);
}
return m;
}
4.返回运算结果
long sum(long m,long n,int symble)
{
switch(symble){
case 11:n += m;break;
case 12:n -= m;break;
case 13:n *= m;break;
case 14:n /= m;break;
default :break;
}
return n;
}
- 主函数,注意n为全局变量
#include <reg51.h> //此文件中定义了51的一些特殊功能寄存器
int matrix();
void tube(long n);
long innumber(int *x);
long sum(long m,long n,int symble);
long n;
void main()
{
long m = 0;
int a,symble = 1,*x = &symble;
n = 0;
while(1)
{
m = innumber(x);
if(n != 0 )
{
n = sum(m,n,a);
tube(n);
}
else
{
n = m;
}
if(symble == 0)
{
innumber(x);
a = symble;
}
else
a = symble;
}
}