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

📄 shumaguan2.c

📁 单片机开发液晶显示万年历计算器电子琴电子音乐字母输入
💻 C
字号:
/**********************************************************************
**文件名:shumaguan2.c												 **
**功能:实现键盘、数码管显示,实现计算器功能						 **
**创建人:xingyuegu													 **
**创建日期:2006-9-10												 **
**版本:1.0															 **
**修改日期:2006-10-17												 **
**版本:2.0															 **
**********************************************************************/
#include <reg52.h>
#include <lcd.h>
#define uchar unsigned char
#define uint unsigned int

/**********************************************************************
								变量定义							 
**********************************************************************/
unsigned char lastop;
unsigned long result=0;
unsigned long currentvalue=0,lastvalue=0;
code ksp[8]={0x8F,0x9F,0xAF,0xBF,0xCF,0xDF,0xEF,0xFF}; 
/****************************************************************************
 数组功能:定义	 按键按下时 P2口的数据
****************************************************************************/
code key_code1[32]={142,206,174,238,158,222,190,254,
                    141,205,173,237,157,221,189,253,
				    139,203,171,235,155,219,187,251,
				   	135,199,167,231,151,215,183,247};
unsigned  char code keyvalue[]=
{
'7','8','9','/',
'4','5','6','*',
'1','2','3','-',
'o','0','=','+'
};
uchar code letter_logo[10][16]={
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
/**********************************************************************
**								函数申明							 **
**********************************************************************/

void display(unsigned long);

unsigned char key_scan(void);
unsigned char transition(unsigned char);
bit isdigit(unsigned char );
unsigned int process(unsigned char );
uchar input();
/**********************************************************************
**函数功能:主函数										 			 **
**参数:无														 	 **
**返回:无															 **
**********************************************************************/
void main()
{
  unsigned char kvalue,temp;
  Lcd_Initial();
  Delay(500);
  Lcd_Clear();   
		 while(1)
	 	{	
			temp=input();
			kvalue=keyvalue[temp];
			if(kvalue!=0)
			result=process(kvalue);
			kvalue=0;
			if(result<=999999999)
				{
  				display(result);	
				}
			else
				{
				display(0);
				}						
		} 
		
}				
/**********************************************************************
**函数功能:键值处理函数(处理+.-.*./.=)								 **
**参数:字符型														 **
**返回:整型												         **
**********************************************************************/
unsigned int process(unsigned char kvalue)
{		   
           

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

					  			else if(kvalue=='=')	 //如果是“=”
					  			{	
									Lcd_Clear();
									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;
										}
										default:
											break;
									}								
							}
	if(result>999999999)
	{
		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;
}
/******************************************************************************
* 函数名称

⌨️ 快捷键说明

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