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

📄 shumaguan3.c

📁 通过对键盘的编程
💻 C
字号:
/**********************************************************************
**文件名:shumaguan.c												 **
**功能:实现键盘、数码管显示,实现计算器功能						 **
**创建人:xingyuegu													 **
**日期:2006-9-10													 **
**版本:1.0															 **
**修改日期:2006-10-17												 **
**版本:2.0															 **
**修改日期:2006-11-1												 **
**版本:3.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 int process(unsigned char );
void init(void);

/**********************************************************************
**								变量定义							 **
**********************************************************************/
unsigned int result=0;
unsigned int currentvalue=0,lastvalue;
unsigned char lastop;
volatile bit flag=0;
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;
  	init();
		 while(1)
	 	{
			 if(flag)
			{
				kvalue=key_scan();
				init();
				flag=0;
				if(kvalue!=0)
				result=process(kvalue);
			} 
				if(result<=9999)
				{
  					display(result);
					
				}
				else
				{
					display(0);
				
				}
			
		}

}
/**********************************************************************
**函数功能:初始化函数(包括中断初始化)						 	 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/
void init(void)
{
	//SP=0x50;
	EA=1;
	EX0=1;
	IT0=1;
	P1=0xf0;
}
/**********************************************************************
**函数功能:中断服务子程序										 	 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/

void int0_isr(void) interrupt 0 using 1
{

	if(!flag)
	{
		EX0=0;
		flag=1;
	}

	
}
/**********************************************************************
**函数功能:键值处理函数(处理+.-.*./.=)								 **
**参数:字符型														 **
**返回:整型														 **
**********************************************************************/
unsigned int process(unsigned char kvalue)
{

			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=result;//当前值成为上次值
					  currentvalue=0;		   //当前值清0
				}
					else if(kvalue=='-')
					{
						lastop=kvalue;
					  	lastvalue=result;
					  	currentvalue=0;
					}
						else if(kvalue=='*')
						{
							lastop=kvalue;
					  		lastvalue=result;
					  		currentvalue=0;
						}
							else if(kvalue=='/')
							{
								lastop=kvalue;
					  			lastvalue=result;
					  			currentvalue=0;
							}										

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

									}
							}
	if(result>9999)
	{
		result=0;
		currentvalue=0;
	}
	return result;
}

								

/**********************************************************************
**函数功能:判断按键的键值是功能键还是数字键						 **
**参数:整型数														 **
**返回: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=0xf0;
	if((P1&0xf0)!=0xf0)
	{
		delay(10);
		P1=0xf0;
		if((P1&0xf0)!=0xf0)
		{			
			
			delay(10);
			for(line=0;line<4;line++) //进行行扫描
			{
				a=temp<<line;
		 		b=temp>>(8-line);
		 		P1=a|b;
				P1=P1&0x0f;
				P1=P1|0xf0;
		 		kvalue=P1&0xf0;
		 		if(kvalue!=0xf0)
		 		break;
			}
		
			P1=P1&0x0f;
			P1=P1|0xf0;
			P1=0xf0;
			while((P1&0xf0)!=0xf0)  //判断键弹起
			{		
			}
	
			if(kvalue==0xe0) //确定是第几列
			row=0;
			else if(kvalue==0xd0)
				row=1;
				else if(kvalue==0xb0)
					row=2;
					else  if(kvalue==0x70)
						 row=3;
						 else 
						 return 0;
			P1=0xf0;
			return keyvalue[line][row];
		}
	
	
	}
	P1=0xf0; 
	return 0;
}	

/**********************************************************************
**函数功能:在数码管上显示数据										 **
**参数:整型数														 **
**返回:无															 **
**********************************************************************/
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 + -