📄 jisuanqi.c
字号:
#include <reg51.h>
#define uint long
#define uchar long
uchar zixing[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uint op=0;//用来存储+、-、*、/操作符
uint preop=20;
uint first=0;//第一次键入的数值
uint second=0;//第二次键入的数值
uint result=0;//最终运算结果
uchar key=16;
uchar biaoji=0;
uchar kbscan(void); //声明键盘扫描程序
void display(uint temp); //声明显示程序
void yunsuan(void); //声明运算程序
void dlms(void); //声明延时程序
////////主程序////////////
void main(void)
{
uchar i,j=0;
P0=0x00; //LED灯全灭
P1=0X00;
P2=0X00;
// P3=0xf0;
while(1)
{ key=kbscan();
dlms();
if(key>=10&&key<=13) //如果KEY在10到13之间,证明键盘按下的是操作符键
{
op=key;
yunsuan();
key=16;
}
if(key>=0&&key<=9) //如果KEY在0到9之间,证明键盘按下的是数值
{
if(op==0)
{
if(second<100000)
{
second=second*10+key;
}
display(second);
key=16;
}
dlms();
}
if(key==14) //如果KEY位14时,证明键盘按下的是C/ON键
{
display(0);
P2=0x20;
P1=0x3f;
first=0; //清0,回复初始状态
second=0;
op=0;
result=0;
preop=20;
key=16;
}
if(key==15) //如果KEY位为15时,证明键盘按下的是=键
{
op=key;
yunsuan();
// display(result);//显示结果
dlms();
// first=0; //清0,回复初始状态
second=0;
op=0;
preop=55;
key=16;
}
for(i=0;i<2000;i++){};
}
}
//////////四则运算////////
void yunsuan(void)
{
if(op!=0)//&&second!=0
switch(preop)
{
case 10:
result=first+second;
first=result;
display(result);
preop=op;
op=0;
second=0;
break;
case 11:
result=first-second;
first=result;
display(result);
preop=op;
op=0;
second=0;
break;
case 12:
result=first*second;
first=result;
display(result);
preop=op;
op=0;
second=0;
break;
case 13:
result=first/second;
first=result;
display(result);
preop=op;
op=0;
second=0;
break;
case 20:
preop=op;
first=second;
second=0;
op=0;
break;
default:
preop=op;
second=0;
op=0;
break;
}
}
/////////延时程序/////////
void dlms(void)
{
uchar i;
for(i=0;i<250;i++){}
}
///////键盘扫描程序////////
uchar kbscan(void)
{
uchar sccode,recode,a,n;
P3=0xf0;
if((P3&0xf0)!=0xf0)
{
dlms();
if((P3&0xf0)!=0xf0)
{
sccode=0xfe;
while((sccode&0x10)!=0)
{
P3=sccode;
if((P3&0xf0)!=0xf0)
{
recode=P3&0xf0;
sccode=sccode&0x0f;
a=sccode+recode;
if(a==0xde)n=0; //键码对应的数值
if(a==0xed)n=1;
if(a==0xdd)n=2;
if(a==0xbd)n=3;
if(a==0xeb)n=4;
if(a==0xdb)n=5;
if(a==0xbb)n=6;
if(a==0xe7)n=7;
if(a==0xd7)n=8;
if(a==0xb7)n=9;
if(a==0x7e)n=10; //键码对应的操作符
if(a==0x7d)n=11;
if(a==0x7b)n=12;
if(a==0x77)n=13;
if(a==0xee)n=14;
if(a==0xbe)n=15;
return(n);
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return(16);
}
///////显示程序////////
void display(uint temp)
{
uint buf1,buf2,r,k,i;
k=temp;
r=0x20;
P2=0x20;
buf1=k/100000;
if(buf1>=10||k<-99999) //最高位大于10,显示错误
{
P2=0x01;
r=0x01;
P1=0x79;
r=(r<<1);
P2=r;
P1=0X3f;
r=(r<<1);
P2=r;
P1=0X3f;
r=(r<<1);
P2=r;
P1=0X3f;
r=(r<<1);
P2=r;
P1=0x06;
}
else if(k<0&&k>=-99999)
{
P1=0x00;
P2=0xff;
P2=0x01;
P1=0x40;
P2=0x20;
k=-k;
while(k>0)
{
buf2=k%10;
P1=zixing[buf2];
for(i=0;i<200;i++){};
k=k/10;
r=(r>>1);
P2=r;
P1=0x00;
}
}
else
{
P1=0x00;
P2=0xff;
P2=0x20;
while(k>0) //由个位开始显示数值
{
buf2=k%10;
P1=zixing[buf2];
for(i=0;i<200;i++){};
k=k/10;
r=(r>>1);
P2=r;
P1=0x00;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -