📄 caculater.c
字号:
#include "reg51.h"
sbit LED=P3^4;
sbit R1=P1^4;
sbit R2=P1^5;
sbit R3=P1^6;
sbit R4=P1^7;
unsigned char key;
unsigned char keydata;
unsigned char numberstats;
unsigned char operationstats;
unsigned int number,number1,number2;
unsigned char seg[11]={0x09,0x0EB,0x98,0x8A,0x6A,0x0E,0x0C,0x0CB,0x08,0x0A,0xff};//笔形码
unsigned char disp[4];//显示缓冲区
delay(int t)//延时子程序
{int i,j;
for(i=0;i<t;i++)
for (j=0;j<5;j++);
}
ledflsh(int time)//LED闪动的快慢
{int i;
for(i=0;i<3;i++)
{LED=0;
delay(time);
LED=1;
}
}
display(unsigned char c)//往串口写字符
{ SCON=0x00;//工作方式0
SBUF=c;//往缓冲区写字符
while(TI==0)
{};//等待TI=1
TI=0;//清除/TI=0
}
showtest(int time)//数码管自检
{unsigned char i,j;
for(i=0;i<11;i++)//从0到9
{delay(time);
for(j=0;j<4;j++)//四个都显示,写四下
display(seg[i]);
}
}
void dispshow(unsigned int cdisp) //将要显示的字符分解送到缓冲区
{ disp[0]=seg[cdisp%10];
disp[1]=seg[cdisp/10%10];
disp[2]=seg[cdisp/100%10];
disp[3]=seg[cdisp/1000];
if(disp[3]==0x09) disp[3]=0xff;//先判断千位,灭0处理
if(disp[2]==0x09) disp[2]=0xff;//判断百位,灭0处理
if(disp[1]==0x09) disp[1]=0xff;//判断十位,灭0处理
display(disp[0]);
display(disp[1]);
display(disp[2]);
display(disp[3]);
}
getkey()
{
unsigned char keytemp;
R1=0;R2=1;R3=1;R4=1;// 高4位扫描
keytemp=~(P1)&0x0f;//低位4读取
switch(keytemp)
{case 1:delay(100);{if(keytemp==1) keydata=1;return 1;} break;//1键
case 2:delay(100);{if(keytemp==2)keydata=2;return 1;}break;//2键
case 4:delay(100);{if(keytemp==4)keydata=3;return 1;}break;//3键
case 8:delay(100);{if(keytemp==8)keydata=4;return 1;}break;//4键
default: break;
}
R1=1;R2=0;R3=1;R4=1;// 高4位扫描
keytemp=~(P1)&0x0f;//低4位读取
switch(keytemp)
{case 1:delay(200);{if(keytemp==1)keydata=5;return 1;}break;//5键
case 2:delay(200);{if(keytemp==2)keydata=6;return 1;}break;//6键
case 4:delay(200);{if(keytemp==4)keydata=7;return 1;}break;//7键
case 8:delay(200);{if(keytemp==8)keydata=8;return 1;}break;//8键
default: break;
}
R1=1;R2=1;R3=0;R4=1;// 高4位扫描
keytemp=~(P1)&0x0f;//低4位读取
switch(keytemp)
{case 1:delay(200);{if(keytemp==1)keydata=9;return 1;}break;//9键做减法用
case 2:delay(200);{if(keytemp==2)keydata=10;return 1;}break;//10键做加法用
case 4:delay(200);{if(keytemp==4)keydata=11;return 1;}break;//A键
case 8:delay(200);{if(keytemp==8)keydata=12;return 1;}break;//B键
default: break;
}
R1=1;R2=1;R3=1;R4=0;// 高位扫描
keytemp=~(P1)&0x0f;//低4位读取
switch(keytemp)
{case 1:delay(100);{if(keytemp==1)keydata=13;return 1;}break;//C键清0用
case 2:delay(100);{if(keytemp==2)keydata=14;return 1;}break;//D键做等于用
case 4:delay(100);{if(keytemp==4)keydata=15;return 1;}break;//E键做除法用
case 8:delay(100);{if(keytemp==8)keydata=16;return 1;}break;//F键做乘法用
default: break;
}
R4=1;
}
onnumberkey()
{ unsigned int n=0;
switch(keydata)
{case 1:n=1;break;
case 2:n=2;break;
case 3:n=3;break;
case 4:n=4;break;
case 5:n=5;break;
case 6:n=6;break;
case 7:n=7;break;
case 8:n=8;break;
case 9:n=9;break;
case 10:n=0;break;
}
if(numberstats==1)//操作数1
{
number=number*10+n;
number1=number;
dispshow(number);
}
else//操作数2
{number=number*10+n;
number2=number;
dispshow(number);
}
}
cal()
{ switch(operationstats)
{case 1:number=number1+number2;numberstats=1;break;
case 2:number=number1-number2;numberstats=1;break;
case 3:number=number1*number2;numberstats=1;break;
case 4:number=number1/number2;numberstats=1;break;
}
dispshow(number);
}
onoperationkey()
{ switch(keydata)
{case 11:operationstats=1;number=0;numberstats=2;break;//加操作
case 12:operationstats=2;number=0;numberstats=2;break;//减操作;
case 13:operationstats=3;number=0;numberstats=2;break;//乘操作*
case 14:operationstats=4;number=0;numberstats=2;break;//除操作/
case 15:cal(); break;//等于键计算
case 16:number1=number=number2=0;dispshow(number);break;//清0
}
}
main()
{ operationstats=1;//初始化参数
number=0;
ledflsh(1000);//LED闪动的快慢,最后熄灭
showtest(2500);//数码管自检,最后熄灭
for(;;)
{ if(getkey()==1)
{
if((keydata==1)||(keydata==2)||(keydata==3)||(keydata==4)||(keydata==5)||(keydata==6)||(keydata==7)||(keydata==8)||(keydata==9)||(keydata==10))
{ delay(2600); onnumberkey();} //如果是数字键,实行数字函数
else {delay(2600); onoperationkey();}//如果是操作键,操作函数
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -