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

📄 shumaguan4.c

📁 串行口的设计
💻 C
字号:
/**********************************************************************
**文件名:shumaguan4.c												 **
**功能:实现键盘(或串口输入)、数码管显示,实现计算器功能			 **
**创建人:xingyuegu													 **
**创建日期:2006-9-10												 **
**版本:1.0															 **
**修改日期:2006-10-17												 **
**版本:2.0															 **
**修改日期:2006-10-20												 **
**版本:3.0															 **
**修改日期:2006-10-27												 **
**版本:4.0															 **
**********************************************************************/

#include <reg51.h>

#define uchar unsigned char
#define uint  unsigned int

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

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);
void Int_UART(void);


/**********************************************************************
**								变量定义							 **
**********************************************************************/
unsigned int result=0;
unsigned int currentvalue=0,lastvalue;
unsigned char lastop;
volatile bit flag=0; 
unsigned char keyvalue;	  	
uchar *TX232,*RX232;
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 keypadvalue[][4]={
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'o','0','=','+'}
};
/**********************************************************************
**函数功能:主函数										 			 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/
void main()
{

	uchar *str="Please collect operation mode :1 (pc) ,2 (not for pc)\n";
  	init();
	Int_UART();
	TX232=str;
	SBUF=*TX232;	
		 while(1)
	 	{
			if(keyvalue=='1')
			{
				while(1)
				{

			 		if(flag)
					{
				
						keyvalue=key_scan();  
						init();	
						flag=0;
						//if(keyvalue!=0)
						result=process(keyvalue);
					}
					if(result<=9999)
					{
  						display(result);
					
					}
					else
					{
						display(0);
				
					}
				}
			}
			else if(keyvalue=='2')
			{	
				keyvalue=0;
				while(1)
				{
					if(flag)
					{				
						init();	
						flag=0;
						//if(keyvalue!=0)
						result=process(keyvalue);
					}
					if(result<=9999)
					{
  						display(result);
					
					}
					else
					{
						display(0);
				
					}
				}
			} 								
				
			
		}

}

/**********************************************************************
**函数功能:初始化函数(包括中断初始化)						 	 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/
void init(void)
{
	EA=1;
	EX0=1;
	IT0=1;
	P1=0xf0;
}
/**********************************************************************
**函数功能:初始化串口函数(包括波特率设置)						 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/
void Int_UART(void)
//功能:	串口初始化
{
	SCON = 0x50 ; 	//SCON: serail mode 1, 8-bit UART, enable ucvr  
	TMOD |= 0x20 ; 	//TMOD: timer 1, mode 2, 8-bit reload  
	PCON |= 0x80 ; 	//SMOD=1;  
	TH1 = 0xFA ;	//Baud:4800 fosc=11.0592MHz  
	IE |= 0x90 ;	//Enable Serial Interrupt  
	TR1 = 1 ; 		// timer 1 run  
}
/**********************************************************************
**函数功能:中断服务子程序										 	 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/

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,kvalue1;
	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;
		 		kvalue1=P1&0xf0;
		 		if(kvalue1!=0xf0)
		 		break;
			}
		
			P1=P1&0x0f;
			P1=P1|0xf0;
			P1=0xf0;
			while((P1&0xf0)!=0xf0)  //判断键弹起
			{		
			}
	
			if(kvalue1==0xe0) //确定是第几列
			row=0;
			else if(kvalue1==0xd0)
				row=1;
				else if(kvalue1==0xb0)
					row=2;
					else  if(kvalue1==0x70)
						 row=3;
						 else 
						 return 0;
			P1=0xf0;
			return keypadvalue[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++);
}

/**********************************************************************
**函数功能:串口接收中断中断函数,接收数据							 **
**参数:无															 **
**返回:无															 **
**********************************************************************/	
void Int_Rx(void) interrupt 4 using 2							

{
	
		if(RI)
		{
			RI=0;
			flag=1;
			keyvalue=SBUF;
		

		}
		if(TI)
		{
			TI=0;
			if(*TX232!='\0')
			{
				TX232++;
				SBUF=*TX232;
			}

		}

		
	
}

⌨️ 快捷键说明

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