📄 compute.c
字号:
#include<reg51.h>
#include<absacc.h>
#include<math.h>
static jjj=0;
code char ledmap[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x79}; //八段数码管的a,b,c,d,e,f,g,h所对应的数值显示 ledmap[i]=i-1
char keydata,rr,k,flag2,fuhao,ge,shi,bai,qian;
long count,number;
void key_scan(void); //键盘扫描函数
char key_tab( char k);
void key_in( char k); //输入键值
void calculate();
void move(); //移位操作
/**********初始化操作************/
void initiate()
{
//AB口为基本输入输出,C口输入
count=0; number=0; //count为计算结果值,number为操作数
ge=0; shi=0; bai=0; qian=0; flag2=0; //四位数初始化显示,flag2为状态变量(0表示显示结果,1表示计算过程状态,2表示...)
fuhao='0'; keydata='n';
}
/*显示操作函数,注意我们使用的时共阴极数码管*/
void disp()
{
int i;
P0=0x00;P2=0xfe;
switch (jjj)
{
case 1: P2=0xfe; P0=ledmap[10]; break;
case 2: {P2=0xfe;P0=ledmap[11];} break;
case 0: if(qian==0)P0=0x00;else {i=qian;P0=ledmap[i]; } break;
default :break;
}
if(jjj==2) P0=0x00;
else{
i=ge;
P0=0x00;
P2=0xf7; //0xf7=11110111
P0=ledmap[i]; //个位数码管点亮并显示个位数值
}
if(jjj==2) P0=0x00;
else{
if(shi==0&bai==0&qian==0) P0=0x00;
else{
P0=0x00;
P2=0xff;
i=shi;
P2=0xfb; //0xfb=11111011第二个数码管点亮
P0=ledmap[i]; //显示十位数值
}
}
if(jjj==2) P0=0x00;
else{
if(bai==0&qian==0) P0=0x00;
else{
P0=0x00;
P2=0xff;
i=bai;
P2=0xfd; //0xfd=11111101
P0=ledmap[i]; //百位
}
}
}
/*运算处理函数*/
void calculate()
{ int jj,g;
if(keydata=='c') //键入值为清零时(复位)
{ge=shi=bai=qian=0;flag2=0;jjj=0;}
else if(keydata=='/'|| keydata=='-'||keydata=='x'||keydata=='+')
{ if(jjj==1)count=~count+1;
else
count=qian*1000+bai*100+shi*10+ge; flag2=1; //在得到操作符之前把当前显示的各位上数字转换成整数存储到count变量中
fuhao=keydata;
shi=ge=qian=bai=0; //得到操作符之后显示清零
jjj=0;
}
else if(keydata=='=') //四则运算过程
{
if(flag2==1) //如果 (flag2!=1) 说明当前得到被操作数但是无操作数输入
{
number=qian*1000+bai*100+shi*10+ge; //只取操作数后两位
flag2=0;
switch (fuhao) //对应运算符号的运算
{
case '/':count=count/number;break;
case 'x':count=count*number;if(count>9999)jjj=2;break; //不能使用'*'
case '+':count=count+number;break;
case '-':{if(count<number){jj=count;count=number;number=jj;jjj=1;if((count-number)>999)jjj=2;}}count=count-number; break;
default :break;
}
keydata='n';
ge=count%10;shi=(count%100)/10;
qian=count/1000;bai=(count%1000)/100; //count数值分四位显示
flag2=2;
}
}
else
{
if(flag2==2)
{qian=bai=shi=0;ge=keydata;flag2=0;}
else
{qian=bai;bai=shi;shi=ge;ge=keydata;} //移位
keydata='n';
}
}
/********矩键查寻键值4*4程序******/
void key_scan(void)
{
char sccode,recode,i;
P1=0xf0;
if((P1&0xf0)!=0xf0) // 提取判断P1口低四位
{
if((P1&0xf0)!=0xf0)
{
sccode=0xfe;
for(i=0;i<4;i++)
{
P1=sccode;
if((P1&0xf0) !=0xf0)
{
recode=(P1&0xf0)|0x0f; //得到键值
k=(~recode)+(~sccode); //取反修正
rr=P1;
key_in(k);
break;
}
else
sccode=(sccode<<1)|0x01;
}
}
}
else
keydata='n';
}
void key_in( char k)
{
char ta;
do{ ta=P1;} while(ta==rr);
keydata=key_tab(k);
}
char key_tab( char k)
{ char kb;
switch(k){
case 0x11:kb=0x07;break; //0x11=000 1 000 1 ,在键盘上为数字7的坐标
case 0x21:kb=0x08;break;
case 0x41:kb=0x09;break;
case 0x81:kb='/';break;
case 0x12:kb=0x04;break;
case 0x22:kb=0x05;break;
case 0x42:kb=0x06;break;
case 0x82:kb='x';break;
case 0x14:kb=0x01;break;
case 0x24:kb=0x02;break;
case 0x44:kb=0x03;break;
case 0x84:kb='-';break;
case 0x18:kb='c';break;
case 0x28:kb=0x00;break;
case 0x48:kb='=';break;
case 0x88:kb='+';break;
default:kb='n';break;
}
return kb;
}
main(){
initiate();
while(1){
disp();
key_scan( );
if( keydata != 'n')
calculate();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -