⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compute.c

📁 电子密码锁 4位显示 课程设计 完整版
💻 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 + -