51单片机矩阵键盘实现基本计算器功能(包括负数)

功能实现

加(12)减(13)乘(14)除(15)  等于(11),清0(K3),退位(K4),在第一次运算结果上继续运算,负数输入(10),负数运算,最大显示9999999

        难点以及重点,注意延迟消抖,判断按键状态,用一个数保留前一次的结果,通过数组移位实现输入,退位,然后注意变量long /unsigned long/ 这些的取值范围这些

思路大致如下

分为3个模块

目录

1 检测输入

2 显示函数

3 计算函数


1 检测输入

void keyscan()
{
	{
	u8 temp;
	P1 = 0x0f;
	delayms(10);
	temp = P1^0x0f;
	switch(temp)
	{
		case 1:kn = 0;break;
		case 2:kn = 1;break;
		case 4:kn = 2;break;
		case 8:kn = 3;break;
	}
	P1 = 0xf0;
	temp = P1>>4^0x0f;
	switch(temp)
	{
		case 1:kn += 0;break;
		case 2:kn += 4;break;
		case 4:kn += 8;break;
		case 8:kn += 12;break;
	}

	delayms(4000);
 if(kn==0||kn==1||kn==2||kn==3||kn==4||kn==5||kn==6||kn==7||kn==8||kn==9)
   {
      flag=1;
   }
	else if(kn==10)
	{
		Num[7]=16;
		}
	}
	
}

2 显示函数

void show()
{
    int i=0;
		for(; i<8;i++)
	{

    P2=i*4;
		P0=seg[Num[i]];
		delayms(10);
	}
}

3 计算函数


void clac()
{

int i;
long a,b,c; 
       if(flag==1)           
            for(i=6;i>0;i--)              
            {Num[i]=Num[i-1];}             
            Num[0]=kn;                            
            flag=0;                                  
         }
		  else if(key2==0)    
         {
					 delayms(20);
					 if(key2==0)
					 {
               for(i=0;i<8;i++)
                    Num[i]=0;              
						 while(!key2);
						  show(); 
						}
             
        }
	  	 else if(key3==0)   
	  	{
					delayms(20);
					if(key3==0)
					{
						for(i=1;i<7;i++)
						 {
							Num[i-1]=Num[i];
							}
							while(!key3);
							show();
						}


			}
				
		else if(kn==12)
         {   if (Num[7]==16)  
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
						else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
            
             for(i=0;i<8;i++)
             Num[i]=0;
             while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  
                     if(kn==11) break;  
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
							            while(!key3);
											  	show();
					         	    }
			                     }
              }
            if (Num[7]==16) 
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             c=a+b;
						if(c<0)
						{
							c=-c;
							Num[7]=16;
							}
             Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
        }

				
			else if(kn==13)
         {
             if (Num[7]==16)  
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
						else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             for(i=0;i<8;i++)
             Num[i]=0;
              while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  
                     if(kn==11) break;  //µÈºÅ
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
						            	show();
							            while(!key3);
					         	    }
			                     }
              }
              if (Num[7]==16)  
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             
             c=a-b;
							if(c<0)
						{
							 c=-c;
							 Num[7]=16;
							}
						 Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
						

            
        }
			else if(kn==14)
         {
            if (Num[7]==16)  
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
						else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
            
             for(i=0;i<8;i++)
             Num[i]=0;
             while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan(); 
                     if(kn==11) break; 
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
						            	show();
							            while(!key3);
					         	    }
			                     }
              }
              if (Num[7]==16)  
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             c=a*b;
						if(c<0)
						{
							c=-c;
							Num[7]=16;
							}
             Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
        }
				else if(kn==15)
         {
          if (Num[7]==16)  
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
					else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
     
             for(i=0;i<8;i++)
             Num[i]=0;
             while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  
                     if(kn==11) break; 
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
						            	show();
							            while(!key3);
					         	    }
			                     }
              }
              if (Num[7]==16)  
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000; 
              c=a/b;
						if(c<0)
						{
							c=-c;
							Num[7]=16;
							}
             Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
	}
}

Keil

里面的注释粘过来乱码了,自己理解一下吧,挺简单的。

主函数如下

void main()
{
	while(1)
	{ 
		show();
		P1 = 0xf0;
		if(P1 != 0xf0)    
		   keyscan();  
		clac();
		
	}
}

难点以及重点,注意延迟消抖,判断按键状态,用一个数保留前一次的结果,通过数组移位实现输入,然后注意变量long /unsigned long/ 这些的取值范围这些

 完整代码如下

#include <reg52.h>
#include<math.h>
typedef unsigned char u8;//0-255
typedef unsigned int u16;//0-65535
typedef unsigned char uchar;//0-255
typedef unsigned int uint;//0-65535
typedef unsigned long u32;//0-4294967295
                          //long -2147483648~+2147483647
/*  bit £¨ÀàËÆbool£©/sbit  È¡Öµ0»ò1		*/

sbit key0 = P3^1;
sbit key1 = P3^0;
sbit key2 = P3^2;
sbit key3 = P3^3;

sbit led0 = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit led3 = P2^3;


u8 code seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
									0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,0x40};//: 0x40  -
int Num [8]={0};   //±£´æ½á¹û
int kn = 0;
int flag;//Åжϰ´(0~9)

void delayms(u16 n)//ms
{
	while(n--)
	{
		u8 c = 10;
		while(c--);
	}
}

void keyscan()
{
	{
	u8 temp;
	P1 = 0x0f;
	delayms(10);
	temp = P1^0x0f;
	switch(temp)
	{
		case 1:kn = 0;break;
		case 2:kn = 1;break;
		case 4:kn = 2;break;
		case 8:kn = 3;break;
	}
	P1 = 0xf0;
	temp = P1>>4^0x0f;
	switch(temp)
	{
		case 1:kn += 0;break;
		case 2:kn += 4;break;
		case 4:kn += 8;break;
		case 8:kn += 12;break;
	}

	delayms(4000);
 if(kn==0||kn==1||kn==2||kn==3||kn==4||kn==5||kn==6||kn==7||kn==8||kn==9)
   {
      flag=1;
   }
	else if(kn==10)
	{
		Num[7]=16;
		}
	}
	
}

void show()
{
    int i=0;
		for(; i<8;i++)
	{

    P2=i*4;
		P0=seg[Num[i]];
		delayms(10);
	}
}
	 		

void clac()
{

int i;
long a,b,c; //¼Ç¼ÔËËã±äÁ¿
       if(flag==1)  //(¼Ç¼°´¼ü)
         {                                 
            for(i=6;i>0;i--)              
            {Num[i]=Num[i-1];}             
            Num[0]=kn;                            
            flag=0;                                  
         }
		  else if(key2==0)     //Çå0
         {
					 delayms(20);
					 if(key2==0)
					 {
               for(i=0;i<8;i++)
                    Num[i]=0;              
						 while(!key2);
						  show(); 
						}
             
        }
	  	 else if(key3==0)   //ÍËλ
	  	{
					delayms(20);
					if(key3==0)
					{
						for(i=1;i<7;i++)
						 {
							Num[i-1]=Num[i];
							}
							while(!key3);
							show();
						}


			}
				
		else if(kn==12)// ¼Ó·¨ÔËËã
         {   if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
						else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
            
             for(i=0;i<8;i++)
             Num[i]=0;
             while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  //¼Ç¼°´¼ü
                     if(kn==11) break;  //µÈºÅ
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   //ÍËλ
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
							            while(!key3);
											  	show();
					         	    }
			                     }
              }
            if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             c=a+b;
						if(c<0)
						{
							c=-c;
							Num[7]=16;
							}
             Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
        }

				
			else if(kn==13)// ¼õ·¨ÔËËã
         {
             if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
						else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             for(i=0;i<8;i++)
             Num[i]=0;
              while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  //¼Ç¼°´¼ü
                     if(kn==11) break;  //µÈºÅ
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   //ÍËλ
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
						            	show();
							            while(!key3);
					         	    }
			                     }
              }
              if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             
             c=a-b;
							if(c<0)
						{
							 c=-c;
							 Num[7]=16;
							}
						 Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
						

            
        }
			else if(kn==14)// ³Ë
         {
            if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
						else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
            
             for(i=0;i<8;i++)
             Num[i]=0;
             while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  //¼Ç¼°´¼ü
                     if(kn==11) break;  //µÈºÅ
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   //ÍËλ
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
						            	show();
							            while(!key3);
					         	    }
			                     }
              }
              if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
             c=a*b;
						if(c<0)
						{
							c=-c;
							Num[7]=16;
							}
             Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
        }
				else if(kn==15)// ³ý·¨ÔËËã
         {
          if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					 {	
						  a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							a=-a;
						}
					else
							a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
     
             for(i=0;i<8;i++)
             Num[i]=0;
             while(1)                                
             {
                      show();
									  	P1 = 0xf0;
										 if(P1 != 0xf0)    
									  	keyscan();  //¼Ç¼°´¼ü
                     if(kn==11) break;  //µÈºÅ
                     if(flag==1)
                     {  
                        for(i=6;i>0;i--)
                        {Num[i]=Num[i-1];}
                        Num[0]=kn;
                        flag=0;
                     }
										 else if(key3==0)   //ÍËλ
		                      {
					                delayms(20);
				                  if(key3==0)
					              {
					     	           for(i=1;i<7;i++)
						            {
							               Num[i-1]=Num[i];
							          }
						            	show();
							            while(!key3);
					         	    }
			                     }
              }
              if (Num[7]==16)  //˵Ã÷ÊǸºÊý
					  {	
						  b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;
							b=-b;
						}
						else
							b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000; 
              c=a/b;
						if(c<0)
						{
							c=-c;
							Num[7]=16;
							}
             Num[0]=c%10;                    
             Num[1]=c/10%10;
             Num[2]=c/100%10;
             Num[3]=c/1000%10;
             Num[4]=c/10000%10;
             Num[5]=c/100000%10;
             Num[6]=c/1000000%10;
             show();
	}
}
	

void main()
{
	while(1)
	{ 
		show();
		P1 = 0xf0;
		if(P1 != 0xf0)    
		   keyscan();  //¼Ç¼°´¼ü
		clac();
		
	}
}

 有些乱码但不重要,觉得有用麻烦点个赞👍!!

 有问题下方评论,互相讨论!

  • 13
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值