【单片机】51单片机计算器代码和电路图
一、问题描述
通过AT89C51单片机16位矩阵键盘设计简易计算器(仅能实现加减操作)
二、具体实现
1.完整代码带注释
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//显示数字0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
uchar code address[]={0xfe,0xfd};//位选1,2
//1111 1110数码管显示第一位
//1111 1101数码管显示第二位
uchar code KEY_TABLE[] =
{0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,
0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//(反转法)矩阵键盘的各个按键的计算值
void delay(int k)
{
for( ; k>0; k--);
}
void delay1()
{
uint n = 50000;while(n--);
}
void delay2()
{
uint n = 10000;while(n--);
}
main()
{
uchar temp,key,num,i;
int sum,sign,j,a[16],k=0;
while(1)
{
P3 = 0xf0;//1111 0000
if(P3 != 0xf0)
{
delay2();
if(P3 != 0xf0)
{
temp = P3;
P3 = 0x0f;//0000 1111
key = temp|P3;//低四位改变,若有键按下,得出低四位的值。xxxx 1111
for(i=0; i<16; i++)
if(key == KEY_TABLE[i])
{ num = i;//0,1,2,3,,15
delay(200);
//0-14显示
if(num>=0 && num<=14)
{
a[k++]=num;//a[0]=0
P2 = address[0];//位选为0xfe,显示第一位数字
P1 = table[num];//显示数字num
delay(2000);
}
else if(num==15)//按下15等号键进行判断
{
//判断输入的值是否合法
if(a[0]>=0 && a[0]<=9 && (a[2]>=0 && a[2]<=9) && (a[1]==10 || a[1]==11))//1+2(第一位数字a[0],第二个运算符a[1]+-,第三位数字a[2])
sign=1;//合法
else
sign=3;//不合法
for(j=0;j<3;j++)//A+B循环三次,两个数字和一个运算符
{
if(a[j]==12||a[j]==13||a[j]==14)//如果是12,13,14位,无效键
sign=0;
}
}
if(sign==1)//合法
{
if(a[1]==10)//按下加号键
sum=a[0]+a[2];//实现加法
else if(a[1]==11)//按下减号键
sum=a[0]-a[2];//实现减法
}
}
delay1();
}
}
//合法
if(sign == 1)
{
if(sum<10)//0-9
{
P2=address[0];//位选为0xfe,显示第一位数字
P1=table[sum];//显示数字table[sum]
}
else
{
for(i=0;i<100;i++)
{
P2=address[1];//位选为0xfd,显示第二位数字
P1=table[sum/10];
delay(1000);
P2=address[0];//位选为0xfe,显示第一位数字
P1=table[sum%10];
delay(1000);
}
}
}
//不合法键判断
if(sign == 3)
{
P2=address[0];//位选为0xfe,显示第一位数字
P1=table[15];//显示字符f
P2=address[1];//位选为0xfd,显示第二位数字
P1=table[15];//显示字符f
}
//无效键判断
if(sign == 0)
{
P2=address[0];//位选为0xfe,显示第一位数字
P1=table[0];//显示字符f
P2=address[1];//位选为0xfd,显示第二位数字
P1=table[0];//显示字符f
}
}
}
2.电路图
初始界面
实现加法操作
总结
全网最详细代码,直接拿去用,感谢大家对我的关注!