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

📄 keyboard.c

📁 单片机计算器,可计算多位小数点的+-*/.可在lcd上显示
💻 C
字号:
/*+++++++++++++++++++++++++++++++++++++++++++++++++++/
 程序名 :KeyBoard.c 键盘扫描子程序
 入口:
 出口:键盘值
+++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include "CPLD.h"

//===============================================
unsigned  char idata ucKeyState;
 float p1; 
float p2; 
 
float *p=&p1;
unsigned char idata op;
int flag=1;//控制小数点个数

float f1;
float f2;


 
 void ISR_int1(void) interrupt 2 using 0          
{ 
	 					//ucSKey初始化

 unsigned int  uiI;
 unsigned char ucLcdPosX;
 unsigned char ucLcdPosY;
 
 for (uiI=0;uiI<10000;uiI++);    
                             //延时,去掉抖动 
if(INT1==1) goto end01;                     //读入int0,
                                           //关闭外部中断
 for (uiI=0;uiI<10000;uiI++); 
                //延时,去掉抖动 ;                           
//ucSKey=GetKey();
ucKeyState=GetKey();
						   //按键所对应的符号first=first&ucKeyState;
while(INT1==0);  

                              //按键是否弹起
if(ucLcdPosY==16||ucLcdPosY==32)

	{
	ucLcdPosX^=1,ucLcdPosY=0;
	
	}
	
	


 //按下后显示按键所对应的单个字符
if(ucKeyState!='=')
 
	{
		if(ucKeyState>='0'&&ucKeyState<='9')  //如果用户输入的字符是数字,那么就把对相应的操作数进行处理 
			{ 
			if(ucLcdPosY==16||ucLcdPosY==32)

	                 {
	                      ucLcdPosX^=1,ucLcdPosY=0;
	
                       	}
				DispOneChar(ucLcdPosX,ucLcdPosY++,ucKeyState);
			
				
				(*p)=(*p)*f1+(ucKeyState-'0')/f2; 
				//'0'的意思是把用户输入的字符转变为对应的数字,如果用户没有输入小数点,那么f1=10,f2=1,否则f1=1,f2的值会每次都改变。 
				f2=((f2-1)<1)?1:(f2*10); 

			} 
                 	//用户输入的不是数字,则可能是小数点或者运算符 
			 
				else if(ucKeyState=='.'&&flag) //是小数点,那么改变状态变量,准备接受操作数的小数部分 
					{ 
						flag=0;
						f1=1; 
						f2=10;																			
					if(ucLcdPosY==16||ucLcdPosY==32)

	                      {
                              	ucLcdPosX^=1,ucLcdPosY=0;
	
                            	}
						DispOneChar(ucLcdPosX,ucLcdPosY++,ucKeyState);		
								
							//	DispOneChar(ucLcdPosX++,ucLcdPosY,'.');
								

					} 
			else if(ucKeyState=='+'||ucKeyState=='-'||ucKeyState=='*'||ucKeyState=='/') // 是操作符,把操作符保存在变量o里,同时改变指针p指向的变量,准备接受第二个操作数,并把状态变量设为始值 
					
					{ 
						flag=1;
						op=ucKeyState;
						
						p=&p2; 
						
						f1=10; 
						f2=1; 
						
						cls();
						
						ucLcdPosX=0,ucLcdPosY=0;
						
					} 
				else if(ucKeyState=='a')
						{
							flag=1;
							
							cls();
							p1=0,p2=0,p=&p1;
							f1=10;f2=1;
							ucLcdPosY=0;
						}

			
              }

//NextPos();
                                  
end01:;
}

unsigned char GetKey(void)
{
   
unsigned char kc,ucRetKc;
unsigned char m;
m=1;
ucRetKc=XBYTE[0x8000]& 0x0f;
if(ucRetKc!=0x0f)
while(m<=0x10){
if(m==0x01)ucRetKc=XBYTE[0x80f7]&0x0f;
if(m==0x02)ucRetKc=XBYTE[0x80ef]&0x0f;
if(m==0x04)ucRetKc=XBYTE[0x80df]&0x0f;
if(m==0x08)ucRetKc=XBYTE[0x80bf]&0x0f;
if(m==0x10)ucRetKc=XBYTE[0x807f]&0x0f;
if(ucRetKc!=0x0f)
{ucRetKc=ucRetKc<<4;
kc=ucRetKc+m;
goto end00;}
m*=2;} 
end00:
      
switch (kc)					//按键所在的具体位置对应于相应的符号
  {
   case 0xE1: kc='+' ;
   break;
   case 0xD1: kc='9' ;
   break;
   case 0xB1: kc='8' ;				 //---   +  9  8  7   ---	
   break;
   case 0x71: kc='7';					 //---   -  6  5  4   ---	 
   break;
   case 0xE2: kc='-' ;				 //---   *  3  2  1   ---	
   break;
   case 0xD2: kc='6' ;				  //---   / =  .  0   ---	 
   break;
   case 0xB2: kc='5' ;
   break;				  
   case 0x72: kc='4' ;
   break;
   case 0xE4: kc= '*';
   break;
   case 0xD4: kc= '3';
   break;
   case 0xB4: kc='2' ;
   break;
   case 0x74: kc='1' ;
   break;
   
   case 0xE8: kc='/' ;
   break;
   case 0xD8: kc='=' ;
   break;
   case 0xB8: kc= '.';
   break;
   case 0x78: kc='0' ;
   break;
case 0xF0: kc='a' ;
   break;
case 0xE0: kc='b' ;
   break;
case 0xC0: kc='c' ;
   break;
case 0x80: kc='d' ;
   break;
   default: kc='q';
  }

   return kc;

}

⌨️ 快捷键说明

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