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

📄 kbsub.c

📁 这是我做课程设计时自己做的,用摩托罗位的飞思卡尔单片机做的,包括了对键盘复键的处理
💻 C
字号:
#include "KeyBoard_define.h"
//#include "stdio.h"


/*-----------------------------------------------------*
*文件描述:本文件包含了H08C键盘中断子函数,分别为:       *  
*(1)KB_Init:键盘初始化函数                             *
*   void KB_Init(void)                                 *
*(2)KB_Scan:扫描读取键值函数                           *
*   unsigned char KB_Scan(void)                        *
*(3)KB_Def:键值转为定义值函数                          *
*   unsigned char KB_Def(unsigned char KB_valve)       *
*-----------------------------------------------------*/
/*[以下为子程序源代码]*/
/*[头文件]*/
#include "GP32C.H"
#include "KB.h"
/*KB_Init:键盘初始化函数-------------------------------*
*功  能:初始化键盘中断的引脚,但未开放键盘中断         *
*参  数:无                                             *
*返  回:无                                             *
*-----------------------------------------------------*/  
void KB_Init(void)
{
	 KB_P=0x00;             //复位KB_P
	 KB_D=0b00001111;       //定定义7-4为输入,3-0为输出
	 KB_PUE=0b11110000;     //定义输入引脚有内部上拉电阻
	 //INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
	 //INTKBIER=0b11110000;   //允许输入引脚的中断可进入
	 //INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
}
/*KB_Scan:扫描读取键值函数-----------------------------*
*功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
*         若无按键,*p为0xff                           *
*参  数:无                                             *
*返  回:扫描到的键值                                   *

/*----------------------------------------------------*/  
unsigned char KB_Scan(void) 
 {
	 unsigned char line,i,tmp,tmp_beta,trap_in_tmp;
	 trap_in_tmp=1;
     line=0b11111110;        //使第一根行线为0(低电平)
	 for(i=1;i<4;i++)         //将扫描4根行线
	  {	
        tmp=KB_P;            //取KB_P->tmp
        tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
        KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	    asm("NOP");            //等待,消除按键抖动
	    asm("NOP");
	    tmp=KB_P;
	    tmp&=0b11110000;       //看第n行是否有键按下
	    if(tmp!=0xf0)          //本行有键按下
	     {	
	     	trap_in_tmp=0; 
            tmp=KB_P;
            tmp=KB_Def(tmp);
            //printf("%c key value is pressed\r\n",tmp); 
		    break;
	     }
	     else                  //本行无键按下,扫描下一行
		    line=(line<<1)|0x01; 
	 }
	 
	 /************************************补扫第四行有没有按键按下***********************************/
	
	 if(1)
	 {
	 	line=0b11110111;
	 	tmp_beta=KB_P;            //取KB_P->tmp
        tmp_beta|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1.
        KB_P=tmp_beta&line;       //令KB_P.3=0
	    asm("NOP");            //等待,消除按键抖动
	    asm("NOP");
	    tmp_beta=KB_P;
	    tmp_beta&=0b11110000;       //看第4行是否有键按下
	    if(tmp_beta!=0xf0)          //Y
	    {
	    	trap_in_tmp=0;
	    	tmp_beta=KB_P;
	    	tmp_beta&=0b11110000; 
	    	if(tmp_beta==0xe0)   //"L" key is be pressed!!!
	    	{
	    		//printf("L key is be pressed!!!\r\n");
	    		switch(tmp)
	    		{
	    			case '1':return L1;break;
	    			case '2':return L2;break;
	    			case '3':return L3;break;
	    			case '4':return L4;break;
	    			case '5':return L5;break;
	    			case '6':return L6;break;
	    			case '7':return L7;break;
	    			default:return 0xff;break;
	    		}
	    	}
	    	if(tmp_beta==0xd0)     //"H" key is be pressed!!!
	    	{
				//printf("H key is be pressed!!!\r\n");
	    		switch(tmp)
	    		{
	    			case '1':return H1;break;
	    			case '2':return H2;break;
	    			case '3':return H3;break;
	    			case '4':return H4;break;
	    			case '5':return H5;break;
	    			case '6':return H6;break;
	    			case '7':return H7;break;
	    			default:return 0xff;break;
	    		}
	    	}
	    } 
	     
	 }	
	
	 /************************************补扫第四行结束***************************************/
	 
	 /*****************************************************************************************/
	 /***************************以下为组合键时的补丁程序**************************************/
	 /*************解决了引导键与功能键同一列时扫不到键的BUG***********************************/
	 /****************至于BUG的原因初步认为是I/O口输出低时的内阻比上拉电阻的阻值大造成的*******/
	 /**********************如有问题可交流sam1985317@163.com******QQ:157871537*****************/
	 /***********************作者:叶金才 *****************************************************/  
	 if(trap_in_tmp)
	 {
	 	//printf("Trap in patch!!!\r\n"); 
	 	KB_D=0b00000111;       //定定义7-3为输入,2-0为输出
	 	KB_PUE=0b11111000;     //定义输入引脚有内部上拉电阻
	 	line=0b11111110;        //使第一根行线为0(低电平)
	 	for(i=1;i<4;i++)         //将扫描3根行线
	  	{	
	  	
        	tmp=KB_P;            //取KB_P->tmp
        	tmp|=0b00000111;     //KB_P.7-3保留,KB_P.2-0为1
        	KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2
	    	asm("NOP");            //等待,消除按键抖动
	    	asm("NOP");
	    	tmp=KB_P;
	    	tmp&=0b11111000;       //看第n行是否有键按下
	    	if(tmp!=0xf8)          //本行有键按下
	     	{
	     		//printf("Trap in patch&&tmp!!!\r\n");  
	        	KB_D=0b00001111;       //恢复初始设置
	 			KB_PUE=0b11110000;     
	     		if(tmp==0xe0)          //L和L所在的列的其它键有同时按下!!!!
	     		{
	     			switch(i)
			    	{
						case 1:return L1;break;
						case 2:return L4;break;
						case 3:return L7;break;
			    	}
	     		}
	     		if(tmp==0xd0)          //H和H所在的列的其它键有同时按下!!!!
	     		{
	     			switch(i)
			    	{
						case 1:return H2;break;
						case 2:return H5;break;
			    	}
	     		}
			
	     	}
	     	else                  //本行无键按下,扫描下一行
		    line=(line<<1)|0x01;
	  	}
	 }
	  /**********************************补丁程序在此结束********************************/
	  if((i==5)||(i==4))
	    return 0xff;
	  else
	  	return tmp;
 }
/*KB_Def:键值转为定义值函数----------------------------*
*功  能:键值转为定义值                                 *
*参  数:键值                                           *
*返  回:键定义值                                       *
*-----------------------------------------------------*/
//键盘定义表
const unsigned char KB_Table[]= 
{0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
 0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
 0x00};
unsigned char KB_Def(unsigned char KB_valve)
 {
   unsigned char KeyPress;
   unsigned char i;
   unsigned char j;
   i=0;
   while(1)
   {
     j=KB_Table[i];
     //与0(定义表结束标志)相比较
     if (j==0)                   //=0,即表中无次定义值
        {KeyPress=0xff; break;}  //返回0xff
     else
        //与键值相比较
        if (j==KB_valve)         //找到       
           {KeyPress=KB_Table[i+1];break;} //取键定义值
        else
           i+=2;              //指向下一个键值,继续判断
    };
    return KeyPress;
 } 

  

⌨️ 快捷键说明

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