📄 calculator.c
字号:
#include<AT89X52.h>//仅完成个位的四则运算,并可以处理负数结果
signed char code a[]={0x3f,0x06,0x5b,0x4f,0x66 ,0x6d ,0x7d ,0x07 ,0x7f ,0x6f,0x00,0x40};
unsigned char code tv[]={0xfe,0xfd,0xfb,0xf7};
signed int data led[4];
signed int data tvdata=0;
signed int n=0;//输入状态变量
signed int s=0;//存输入值
signed int t=0;//计算状态参量
signed int x=0;//存第一个数
signed int y=0;//存第二个数
signed int z=0;//输出结果
void delay(void)
{
unsigned int i;
for(i=0;i<100;i++);
}
kp_scan()//获取键盘值
{
unsigned char i,j;
P1=0xff;
P1=0x0f;
i=P1;
P1=0xff;
P1=0xf0;
j=P1;
return(i+j);
}
led_show()
{
signed int i,k,m;
if(tvdata>=0&&tvdata<999)//正数显示
{
led[0]=10;//正数时符号位为空
led[1]=tvdata/100;//取百位
led[2]=tvdata%100/10;//取十位
led[3]=tvdata%10;//取个位
for(k=0;k<4;k++)
{
i=led[k];
P0=a[i];
i=led[k];
P2=tv[k];
delay();
}
}
if(tvdata<0&&tvdata>-999)//负数显示
{
m=tvdata;
m=-m;
led[0]=11;//显示负号
led[1]=m/100;//取百位
led[2]=m%100/10;//取十位
led[3]=m%10;//取个位
for(k=0;k<4;k++)
{
i=led[k];
P0=a[i];
i=led[k];
P2=tv[k];
delay();
}
}
}
result(t,y,x)
{
signed int z;
if(t==1)//加法
{
z=x+y;
}
if(t==2)//减法
{
z=x-y;
}
if(t==3)//乘法
{
z=x*y;
}
if(t==4&&y!=0)//除法
{
z=x/y;
}
else if(t==4&&y==0)//除0错误
{
z=999;//超出显示数值范围
}
else
{
;
}
return(z);
}
main()
{
while(1)
{
tvdata=kp_scan();
if(tvdata!=0xff)//保持显示数值
{
s=tvdata;
}
switch(tvdata)
{
case 0xd7:{tvdata=0;s=0;y=s;}break;
case 0xeb:{tvdata=1;s=1;y=s;}break;
case 0xdb:{tvdata=2;s=2;y=s;}break;
case 0xbb:{tvdata=3;s=3;y=s;}break;
case 0xed:{tvdata=4;s=4;y=s;}break;
case 0xdd:{tvdata=5;s=5;y=s;}break;
case 0xbd:{tvdata=6;s=6;y=s;}break;
case 0xee:{tvdata=7;s=7;y=s;}break;
case 0xde:{tvdata=8;s=8;y=s;}break;
case 0xbe:{tvdata=9;s=9;y=s;}break;
case 0xe7:{tvdata=0;s=0;y=0;z=0;}break;//ON/C键
case 0x77:{s=0;x=y;t=1;}break;//加法键
case 0x7b:{s=0;x=y;t=2;}break;//减法键
case 0x7d:{s=0;x=y;t=3;}break;//乘法键
case 0x7e:{s=0;x=y;t=4;}break;//除法键
case 0xb7:{s=result(t,y,x);}break;//等于键
default: ;
}
tvdata=s;
led_show();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -