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

📄 keytest.c

📁 一个简易的计算器程序 有键盘扫描和计算功能
💻 C
字号:
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define KEYPORT P1
static unsigned long int counter;//用来记录输入的数据
static unsigned long int counter_save; 
unsigned char value[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
char code row[4]={0x70,0xb0,0xd0,0xe0};
char code line[4]={0x07,0x0b,0x0d,0x0e};
unsigned char code LED[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};
bit XFLAG=0;
char k;
uchar keyvalue;

//----------------------------------------------------------------------
senddata(uchar b)
{
	char i;
	i=b;
	
	SBUF=LED[i];
	while(TI==0);
	TI=0;

	
}
//----------------------------延时程序---------------------------
void delay(uint delaytime)
{
	char i;
	for(;delaytime>0;delaytime--)
 		for(i=0;i<121;i++)
		{;}
}
//-------------------------------------------------------------------

uchar keyscan(void)
 {  
    uchar xinvalue,yinvalue,i,j;
	uchar kvalue;
	KEYPORT=0x0f;
	while(KEYPORT==0x0f);

 	if(KEYPORT!=0x0f)
		{
		  delay(20);//延时消抖
			if(KEYPORT!=0x0f)
			 {
          		KEYPORT=0x0f;//输出行扫描码
          		xinvalue=KEYPORT;
		  		KEYPORT=0xf0;//输出列扫描码
		  		yinvalue=KEYPORT;
		  		for(i=0;i<4;i++)
				{		
				   		if((xinvalue&0x0f)==line[i])
				   		for(j=0;j<4;j++)
				   	{
				   			if((yinvalue&0xf0)==row[j])
							{
				   				kvalue=value[i][j];
				   				return(kvalue);//反回按键值
							}
							
				   	 }
				}
			  }
		 	}
 }
//------------------------keyprocess函数-----------------------
void keyprocess(uchar kvalue)
{	
	char cosave[8];
	char i;
	char a=0;
	a=0;
	//输出数据
	switch(kvalue)
	{
		case 0:
		senddata(0);
		counter=counter*10;
		break;
		case 1:
		senddata(1);
		counter=counter*10+1;
		break;
		case 2:
		senddata(2);
		counter=counter*10+2;
		break;
		case 3:
		senddata(3);
		counter=counter*10+3;
		break;
		case 4:
		senddata(4);
		counter=counter*10+4;
		break;
		case 5:
		senddata(5);
		counter=counter*10+5;
		break;
		case 6:
		senddata(6);
		counter=counter*10+6;
		break;
		case 7:
		senddata(7);
		counter=counter*10+7;
		break;
		case 8:
		senddata(8);
		counter=counter*10+8;
		break;
		case 9:
		senddata(9);
		counter=counter*10+9;
		break;
		case 10:
		for(i=0;i<8;i++)
		senddata(10);
		counter=0;
		counter_save=0;
		break;
		case  11:
		for(i=0;i<8;i++)
		senddata(10);//清除屏幕
		if(XFLAG==0)//查询是加法还是减法
		counter_save=counter_save+counter;
		if(XFLAG==1)
		counter_save=counter_save-counter;
		counter=counter_save;
		for(i=0;i<8;i++)
			{
				cosave[i]=(counter_save%10);
				counter_save/=10;
			}
				for(i=7;i>=0;i--)
					{
						if(cosave[i]>0)
							{
								a=i;
								break;
							}
					}	
								for(;a>=0;a--)
								{							
									senddata(cosave[a]);
								}
					break;
					case 12:
					XFLAG=0;
					counter_save=counter;//保存加数
					counter=0;//清除原来计数用来记录下一个输入的加数
					for(i=0;i<8;i++)
					senddata(10);//清除屏幕以便显示下一个加数
					break;
					case 13:
					XFLAG=1;//减法标志位有效
					counter_save=counter;//保存被减数
					counter=0;//清除计数用来储存减数
					for(i=0;i<8;i++)
					senddata(10);//清除屏幕用来显示下一个减数
					break;
					case 14:
					for(i=0;i<8;i++)
					senddata(10);//清除屏幕可以显示以下的数据
					counter=counter*10+1;
					counter_save=counter;
					for(i=0;i<8;i++)
					{
						cosave[i]=counter_save%10;
						counter_save/=10;
					}
						for(i=7;i>=0;i--)
							{
								if(cosave[i]>0)
								{
									a=i;
									break;
								}
							}
									for(;a>=0;a--)
										{
											senddata(cosave[a]);
										}
											break;
							
							case 15:
							for(i=0;i<8;i++)
							senddata(10);//清除屏幕可以显示以下的数据
							counter=counter*10-1;
							counter_save=counter;
							for(i=0;i<8;i++)
							{
								cosave[i]=counter_save%10;
								counter_save/=10;
							}
								for(i=7;i>=0;i--)
								{
									if(cosave[i]>0)
										{
											a=i;
											break;
										}

								}
									for(;a>=0;a--)
										{
											senddata(cosave[a]);
										}
										break;
	}
}

 //----------------------------主函数--------------------------------------
 void main(void)
 {	
	counter=0;
	counter_save=0;
	for(k=0;k<8;k++)
	senddata(10);
 	while(1)
	{
 	
 		keyvalue=keyscan();
    	if(keyvalue>=0&&keyvalue<=15)
		keyprocess(keyvalue);
		delay(600);
	}
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -