📄 calc.c
字号:
/*******************************************************
51单片机4*4键盘简单计算器程序
作者:QRNU->川草风絮
开发环境:keil
开发语言:c51
备注:程序简单,存在漏洞及不规范之处,仅为实验或新手学习使用
********************************************************/
/*******************************************************
硬件接线:附图
*******************************************************/
#include<reg51.h>
#include<absacc.h>
#define led1 XBYTE[0x7fff] //51外部16位存储器寻址地址,此处用来通过
#define led2 XBYTE[0xbfff] //锁存器向数码管输出段选和位选数据
#define led3 XBYTE[0xdfff]
#define led4 XBYTE[0xefff]
#define led5 XBYTE[0xf7ff]
#define led6 XBYTE[0xfbff]
#define led8 XBYTE[0xfeff]
unsigned char code tab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段选码表
long value1,value2,result;
bit s;
int keyt;
int key1;
/*****************************************************
函数名称:getkey()
作用:扫描键盘并获得键值,利用反选法扫描键盘
*****************************************************/
int getkey()
{int key=0;
P3=0xfe;
P1=0xff;
while(P1!=0xff) //行扫描有低电平信号出现
{
switch(P1) //则在P1口全输出高电平的情况下进行列扫描
{
case 0xfe:key=7;break; //得出键值
case 0xfd:key=8;break;
case 0xfb:key=9;break;
case 0xf7:key=14;break;
}
}
if(key)return(key);
P3=0xfd;
P1=0xff;
while(P1!=0xff)
{
switch(P1)
{
case 0xfe:key=4;break;
case 0xfd:key=5;break;
case 0xfb:key=6;break;
case 0xf7:key=13;break;
}
}
if(key)return(key);
P3=0xfb;
P1=0xff;
while(P1!=0xff)
{
switch(P1)
{
case 0xfe:key=1;break;
case 0xfd:key=2;break;
case 0xfb:key=3;break;
case 0xf7:key=12;break;
}
}
if(key)return(key);
P3=0xf7;
P1=0xff;
while(P1!=0xff)
{
switch(P1)
{
case 0xfe:key=16;break;
case 0xfd:key=10;break;
case 0xfb:key=15;break;
case 0xf7:key=11;break;
}
}
return(key);
}
/****************************************************************
函数名称:display()
功能:动态显示任意999999以内的十进制整数,同时监测键盘
****************************************************************/
void display(long value)
{ int neg=0,tempkey=0; //neg代表是否为负值
int k[6]={0};
if(value<0){value=-value;neg=1;}
k[5]=value/100000; //分解整数各位
k[4]=value%100000/10000;
k[3]=value%10000/1000;
k[2]=value%1000/100;
k[1]=value%100/10;
k[0]=value%10;
while(1) //分别显示各位
{
if(value>=100000)
led6=tab[k[5]];
if(value>=10000)
led5=tab[k[4]];
if(value>=1000)
led4=tab[k[3]];
if(value>=100)
led3=tab[k[2]];
if(value>=10)
led2=tab[k[1]];
led1=tab[k[0]];
if(neg==1)led8=tab[10];
tempkey=getkey();
if(tempkey!=0){key1=tempkey;break;} //有键按下,则退出循环向下执行
}
neg=0;
}
/***********************************************************
主函数:main()
功能:进行接收数据和命令,完成计算器计算流程
注:key=1~9分别表示按键数字1~8,key=10表示按键数字0,key=11~16
分别代表计算器功能键"+" "-" "*" "/" "=" "CE"(清零)
***********************************************************/
main()
{
key1=0;
//读入初值
reset1: s=0; //s代表是否有"上一次计算结果"
reset: value1=result=0;
read: if(key1<11&&key1>0) //非功能键,则从低到高依次读入整数的每一位
{
value1=value1*10+key1;
display(value1);
if(key1==16) goto reset1; //任何情况下有"="按下便得出结果,返回
goto read;
}
if(key1<16&&key1>10)
{
if(s==0)
{value2=value1;value1=0;keyt=key1;s=1;
display(value2);
if(key1==16)goto reset1;
goto read;} //把初值给被运算数
// else s=0;
}
if(keyt==11)result=value1+value2; //功能键 +
if(keyt==12)result=value2-value1; //"-"
if(keyt==13)result=value2*value1; //"*"
if(keyt==14)result=value2/value1; //"/"
// if(keyt==15)
display(result); //显示结果
if(key1==16)goto reset1;
value2=result; //把结果赋给"上次运算结果",以备继续运算
goto reset;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -