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

📄 shumaguan.c

📁 通过对键盘的编程
💻 C
字号:
/**********************************************************************
**文件名:shumaguan.c												 **
**功能:实现键盘、数码管显示,实现计算器功能						 **
**创建人:xingyuegu													 **
**日期:2006-9-10													 **
**版本:1.0															 **
**********************************************************************/

#include <reg51.h>

/**********************************************************************
**								函数申明							 **
**********************************************************************/

void delay(unsigned int);
void display(int );
unsigned char key_scan(void);
unsigned char transition(unsigned char);
void time_set();
void time0_int();
bit isdigit(unsigned char );

/**********************************************************************
**								变量定义							 **
**********************************************************************/
unsigned char keyreturnvalue=0;
bit flag;

int code num_tab1[4]=
{0x88,0x84,0x82,0x81}
;
int code num_tab2[11]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}
;
unsigned  char code keyvalue[][4]={
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'o','0','=','+'}
};
/**********************************************************************
**函数功能:主函数										 			 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/
void main()
{
  unsigned char kvalue,lastop,flag=0;
  unsigned int currentvalue=0,lastvalue,result=0;	
 	 lastvalue=0;
	 while(1)
	 	{
		
			kvalue=key_scan();
			if(isdigit(kvalue)&&!flag)	  //如果是数字,求值
				{
					currentvalue=transition(kvalue)+currentvalue*10;
				 	result=currentvalue;
					

				 }
			else						   //如果是功能键
				if(kvalue=='o')			   //如果是ON/C,清0
					 {
					 	result=0;
						currentvalue=0;
						lastvalue=0;
					}
					else if(kvalue=='+')	  //如果是“+”
					  {
					  		lastop=kvalue;	   //lastop保存操作码
					  		lastvalue=currentvalue;//当前值成为上次值
					  		currentvalue=0;		   //当前值清0
						}
							else if(kvalue=='-')
								{
									lastop=kvalue;
					  				lastvalue=currentvalue;
					  				currentvalue=0;
								}
									else if(kvalue=='*')
									{
										lastop=kvalue;
					  					lastvalue=currentvalue;
					  					currentvalue=0;
									}
										else if(kvalue=='/')
										{
											lastop=kvalue;
					  						lastvalue=currentvalue;
					  						currentvalue=0;
										}										

					  						else if(kvalue=='=')	 //如果是“=”
					  							{	
													switch(lastop)	  //判断操作码是什么
													{
														case '+':
														{
															result=result+lastvalue;
															currentvalue=result;
															break;
														}
														case '-':
														{
															result=lastvalue-currentvalue;
															currentvalue=result;
															break;
														}
														case '*':
														{
															result=currentvalue*lastvalue;
															currentvalue=result;
															break;
														}
														case '/':
														{
															result=lastvalue/currentvalue;
															currentvalue=result;
															break;
														}
													}
												}
							
				if(result<=9999)
				{
  					display(result);
					
				}
				else
				{
					display(0);
					result=0;
						currentvalue=0;
				}
			
		}

 
 
}
/*void time0_int() interrupt 1 using 2
{
	
	unsigned char i=0;
	TR0=0;
	
		keyreturnvalue=key_scan();
	
	time_set();
}

void time_set(void)
{
	TMOD=TMOD&0xf0;
	TMOD=TMOD|0X01;;
	TH0=15535/255;
	TL0=15535%255;
	EA=1;
	ET0=1;
	TR0=1;
} */
/**********************************************************************
**函数功能:判断按键的键值是功能键还是数字键						 **
**参数:整型数														 **
**返回:BOOL型														 **
**********************************************************************/
bit isdigit(unsigned char kvalue)
{
	if(kvalue>='0'&&kvalue<='9')
	return 1;
	else 
	return 0;
}
/**********************************************************************
**函数功能:把数字的ASCII转换成整型									 **
**参数:整型数														 **
**返回:整型														 **
**********************************************************************/
unsigned char transition(unsigned char kvalue)
{
	if(kvalue>='0'&&kvalue<='9')
		return (kvalue-'0');
	else
		return 0;
}
/**********************************************************************
**函数功能:键盘扫描功能										 	 **
**参数:无														 	 **
**返回:返回键值													 **
**********************************************************************/
unsigned char key_scan(void)
{
	unsigned char line,row,temp,a,b,kvalue;
	temp=0xfe;
	flag=0;
	P1=0xff;

	for(line=0;line<5;line++) //进行行扫描
	{
		 a=temp<<line;
		 b=temp>>(8-line);
		 P3=a|b;
		 kvalue=P1&0x0f;
		 if(kvalue!=0x0f)	  //去除键抖动
		 delay(100);
		 kvalue=P1&0x0f;
		 if(kvalue!=0x0f)
		 	break;
	}
	while(P1!=0x0ff)  //判断键弹起
	{	
	}
	if(kvalue==0x0e) //确定是第几列
		row=0;
	else
		if(kvalue==0x0d)
			row=1;
		else 
			if(kvalue==0x0b)
				row=2;
			else
				if(kvalue==0x07)
					row=3;
				else 
					return 0;
	P3=0xff;
	
	return keyvalue[line][row];
}	

/**********************************************************************
**函数功能:在数码管上显示数据										 **
**参数:整型数														 **
**返回:无															 **
**********************************************************************/
void display(int disnum)
{
	int ge,shi,bai,qian,i,j;
	int num[5]={0,0,0,0,10};
	if(disnum<9999)
	{
		ge=disnum%10;
		shi=(disnum%100)/10;
		bai=(disnum/100)%10;
		qian=disnum/1000;
		num[0]=ge;
		num[1]=shi;
		num[2]=bai;
		num[3]=qian;
		if(qian!=0)
		{
			for(i=0;i<4;i++)
			{
				
				P2=num_tab1[i];		   //先送位码
				P0=num_tab2[num[i]];   //再送段码
				delay(1);
			}
		}
		else
		{
			if(bai!=0)
			{
				for(i=0;i<3;i++)
				{
					
					P2=num_tab1[i];
					P0=num_tab2[num[i]];
					delay(1);
				}
			}
			else
			{
				if(shi!=0)
				{
					for(i=0;i<2;i++)
					{
						
						P2=num_tab1[i];
						P0=num_tab2[num[i]];
						delay(1);
					}
				} 	
				else
				{
					for(i=0;i<1;i++)
					{
						for(j=0;j<4;j++)
						{
							if(j==0)
							{
								
								P2=num_tab1[j];
								P0=num_tab2[num[i]];
								delay(1);
							}
							else
							{
								
								P2=num_tab1[j];
								P0=num_tab2[num[4]];
								delay(1);
							}
						}
					}
				}
			}
		}
	}
	else
	;
}
/**********************************************************************
**函数功能:延时时间										 		 **
**参数:整型数														 **
**返回:无															 **
**********************************************************************/	
void delay(unsigned int time)
{
	int i;
	int k;
	for(i=0;i<time;i++)
	for(k=0;k<100;k++);
}

⌨️ 快捷键说明

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